Vue 深入理解vue中的slot与slot-scope

深入理解vue中的slot与slot-scope
官网插槽
Vue中插槽-----特殊特性slot、slot-scope与指令v-slot的使用方法
Vue的slot-scope的场景的个人理解

总结
  1. .slot插槽(不具名)相当于在子组件中占有一个位置,父组件可以填入文本内容
  2. 具名就是子组件name="xxx"父组件slot=“xxx” 例如:
 <div slot="header">这里是头部</div>
 <slot name="footer"></slot>

3.v-slot使用:v-slot在组件中使用slot进行占位时,也是在slot标签内使用name 属性给slot插槽定义一个名字。但是在html内使用时就有些不同了。需要使用template模板标签,template标签内,使用v-slot指令绑定插槽名,标签内写入需要添加的内容

父组件:
<template v-slot:header>//v-slot指令使用插槽
   <h2>slot头部内容</h2>
</template>
子组件:
 <slot name = "header"></slot>//具名插槽
  1. 作用域插槽(slot-scope使用):
    a、:在组件模板中书写所需slot插槽,并将当前组件的数据通过v-bind绑定在slot标签上。
    b、:在组件使用时,通过slot-scope=“gain”,接收组件中slot标签上绑定的数据。
    c、:通过gain.xxx就可以使用绑定数据了
<body>
   <div id="app">
      <Test>
         <div slot="default" slot-scope="gain">//作用域插槽的用法(slot-scope)
            {{ gain.msg }}   // gain接收slot=default所有数据,这里msg只是其中一个
         </div>
         
      </Test>
   </div>

   <template id="test">
      <div>
         <slot name="default" :msg="msg"> </slot>
         <p>这里是test组件</p>   // 
      </div>
   </template>
</body>
<script>
   new Vue({
      el:"#app",
      components:{
         'Test':{
            template:"#test",
            data(){
               return {
                  msg:"你好"
               }
            },
         }
      }
   })
</script>

5.作用域插槽:v-slot的用法(和slot-scop用法类似)

<body>
   
   <div id="app">
      <Test>
         <template v-slot:header="gain">//v-slot定义作用域插槽
            <div>
                  <h3>slot</h3>
                  <p> {{gain.msg}} </p>
            </div>
         </template>
           
      </Test>
   </div>
   
   <template id="test">
      <div>
         <slot name="header":msg="msg"></slot>
         <p>这里是test组件</p>
      </div>
   </template>
   
</body>
<script>
   Vue.component('Test',{
      template:"#test",
      data(){
         return {
            msg:'这里是头部'
         }
      }
   });

   new Vue({

   }).$mount("#app")
</script>

  1. 解构插槽 Prop
 data(){
   return {
        msg: {
          a: '111'
        },
        msg2: {
          b: '111'
        }
     }
  }
 // 解构插槽 Prop
 <slot name="header":msg="msg" :msg2="msg2"></slot>
 <template v-slot:header="{ msg }">//v-slot定义作用域插槽
    <div>
          <h3>slot</h3>
          <p> {{msg.a}} </p>
    </div>
 </template>
 //你甚至可以定义后备内容,用于插槽 prop 是 undefined 的情形:
 template v-slot:header="{ msg = {a = "222"} }">
    <div>
          <h3>slot</h3>
          <p> {{msg.a}} </p> //undefined 就是222
    </div>
 </template>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章