插槽

作者: 李小白呀 | 来源:发表于2021-07-19 23:11 被阅读0次

    插槽能大大提高组件的可复用能力

    1.匿名插槽

    插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签。

     <div id="app">
        <!-- 这里的所有组件标签中嵌套的内容会替换掉slot  如果不传值 则使用 slot 中的默认值  -->  
        <alert-box>有bug发生</alert-box>
        <alert-box>有一个警告</alert-box>
        <alert-box></alert-box>
      </div>
    
      <script type="text/javascript">
        /*
          组件插槽:父组件向子组件传递内容
        */
        Vue.component('alert-box', {
          template: `
            <div>
              <strong>ERROR:</strong>
            # 当组件渲染的时候,这个 <slot> 元素将会被替换为“组件标签中嵌套的内容”。
            # 插槽内可以包含任何模板代码,包括 HTML
              <slot>默认内容</slot>
            </div>
          `
        });
        var vm = new Vue({
          el: '#app',
          data: {
            
          }
        });
      </script>
    </body>
    </html>
    
    1.1、在子组件中放一个占位符
    
    <template>
        <div>
            <h1>今天天气状况:</h1>
            <slot></slot>
        </div>
    </template>
    <script>
        export default {
            name: 'child'
        }
    
    1.2、在父组件中给这个占位符填充内容
    <template>
        <div>
            <div>使用slot分发内容</div>
            <div>
                <child>
                    <div style="margin-top: 30px">多云,最高气温34度,最低气温28度,微风</div>
                </child>
            </div>
        </div>
    </template>
    <script>
        import child from "./child.vue";
        export default {
            name: 'father',
            components:{
                child
            }
        }
    </script>
    
    1.3、展示效果:
    image.png
    image.png

    2.具名插槽

    • 具有名字的插槽
    • 使用 <slot> 中的 "name" 属性绑定元素
      具名插槽的渲染顺序,完全取决于模板,而不是取决于父组件中元素的顺序
    2.1、子组件的代码,设置了两个插槽(header和footer):
    
    <template>
        <div>
            <div class="header">
                <h1>我是页头标题</h1>
                <div>
                    <slot name="header"></slot>
                </div>
            </div>
            <div class="footer">
                <h1>我是页尾标题</h1>
                <div>
                    <slot name="footer"></slot>
                </div>
            </div>
        </div>
    </template>
     
    <script>
        export default {
            name: "child1"
        }
    </script>
    
    <style scoped>
     
    </style>
    
    2.2、父组件填充内容, 父组件通过 v-slot:[name] 的方式指定到对应的插槽中
    <template>
    <div>
        <div>slot内容分发</div>
        <child1>
            <template slot="header">
                <p>我是页头的具体内容</p>
            </template>
            <template slot="footer">
                <p>我是页尾的具体内容</p>
            </template>
        </child1>
    </div>
    </template>
     
    <script>
        import child1 from "./child1.vue";
     
        export default {
            name: "father1",
            components: {
                child1
            }
        }
    </script>
    <style scoped>
     
    </style>
    
    2.3展示效果:
    image.png

    3.作用域插槽

    • 父组件对子组件加工处理
    • 既可以复用子组件的slot,又可以使slot内容不一致
    3.1应用
    image.png

    props里面封装了.row的方法。

    3.2原理
     <div id="app">
        <!-- 
            1、当我们希望li 的样式由外部使用组件的地方定义,因为可能有多种地方要使用该组件,
            但样式希望不一样 这个时候我们需要使用作用域插槽 
            
        -->  
        <fruit-list :list='list'>
           <!-- 2、 父组件中使用了<template>元素,而且包含scope="slotProps",
                slotProps在这里只是临时变量   
            --->    
          <template slot-scope='slotProps'>
            <strong v-if='slotProps.info.id==3' class="current">
                {{slotProps.info.name}}              
             </strong>
            <span v-else>{{slotProps.info.name}}</span>
          </template>
        </fruit-list>
      </div>
      <script type="text/javascript" src="js/vue.js"></script>
      <script type="text/javascript">
        /*
          作用域插槽
        */
        Vue.component('fruit-list', {
          props: ['list'],
          template: `
            <div>
              <li :key='item.id' v-for='item in list'>
                ###  3、 在子组件模板中,<slot>元素上有一个类似props传递数据给组件的写法msg="xxx",
                ###   插槽可以提供一个默认内容,如果如果父组件没有为这个插槽提供了内容,会显示默认的内容。
                        如果父组件为这个插槽提供了内容,则默认的内容会被替换掉
                <slot :info='item'>{{item.name}}</slot>
              </li>
            </div>
          `
        });
        var vm = new Vue({
          el: '#app',
          data: {
            list: [{
              id: 1,
              name: 'apple'
            },{
              id: 2,
              name: 'orange'
            },{
              id: 3,
              name: 'banana'
            }]
          }
        });
      </script>
    </body>
    </html>
    
    

    相关文章

      网友评论

        本文标题:插槽

        本文链接:https://www.haomeiwen.com/subject/ajrkmltx.html