插槽分两类,默认插槽和具名插槽。通俗理解就是默认插槽是没有名称的插槽,具名插槽是有名称的插槽。
默认插槽
父组件father1 2 3 4 5 6
| <template> <div> <h3>这是父组件</h3> <son>实践默认slot</son> </div> </template>
|
子组件son1 2 3 4 5 6 7
| <template> <div> <h4>这是子组件</h4> <!--默认插槽slot是没有名称的--> <slot></slot> </div> </template>
|
具名插槽
父组件father1 2 3 4 5 6 7 8 9 10
| <template> <div> <h3>这是父组件</h3> <son> <template slot="myslot"> <div>实践具名slot</div> </template> </son> </div> </template>
|
子组件son1 2 3 4 5 6 7
| <template> <div> <h4>这是子组件</h4> <!--具名插槽slot有name属性的--> <slot name="myslot"></slot> </div> </template>
|
作用域插槽
父组件模板的所有东西都会在父级作用域内编译;子组件模板的所有东西都会在子级作用域内编译。
简单的说,就是父组件中不能直接用子组件中定义的data数据。而slot-scope的出现就是解决了这样的问题。
父组件father1 2 3 4 5 6 7 8 9 10 11 12
| <template> <div> <h3>这是父组件</h3> <son> <template slot="myslot" slot-scope="slotProps"> <ul> <li v-for="item in slotProps.data1">{{item}}</li> </ul> </template> </son> </div> </template>
|
子组件son1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <template> <div> <h4>这是子组件</h4> <slot name="myslot" :data1='list'></slot> </div> </template> <script> export default { name:'Son', data(){ return{ list:[ {name:"Tom",age:15}, {name:"Jim",age:25}, {name:"Tony",age:13} ] } } } </script>
|
从子组件传过来的名为data1
值为list
的数据将会被slot-scope
接收作为slotProps
的一个属性,此时slotProps.data1
就是list
的值。
这样我们就可以在父组件中取到子组件的值,并且加以应用了。
使用插槽自定义表格列
scope.row相当于绑定数组中的一个{},拿到当前行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| <template> <el-table :data="tableData" stripe style="width: 100%"> <el-table-column prop="name" label="姓名" width="180"> </el-table-column> <el-table-column label="地址"> <template slot-scope="slotProps"> <span>{{ slotProps.row.address.city }}</span> </template> </el-table-column> </el-table> </template>
<script> export default { data() { return { tableData: [{ name: '王小虎', address: {city: '北京',village: '中关村'} }, { name: '王小虎', address: {city: '北京',village: '中关村'} }] } } } </script>
|