Vue Hook 封装通用型表格

Vue Hook 封装通用型表格

一、创建通用型表格的需求

实现一个通用型表格组件,具备以下功能:

动态列配置。

分页功能。

排序功能。

可扩展的行操作功能。

二、设计通用型表格组件

首先,需要设计一个基础的表格组件,它接受列配置、数据和分页信息等参数。

1. 创建useTableHook

在src/hooks目录下创建useTable.js文件:

import { ref, reactive, onMounted, toRefs } from 'vue';

export function useTable(fetchData) {

  const state = reactive({

    loading: false,

    data: [],

    pagination: {

      currentPage: 1,

      pageSize: 10,

      total: 0,

    },

    sort: {

      field: '',

      order: '',

    },

  });

  const loadData = async () => {

    state.loading = true;

    const { currentPage, pageSize } = state.pagination;

    const { field, order } = state.sort;

    const result = await fetchData(currentPage, pageSize, field, order);

    state.data = result.data;

    state.pagination.total = result.total;

    state.loading = false;

  };

  const changePage = (page) => {

    state.pagination.currentPage = page;

    loadData();

  };

  const changePageSize = (size) => {

    state.pagination.pageSize = size;

    loadData();

  };

  const changeSort = (field, order) => {

    state.sort.field = field;

    state.sort.order = order;

    loadData();

  };

  onMounted(() => {

    loadData();

  });

  return {

    ...toRefs(state),

    loadData,

    changePage,

    changePageSize,

    changeSort,

  };

}

 

 

2. 创建TableComponent.vue

在src/components目录下创建TableComponent.vue文件:

<template>

  <div>

    <table>

      <thead>

        <tr>

          <th v-for="col in columns" :key="col.key" @click="changeSort(col.key)">

            {{ col.title }}

            <span v-if="sort.field === col.key">{{ sort.order === 'asc' ? '↑' : '↓' }}</span>

          </th>

        </tr>

      </thead>

      <tbody>

        <tr v-for="row in data" :key="row.id">

          <td v-for="col in columns" :key="col.key">{{ row[col.key] }}</td>

        </tr>

      </tbody>

    </table>

    <div class="pagination">

      <button @click="changePage(pagination.currentPage - 1)" :disabled="pagination.currentPage === 1">Previous</button>

      <span>{{ pagination.currentPage }} / {{ Math.ceil(pagination.total / pagination.pageSize) }}</span>

      <button @click="changePage(pagination.currentPage + 1)" :disabled="pagination.currentPage === Math.ceil(pagination.total / pagination.pageSize)">Next</button>

    </div>

  </div>

</template>

<script>

import { ref, onMounted } from 'vue';

import { useTable } from '@/hooks/useTable';

export default {

  props: {

    fetchData: {

      type: Function,

      required: true,

    },

    columns: {

      type: Array,

      required: true,

    },

  },

  setup(props) {

    const { data, loading, pagination, sort, loadData, changePage, changePageSize, changeSort } = useTable(props.fetchData);

    return {

      data,

      loading,

      pagination,

      sort,

      loadData,

      changePage,

      changePageSize,

      changeSort,

    };

  },

};

</script>

<style scoped>

.pagination {

  display: flex;

  justify-content: center;

  margin-top: 10px;

}

</style>

 

三、使用通用型表格组件

在实际项目中,可以这样使用这个通用型表格组件:

1. 创建ExampleTable.vue组件

在src/views目录下创建ExampleTable.vue文件:

<template>

  <div>

    <TableComponent :fetchData="fetchData" :columns="columns" />

  </div>

</template>

<script>

import TableComponent from '@/components/TableComponent.vue';

export default {

  components: {

    TableComponent,

  },

  setup() {

    const columns = [

      { key: 'name', title: 'Name' },

      { key: 'age', title: 'Age' },

      { key: 'email', title: 'Email' },

    ];

    const fetchData = async (page, pageSize, sortField, sortOrder) => {

      // 模拟数据获取

      const total = 100;

      const data = Array.from({ length: pageSize }, (v, i) => ({

        id: (page - 1) * pageSize + i + 1,

        name: `Name ${(page - 1) * pageSize + i + 1}`,

        age: 20 + ((page - 1) * pageSize + i + 1) % 30,

        email: `user${(page - 1) * pageSize + i + 1}@example.com`,

      }));

      return { data, total };

    };

    return {

      columns,

      fetchData,

    };

  },

};

</script>

 

四、解释代码

定义useTableHook:

使用 Vue 的ref和reactive定义表格状态。

定义loadData、changePage、changePageSize和changeSort函数来处理数据加载和分页、排序变化。

使用onMounted生命周期钩子在组件挂载时加载数据。

定义TableComponent组件:

接受fetchData和columns作为组件属性。

使用useTableHook 获取表格数据和操作函数。

渲染表格头部、主体和分页组件,并绑定相关事件。

Vue封装通用表格组件实现增删改查功能是一种常见的开发需求。下面我将用300字回答这个问题。 首先,在Vue中创建一个通用表格组件,可以用来展示数据、实现分页、排序等功能。该组件采用props属性接收传入需要展示的数据数组,并在表格中循环渲染显示。同时,该组件也包含一些相关的方法来支持增删改查功能。 对于数据的增加,可以在表格上方添加一个“新增”按钮,在点击按钮后触发一个对话框组件,用来输入新增的数据。在对话框的确认按钮中,调用父组件传入的一个方法,将新增的数据添加到数据数组中,然后更新表格的显示。 对于数据的删除,可以在表格的每一行数据后面添加一个“删除”按钮。在点击按钮后,调用父组件传入的一个方法,传入当前行的数据索引或ID,然后在父组件中删除该数据,并更新表格的显示。 对于数据的修改,可以在表格的每一行数据后面添加一个“编辑”按钮,在点击按钮后触发一个对话框组件,用来显示当前行的数据并进行编辑。在对话框的确认按钮中,调用父组件传入的一个方法,传入当前行的数据索引或ID和编辑后的数据,然后在父组件中更新该数据,并更新表格的显示。 对于数据的查询,可以在表格上方添加一个搜索框组件,在输入关键字后触发一个方法,传入关键字作为参数进行查询。在父组件中根据传入的关键字来筛选匹配的数据,并更新表格的显示。 以上是对Vue封装通用表格组件实现增删改查功能的简要介绍,具体的实现细节还需要根据具体需求进行定制。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛马程序员24

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值