vue封装动态表格方式详解

 更新时间:2022年08月15日 09:49:41   作者:悟空和大王  
这篇文章主要为大家介绍了vue封装动态表格方式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

这里只是提供一种想法并提供一些快速实现,实际这些技巧可以用在很多地方,如:动态表单

实现方式简述

  • 通过json定义要显示的列
  • 通过slot实现自定义列
  • 通过require.context实现组件的自动注册,并通过<components is="xxx"></components>, 调用动态注册的组件

优点:

  • 支持通过slot自定义扩展
  • 支持编写vue文件扩展列的显示方式
  • 支持通过json来控制列顺序和哪些列需要显示哪些不需要
  • 能避免封装的table组件越来越复杂

表格实现:

<template>
  <el-table :data="tableData" style="width: 100%" height="100%">
    <el-table-column
      v-for="column in columnList"
      :key="column.prop"
      v-bind="column.columnAttrs"
    >
      <template slot-scope="scope">
        <slot
          v-if="column.type === 'slot'"
          :name="column.slotName"
          :row="scope.row"
        ></slot>
        <components
          v-else
          :row="scope.row"
          :prop="column.prop"
          :config="column"
          :is="`column-${column.type}`"
        ></components>
      </template>
    </el-table-column>
  </el-table>
</template>
<script>
const modules = {};
// 将当前目录以及子目录中的index.vue自动注册为组件(require.context是webpack提供的,如果是vite要用vite的方式)
const files = require.context("./", true, /index.vue$/);
files.keys().forEach((item) => {
  const name = item.split("/")[1];
  modules[`column-${name}`] = files(item).default;
});
console.log(modules, "modules");
export default {
  name: "CustomTable",
  components: {
    // 组件动态注册
    ...modules,
  },
  props: {
    tableData: {
      type: Array,
      default: () => [],
    },
    columnList: {
      type: Array,
      default: () => [],
    },
  },
};
</script>
<style scoped></style>

func组件

<template>
  <span>{{ config.call(row, config) }}</span>
</template>
<script>
export default {
  name: "ColumnFunc",
  props: {
    config: {
      type: Object,
    },
    row: {
      type: Object,
    },
  },
};
</script>
<style scoped></style>

text组件:

<template>
  <span>{{ row[config.prop] }}</span>
</template>
<script>
export default {
  name: "ColumnText",
  props: {
    config: {
      type: Object,
    },
    row: {
      type: Object,
    },
  },
};
</script>
<style scoped></style>

调用示例

<template>
  <CustomTable :column-list="columnList" :table-data="tableData">
    <template #operate="{ row }">
      <el-button size="small">删除</el-button>
      <el-button size="small" type="primary" @click="onEdit(row)">
        编辑
      </el-button>
    </template>
  </CustomTable>
</template>
<script>
import CustomTable from "@/components/my-table/CustomTable";
export default {
  name: "CustomTableDemo",
  components: {
    CustomTable,
  },
  data() {
    return {
      columnList: [
        {
          type: "text",
          prop: "name",
          columnAttrs: {
            label: "姓名",
            width: "180",
          },
        },
        {
          type: "text",
          prop: "date",
          columnAttrs: {
            label: "日期",
            width: "180",
          },
        },
        {
          type: "func",
          prop: "sex",
          columnAttrs: {
            label: "性别",
          },
          call: (row) => {
            switch (row.sex) {
              case 1: {
                return "男";
              }
              case 2: {
                return "女";
              }
              default: {
                return "未知";
              }
            }
          },
        },
        {
          type: "slot",
          slotName: "operate",
          prop: "operate",
          columnAttrs: {
            label: "操作",
          },
        },
      ],
      tableData: [
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄",
          sex: 1,
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄",
          sex: 2,
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1519 弄",
          sex: 3,
        },
      ],
    };
  },
  methods: {
    onEdit(row) {
      console.log(row);
    },
  },
};
</script>
<style scoped></style>

效果

参考文章

Vue业务组件封装Table表格示例详解

前端框架之封装Vue第三方组件三个技巧

以上就是vue封装动态表格方式详解的详细内容,更多关于vue封装动态表格的资料请关注脚本之家其它相关文章!

相关文章

  • Vue监听页面变化的实现方法小结

    Vue监听页面变化的实现方法小结

    在Vue.js应用开发过程中,监听页面变化是一个非常常见的需求,无论是为了响应用户交互、优化性能,还是实现复杂的业务逻辑,监听页面变化的能力都是不可或缺的,本文将详细介绍如何在Vue项目中实现页面变化监听,需要的朋友可以参考下
    2024-10-10
  • Pinia进阶setup函数式写法封装到企业项目

    Pinia进阶setup函数式写法封装到企业项目

    这篇文章主要为大家介绍了Pinia进阶setup函数式写法封装到企业项目实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Vue.JS入门教程之处理表单

    Vue.JS入门教程之处理表单

    这篇文章主要为大家详细介绍了Vue.JS入门教程之处理表单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Vue (Vuex)中 store 基本用法

    Vue (Vuex)中 store 基本用法

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化,这篇文章主要介绍了Vue 中 store 基本用法,需要的朋友可以参考下
    2023-01-01
  • vue3+element-plus Dialog对话框的使用与setup 写法的用法

    vue3+element-plus Dialog对话框的使用与setup 写法的用法

    这篇文章主要介绍了vue3+element-plus Dialog对话框的使用 与 setup 写法的使用,本文通过两种方式结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Vue中计算属性和监听属性及数据的响应式更新和依赖收集基本原理讲解

    Vue中计算属性和监听属性及数据的响应式更新和依赖收集基本原理讲解

    computed是vue的配置选项,它的值是一个对象,其中可定义多个计算属性,每个计算属性就是一个函数,下面这篇文章主要给大家介绍了关于vue中计算属性computed的详细讲解,需要的朋友可以参考下
    2023-03-03
  • vue 组件间的通信之子组件向父组件传值的方式

    vue 组件间的通信之子组件向父组件传值的方式

    这篇文章主要介绍了vue 组件间的通信之子组件向父组件传值的方式总结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • vue 限制input只能输入正数的操作

    vue 限制input只能输入正数的操作

    这篇文章主要介绍了vue 限制input只能输入正数的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Vue结合后台导入导出Excel问题详解

    Vue结合后台导入导出Excel问题详解

    这篇文章主要介绍了Vue结合后台导入导出Excel问题详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • TinyMCE富文本编辑器在Vue中的使用方式

    TinyMCE富文本编辑器在Vue中的使用方式

    这篇文章主要介绍了TinyMCE富文本编辑器在Vue中的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04

最新评论