Vue教程51--具名插槽slot

71 阅读2分钟

具名插槽slot

  • 当子组件的功能复杂时,子组件的插槽可能并非是一个
    • 比如我们封装一个导航栏的子组件,可能就需要三个插槽,分别代表左边、中间、右边
    • 那么,外面在给插槽插入内容时,如何区分插入的是哪一个呢?
    • 这个时候,我们就需要给插槽起一个名字
  • 如何使用具名插槽呢?
    • 非常简单,只要给slot元素一个name属性即可
    • <slot name='myslot'></slot>
  • 我们来给出一个案例:
    • 这里我们先不对导航组件做非常复杂的封装,先了解具名插槽的用法
 <!DOCTYPE html>
 <html lang="en">
 <head>
   <meta charset="UTF-8">
   <title>Title</title>
 </head>
 <body>
 ​
 <div id="app">
 ​
   <my_cpn><span slot="center">waws 就是神!!!</span></my_cpn>
 </div>
 ​
 ​
 <template id="cpn">
   <div>
     <slot name="left"><span>左边</span></slot>
     <slot name="center"><span>中间</span></slot>
     <slot name="right"><span>右边</span></slot>
   </div>
 </template>
 ​
 <script src="../vue.js"></script>
 ​
 <script>
 ​
   const app = new Vue({
     el:"#app",
     data:{
       message:"hello world"
     },
     components:{
       my_cpn:{
         template:"#cpn",
       }
     }
   })
 </script>
 </body>
 </html>

效果如下

编译作用域

  • 在真正学习插槽之前,我们需要先理解一个概念:编译作用域
  • 官方对于编译的作用域解析比较简单,我们自己来通过一个例子来理解这个概念:
  • 我们来考虑下面的代码是否最终是可以渲染出来的:
    • <my-cpn v-show="isShow"></my-cpn>中,我们使用了isShow属性
    • isShow属性包含在组件中,也包含在Vue实例中
  • 答案:最终可以渲染出来,也就是使用的是Vue实例的属性
  • 为什么呢?
    • 官方给出了一条准则:父组件模板的所有东西都会在父级作用域内编译;子组件模板的所有东西都会在子级作用域内编译
    • 而我们在使用<my-cpn v-show="isShow"></my-cpn>的时候,整个组件的使用过程是相当于在父组件中出现的
    • 那么他的作用域就是父组件,使用的属性也是属于父组件的属性
    • 因此,isShow使用的是Vue实例中的属性,而不是子组件的属性
 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
 </head>
 <body>
 ​
 <div id="app">
 ​
     <my_cpn v-show="isShow"></my_cpn>
 </div>
 ​
 ​
 <template id="cpn">
     <div>
         <h2>我是子组件</h2>
         <p>我是内容,哈哈哈</p>
     </div>
 </template>
 ​
 <script src="../vue.js"></script>
 ​
 <script>
 ​
     const app = new Vue({
         el:"#app",
         data:{
             message:"hello world",
             isShow:true
         },
         components:{
             my_cpn:{
                 template:"#cpn",
                 data(){
                     return {
                         isShow:false
                     }
                 }
             }
         }
     })
 </script>
 </body>
 </html>

效果展示

我们上面的div是在Vue实例中,所以使用的也都是Vue实例中的属性和方法。