slot插槽
<body> <script src='https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js'></script> <div id='myApp'> <!-- 在组件标签中间写的内容默认不渲染, 因为这些数据会被传入子组件由子组件渲染, 子组件模板中使用slot标签接收这些数据 --> <my-com>这是子组件</my-com> <!-- 组件标签通过插槽传值,可以传递任意标签结构 --> <my-com> <ul> <li>111</li> <li>222</li> <li>333</li> </ul> </my-com> </div> <!-- 组件模板 --> <template id='myTem'> <div> <!-- slot标签叫做插槽, 可以接收组件标签中间写的数据 --> <slot></slot> <hr> <!-- 每一个slot都会渲染一次插槽数据 --> <slot></slot> </div> </template> <script> Vue.component('myCom', { template: '#myTem', // 组件对象中拿不到slot插槽数据, 无法对插槽数据进行监听和修改 }) new Vue({ el: '#myApp', data: { } }) </script></body>
具名插槽
slot标签添加name属性叫具名插槽, 可以接收slot属性相对应的标签, 具名插槽可实现插槽数据的拆分,并插入不同的位置
<body> <script src='https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js'></script> <div id='myApp'> <my-com> <h1 slot="myName">{{name}}</h1> <h2 slot="myage">{{age}}</h2> </my-com> </div> <!-- 组件模板 --> <template id='myTem'> <div> 父组件中的name: <slot name="myName"></slot> 父组件中的age: <slot name="myage"></slot> </div> </template> <script> Vue.component('myCom', { template: '#myTem', data(){ return{ } } }) new Vue({ el: '#myApp', data: { name : "张三", age: 20 }, created() { // 插槽传值, 父组件数据更新后,子组件会同步更新 setTimeout(() => { this.name = "李四", this.age = 30 }, 1000); }, }) </script></body>