vue3.3更新了generic泛型组件,赶快学起来,更好的封装你的组件把
之前vue3.3的时候写了一篇关于泛型组件的文章,当时的用ref获取组件实例的时候,有点问题。现在出了新的useTemplateRef hook,解决了ref获取不到组件实例的问题。关于泛型组件,可以看上一篇文章,这里不浪费大家的时间了,直接上代码。
泛型组件的意义在于,这个组件是公用的,所以组件props类型不能写死
js
// Table.vue
<template>
<table>
<thead>
<tr>
<th v-for="(item, index) in columns" :key="index">{{ item.title }}</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in dataSource" :key="index">
<td v-for="header in columns">
<slot name="bodyCell" :record="item" :column="header">
{{ item[header.dataIndex] }}
</slot>
</td>
</tr>
</tbody>
</table>
</template>
<script setup lang="ts" generic="T extends object">
defineProps<{
columns: { title: string; dataIndex: keyof T; key: string }[]
dataSource: T[]
}>()
defineExpose({
/** 清除 */
clear() {
console.log('clear')
},
})
</script>
js
//App.vue
<template>
<Table :dataSource="dataSource" :columns="columns" ref="table">
<template #bodyCell="{ record, column }">
<span v-if="column.dataIndex === 'name'">{{ record.name }}</span>
</template>
</Table>
</template>
<script setup lang="ts">
import Table from './components/Table.vue'
import { onMounted, useTemplateRef } from 'vue'
const table = useTemplateRef('table')
interface IDataSource {
key: string
name: string
age: number
address: string
}
interface IColumns {
title: string
dataIndex: keyof IDataSource
key: string
}
const dataSource: IDataSource[] = [
{
key: '1',
name: 'Mike',
age: 32,
address: '10 Downing Street',
},
{
key: '2',
name: 'John',
age: 42,
address: '10 Downing Street',
},
]
const columns: IColumns[] = [
{
title: 'Name',
dataIndex: 'name',
key: 'name',
},
{
title: 'Age',
dataIndex: 'age',
key: 'age',
},
{
title: 'Address',
dataIndex: 'address',
key: 'address',
},
]
onMounted(() => {
table.value?.clear()
})
</script>
完美获取,好,下课。