外观
插槽解决什么问题?
插槽是父组件提供一段模板,由子组件决定放在哪。子组件管结构和行为,父组件管这块区域里具体渲染什么。需要子组件把数据交回这段模板时,用作用域插槽。
原理
默认插槽接收父组件写在标签之间的内容。具名插槽用 <template #header> 区分位置。子组件用 <slot name="header"> 标出出口,并可以写后备内容。
作用域插槽里,子组件把对象传给插槽,父组件的模板参数接收它:
vue
<slot :item="item" />vue
<List v-slot="{ item }">{{ item.name }}</List>这和 props 的方向相反:数据从子到父的模板,但渲染仍发生在父组件的作用域里,父组件能访问自己的变量。
插槽内容的样式和数据属于父组件。不要假设子组件能用选择器随便改到插槽里的结构。
追问
和 props 怎么选?
内容是文本、配置、回调,用 props。内容是一段结构不固定的标记,用插槽。既要结构自由、又要用到子组件内部的行数据,用作用域插槽。
v-slot 能写在组件上吗?
只有默认插槽时可以写在组件标签上。有多个具名插槽时,用内部的 template。
易错点
- 子组件把插槽内容再包一层之后,父组件的布局假设失效。出口的结构要稳定。
- 作用域里改子组件传出来的对象,等于改了子组件的状态。
- 用插槽代替本该是数据的列表,父组件不得不知道子组件的内部行结构。