parent.vue
<template>
<div>
<BaseTable :columns="columns" :data-source="data">
<template #bodyCell="{column, record}">
<template v-if="column.key === 'name'">
<a>
{{ record.name }}
</a>
</template>
</template>
</BaseTable>
</div>
</template>
<script setup>
import BaseTable from './BaseTable.vue'
const columns = [{
name: 'Name',
dataIndex: 'name',
key: 'name',
}, {
title: 'Age',
dataIndex: 'age',
key: 'age',
}, {
title: 'Address',
dataIndex: 'address',
key: 'address',
}, {
title: 'Tags',
key: 'tags',
dataIndex: 'tags',
}, {
title: 'Action',
key: 'action',
}];
const data = [{
key: '1',
name: 'John Brown',
age: 32,
address: 'New York No. 1 Lake Park',
tags: ['nice', 'developer'],
}, {
key: '2',
name: 'Jim Green',
age: 42,
address: 'London No. 1 Lake Park',
tags: ['loser'],
}, {
key: '3',
name: 'Joe Black',
age: 32,
address: 'Sidney No. 1 Lake Park',
tags: ['cool', 'teacher'],
}];
</script>
BaseTable.vue
<template>
<a-table>
<template v-for="(item,index) in Object.keys($slots)" v-slot:[item]="scoped" :key="index">
<slot :name="item" v-bind="scoped || {}"></slot>
</template>
</a-table>
</template>
<script setup>
import { useSlots, createApp, h } from 'vue'
const slots = useSlots()
const continer = document.createElement('div')
const prop = {
column:{
key:'name'
},
record: {
name: '名字'
}
}
// 纯粹的vnode
// console.log(h('div',slots.bodyCell))
// vnode挂在到dom上 转成dom
const apps = createApp(slots.bodyCell,prop)
apps.mount(continer)
console.log('con', continer)
</script>
可用于处理想在子组件渲染之前,结合插槽中的内容处理一些逻辑。