首先我先粘出来我写的例子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<!-- 使用table -->
<el-table :data='goods'>
<!-- 注意v-slot后面的插槽名称要使用小写 -->
<template v-slot:tableheader>
标题
</template>
<!-- 下面这些默认在el-table的默认插槽上面 -->
<template v-slot:default="{row}">
<el-col :row-data="row" pro="gid"></el-col>
<el-col :row-data="row" pro="gName"></el-col>
<el-col :row-data="row" pro="price">
</el-col>
<el-col>
<template>
<a :href="`/update/${row.gid}`">修改</a>
<a :href="`/del/${row.gid}`">删除</a>
</template>
</el-col>
</template>
</el-table>
</div>
<!-- el-table 组件 -->
<template id="elTable">
<table>
<caption>
<slot name="tableheader"></slot>
</caption>
<tbody>
<tr v-for="row in data">
<!-- 给插槽传递 插槽prop -->
<template>
<!-- 往插槽的prop当中添加row数据 -->
<slot :row='row'></slot>
</template>
</tr>
</tbody>
</table>
</template>
<!-- el-col组件 作为el-table子组件使用 -->
<template id="elCol">
<!-- 显示label -->
<td>
<slot>{{rowData[pro]}}</slot>
</td>
</template>
</body>
<script src="./vue.js"></script>
<script>
// 传递一个data 以及 列名 以及每列对应的名称和属性即可展示
var elTable = {
template: '#elTable',
props: {
data: Array
}
};
var elCol = {
template: '#elCol',
props: {
rowData: Object,
pro: String
}
};
var vm = new Vue({
el: '#app',
data: {
goods: [
{ gid: 11, gName: '苹果1', price: 100 },
{ gid: 12, gName: '苹果2', price: 100 },
{ gid: 13, gName: '苹果3', price: 100 },
{ gid: 14, gName: '苹果4', price: 100 },
{ gid: 15, gName: '苹果5', price: 100 },
{ gid: 16, gName: '苹果6', price: 100 },
]
},
components: {
elTable,
elCol
}
})
</script>
</html>
效果图
这里面有几个需要注意的地方
1、插槽名称要使用小写
定义插槽时候的插槽名称用小写,才能被正常使用
定义插槽名称为tableHeader
然而v-slot:tableHeader 会被作为html属性转换为v-slot:tableheader 而导致找不到对应插槽
然后我试过使用时候设置为 v-slot:table-header,想着vue可能会自动寻找tableHeader,结果也使用失败,所以记得设置一致而且不能为大写(在.vue组件文件当中好像是不存在这个问题)
2、slot 需要template包裹 且v-slot要在template上面
定义插槽时候,对于在一些特殊标签内部使用slot时候,slot需要用template包裹
下面的这个tr当中如果直接使用slot将报错
(tr直接子元素应该是th或者td)
而下面这个却不会报)
为了避免这个错误,所以我们可以养成编写slot时候习惯性在他的外层包一个template(最终展示时候template也不会在html当中)
使用v-slot时候需要放在template上面
3、插槽props
我们可以给定义的插槽传递数据
这个时候我们可以在使用插槽时候用一个别名变量接收插槽props数据
在slotProps(也就是插槽props)当中就包含了我们传递的row
我们可以通过解构语法获取具体的数据
可以设置默认值(没有接收到row时候将使用默认的值)
4、多次使用同一个插槽时候将覆盖
我们知道使用插槽时候如果没有指定插槽名称,那么这些内容将作为默认插槽的内容
但是如果我们通过v-slot指定使用某个插槽时候,最终该插槽显示的内容将是最后使用插槽的内容,即使插槽名为default
效果
不指定名称
5、后备插槽使用
定义的table 列组件当中默认是使用接受到的prop数据渲染列数据,但是用户可能在这个列并不想渲染数据而是删改操作,所以我们可以将渲染prop数据写为放在插槽里边,而这个插槽就是“后备插槽”,该插槽里边是默认展示内容,当我们传递内容时候将替换该插槽
但是我使用这个elCol组件时候最后一列是想加入操作功能,那我不传递