【Vue3】如何手写一个可以自定义列的表格table组件

本文介绍了如何在Vue3中利用Vuex存储机制和slot特性,实现类似ElementPlus的可自定义列模板的table组件。开发者通过传递column和tableData,以及利用组件间的通信,实现在table-body中动态渲染自定义列内容。
摘要由CSDN通过智能技术生成

先写一个简单的表格,功能只有传递column和tableData数据。怎么写可以参考一下其他大佬的大佬,思路就是:
写一个类似于vuex的store,存储从table传递过去的tableData和table-column传递过去的column数据。
然后在将table组件分为table-header和table-body两个组件分开处理
(这样逻辑比较清晰)
那怎么手写一个类似于element-plus的可自定义列模板的table组件呢。
首先,复习一下vue3中关于slot的知识点:点击复习
首先在table-column组件setup中获得slots信息,将获得的slots信息传递到定义的store组件中

      let columnConfig = reactive({
        label: props.label,
        prop: props.prop,
        width: props.width,
        isFixed: props.fixed,
        type: props.type,
      })
      if (slots.default) {
        columnConfig.SlotColumn = slots
      }
      const instance = getCurrentInstance()
      instance.parent.ctx.store.commit('insertColumn', columnConfig)

然后在table-body中运用这个信息

      <tr v-for="(item,preindex) in tableData" :key="preindex">
        <td v-for="(column,index) in columns" :key="index"
          <div v-if="!column.SlotColumn">
            {{item[column.prop]}}
          </div>
          <div v-else>
            <component :is="renderSlotColumn(column,item,preindex)"></component>
          </div>
        </td>
      </tr>
//import { h } from 'vue';
 setup() {
      function renderSlotColumn(column, item, preIndex) {
        const scope = {
          row: item,
          index: preIndex
        }
        const SlotNode = h('div', column.SlotColumn.default(scope))
        return SlotNode
      }
      return {
        renderSlotColumn
      }
    }

将数据从slots.default()作为参数穿进去以后,就可以从父组件中访问到传进去的数据了。

如果你想使用第三方的 Vue 3 表格组件来封装一个表格,可以按照以下步骤进行操作: 1. 安装所需的表格组件。以 Element Plus 为例,你可以使用以下命令进行安装: ``` npm install element-plus ``` 2. 在你的 Vue 3 项目中导入并注册表格组件。在你的 main.js 文件中添加以下代码: ```javascript import { createApp } from 'vue'; import ElementPlus from 'element-plus'; import 'element-plus/dist/index.css'; import App from './App.vue'; const app = createApp(App); app.use(ElementPlus); app.mount('#app'); ``` 3. 创建一个新的 Vue 组件,用于封装表格。在这个组件中,你可以使用 Element Plus 提供的 Table 组件。 ```vue <template> <el-table :data="tableData"> <el-table-column v-for="column in tableColumns" :key="column.prop" :prop="column.prop" :label="column.label"> </el-table-column> </el-table> </template> <script> export default { data() { return { tableColumns: [ { prop: 'name', label: 'Name' }, { prop: 'age', label: 'Age' }, { prop: 'city', label: 'City' } ], tableData: [ { id: 1, name: 'John Doe', age: 25, city: 'New York' }, { id: 2, name: 'Jane Smith', age: 30, city: 'San Francisco' }, { id: 3, name: 'Bob Johnson', age: 35, city: 'Los Angeles' } ] }; } }; </script> ``` 在这个示例中,我们使用了 Element Plus 的 Table 组件,并通过 `tableColumns` 和 `tableData` 来动态渲染表格和数据。 你可以根据具体的表格组件的文档和需求,进一步自定义和扩展你的表格组件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值