海南本地信息网

vue中vxe-table表格加载数据的两种方式详解

2026-03-25 19:12:04 浏览次数:0
详细信息

数据驱动配置式加载。下面详细解释这两种方式的使用方法和区别。

1. 数据驱动方式(推荐)

这是最常用且简单的方式,直接通过 data 属性绑定数据源。

基本用法

<template>
  <vxe-table
    :data="tableData"
    :loading="loading"
    border
    stripe>
    <vxe-column type="seq" width="60"></vxe-column>
    <vxe-column field="name" title="姓名"></vxe-column>
    <vxe-column field="age" title="年龄"></vxe-column>
    <vxe-column field="role" title="角色"></vxe-column>
  </vxe-table>
</template>

<script>
export default {
  data() {
    return {
      loading: false,
      tableData: []
    }
  },
  mounted() {
    this.loadData();
  },
  methods: {
    async loadData() {
      this.loading = true;
      try {
        // 模拟 API 请求
        const response = await fetch('/api/user/list');
        this.tableData = await response.json();
      } catch (error) {
        console.error('数据加载失败:', error);
      } finally {
        this.loading = false;
      }
    }
  }
}
</script>

分页场景

<template>
  <div>
    <vxe-table
      :data="tableData"
      :loading="loading"
      border>
      <!-- 列配置 -->
      <vxe-column field="id" title="ID"></vxe-column>
      <vxe-column field="name" title="姓名"></vxe-column>
    </vxe-table>

    <vxe-pager
      :current-page="page.currentPage"
      :page-size="page.pageSize"
      :total="page.total"
      @page-change="handlePageChange">
    </vxe-pager>
  </div>
</template>

<script>
export default {
  data() {
    return {
      loading: false,
      tableData: [],
      page: {
        currentPage: 1,
        pageSize: 10,
        total: 0
      }
    }
  },
  mounted() {
    this.loadData();
  },
  methods: {
    async loadData() {
      this.loading = true;
      try {
        const params = {
          page: this.page.currentPage,
          size: this.page.pageSize
        };
        const response = await fetch(`/api/data?${new URLSearchParams(params)}`);
        const result = await response.json();

        this.tableData = result.list;
        this.page.total = result.total;
      } catch (error) {
        console.error('数据加载失败:', error);
      } finally {
        this.loading = false;
      }
    },
    handlePageChange({ currentPage, pageSize }) {
      this.page.currentPage = currentPage;
      this.page.pageSize = pageSize;
      this.loadData();
    }
  }
}
</script>

2. 配置式加载方式

这种方式通过 proxy-config 配置代理,让表格自动处理数据请求和分页。

基本配置

<template>
  <vxe-table
    border
    stripe
    height="500"
    :proxy-config="tableProxy"
    :columns="tableColumn">
  </vxe-table>
</template>

<script>
export default {
  data() {
    return {
      // 表格列配置
      tableColumn: [
        { type: 'seq', width: 60 },
        { field: 'name', title: '姓名' },
        { field: 'age', title: '年龄' },
        { field: 'role', title: '角色' }
      ],
      // 代理配置
      tableProxy: {
        props: {
          result: 'items',    // 响应结果列表字段
          total: 'total'      // 响应结果总数字段
        },
        ajax: {
          // 分页查询
          query: ({ page, sorts, filters }) => {
            return fetch('/api/user/page', {
              method: 'POST',
              headers: {
                'Content-Type': 'application/json'
              },
              body: JSON.stringify({
                pageSize: page.pageSize,
                currentPage: page.currentPage,
                sorts,
                filters
              })
            }).then(res => res.json());
          }
        }
      }
    }
  }
}
</script>

完整示例(带搜索和排序)

<template>
  <div>
    <!-- 搜索区域 -->
    <div style="margin-bottom: 20px;">
      <vxe-input v-model="form.name" placeholder="姓名"></vxe-input>
      <vxe-button @click="searchData">搜索</vxe-button>
      <vxe-button @click="resetSearch">重置</vxe-button>
    </div>

    <!-- 表格 -->
    <vxe-table
      ref="tableRef"
      border
      stripe
      height="500"
      :proxy-config="tableProxy"
      :columns="tableColumn">
    </vxe-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      form: {
        name: '',
        role: ''
      },
      tableColumn: [
        { type: 'seq', width: 60 },
        { 
          field: 'name', 
          title: '姓名',
          sortable: true  // 启用排序
        },
        { field: 'age', title: '年龄' },
        { field: 'role', title: '角色' }
      ],
      tableProxy: {
        props: {
          result: 'list',
          total: 'total'
        },
        ajax: {
          query: ({ page, sorts, filters }) => {
            // 合并查询条件
            const queryParams = {
              ...this.form,
              pageSize: page.pageSize,
              currentPage: page.currentPage,
              sorts,
              filters
            };

            return fetch('/api/user/list', {
              method: 'POST',
              headers: {
                'Content-Type': 'application/json'
              },
              body: JSON.stringify(queryParams)
            }).then(res => res.json());
          }
        }
      }
    }
  },
  methods: {
    // 搜索
    searchData() {
      this.$refs.tableRef.commitProxy('reload'); // 重新加载数据
    },
    // 重置搜索条件
    resetSearch() {
      this.form = {
        name: '',
        role: ''
      };
      this.searchData();
    }
  }
}
</script>

两种方式的对比

特性 数据驱动方式 配置式加载方式
使用难度 简单直观 需要学习配置语法
控制粒度 完全手动控制 表格自动处理
代码量 较多 较少
分页处理 手动处理分页逻辑 自动处理
排序/过滤 手动处理 自动处理
适用场景 简单表格、固定数据 复杂表格、需要自动分页排序

使用建议

选择数据驱动方式的情况:

数据量不大,不需要分页 需要完全控制数据加载过程 表格结构简单,不需要复杂的排序/过滤 数据来源多样(如多个接口组合)

选择配置式加载方式的情况:

需要分页、排序、过滤功能 希望减少重复的分页逻辑代码 表格功能复杂,需要自动处理数据请求 后端接口规范统一

性能优化建议

<template>
  <vxe-table
    :data="tableData"
    :loading="loading"
    height="600"
    :scroll-y="{ enabled: true, gt: 50 }"  // 虚拟滚动
    :row-config="{ keyField: 'id' }"       // 设置行key
    border>
    <!-- 列配置 -->
  </vxe-table>
</template>

<script>
export default {
  methods: {
    // 防抖加载
    debounceLoadData: _.debounce(function() {
      this.loadData();
    }, 300),

    // 节流加载
    throttleLoadData: _.throttle(function() {
      this.loadData();
    }, 1000)
  }
}
</script>

总结

两种方式各有优劣,数据驱动方式更加灵活可控,适合大多数场景;配置式加载方式能够减少重复代码,特别适合需要完整 CRUD 功能的复杂表格。建议根据实际项目需求选择合适的方式。

相关推荐