插槽<slot>
不难理解,就是子组件提供了可替换模板,父组件可以更换模板的内容。
作用域插槽代表性的例子就是列表组件,一个列表组件,写一个props接收数据,然后组织好ul、li标签,写好样式,就像这样
- { {index+1}}、《{ {item.name}}》{ {item.author}}
父组件只需要传入数据即可
生成的效果就是这样的
在其它地方使用这个子组件,生成的效果样式是一样的,如果希望在另一个父组件下有不一样的样式,这个子组件是没法做到的。例如我想让其在另一父组件下时,序号是红色,书名要加粗,作者名字是斜体。 让我们修改一下子组件:
- { {index+1}}、《{ {item.name}}》{ {item.author}}
原来的<li>用插槽<slot>包起来,v-for也与<slot>绑定, 在没有父组件插入内容的情况下默认显示这里<li>的内容。在<slot>上使用v-bind,将index、name、author动态数据传入插槽。 这时父组件这样写:
{ {child.index+1}}、《{ {child.title}}》{ {child.author}}
最里面的template标签相当于父组件重新定义的模板, 通过child这个临时变量,访问插槽里的子组件传入的数据,最后生成的效果:
最后总结一下,作用域插槽给了子组件将数据返给父组件的能力,子组件一样可以复用,同时父组件也可以重新组织内容和样式