vue3 记录slots转vnode

527 阅读1分钟

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>

可用于处理想在子组件渲染之前,结合插槽中的内容处理一些逻辑。