超详细vxe-table入门指南:从安装到高级功能全解析

超详细vxe-table入门指南:从安装到高级功能全解析

【免费下载链接】vxe-table vxe-table vue 表单/表格解决方案 【免费下载链接】vxe-table 项目地址: https://gitcode.com/gh_mirrors/vx/vxe-table

前言:为什么选择vxe-table?

你是否还在为Vue项目中的表格需求而烦恼?面对复杂的数据展示、编辑、排序、筛选等功能,普通表格组件往往捉襟见肘。vxe-table作为一款基于Vxe UI的PC端表格组件,提供了从基础表格到高级功能的完整解决方案,支持复制粘贴、数据透视表、高性能虚拟列表等特性,完美满足企业级应用开发需求。

读完本文,你将获得:

  • vxe-table的安装与基础配置方法
  • 表格的常用功能实现,如排序、筛选、分页等
  • 高级特性如虚拟滚动、单元格编辑、树形表格的应用
  • 实用技巧与性能优化建议

一、vxe-table简介

1.1 什么是vxe-table?

vxe-table是一个基于Vue.js的PC端表格组件,全称为Vue Extended Table,它提供了丰富的表格功能和灵活的配置选项,旨在解决复杂的表格场景需求。vxe-table的核心理念是面向现代浏览器,采用双向数据流设计,支持按需加载和自定义主题样式。

1.2 主要特性

vxe-table拥有以下核心特性:

特性类别主要功能
基础功能基础表格、配置式表格、斑马线条纹、多种边框、单元格样式
交互功能列宽拖动、列拖拽排序、行拖拽排序、固定列、多级表头
数据处理排序、多字段排序、筛选、合并单元格、导入/导出/打印
高级功能虚拟滚动、树形表格、单元格编辑、数据校验、键盘导航

1.3 版本支持情况

vxe-table目前主要维护V4版本,基于Vue 3.2+开发,只支持现代浏览器,不支持IE。历史版本V3基于Vue 2.6~2.7,已停止维护。

mermaid

1.4 浏览器兼容性

vxe-table支持以下现代浏览器:

浏览器最低版本要求
Chrome80+
Firefox90+
Edge80+
Safari10+
Opera75+

二、安装与环境配置

2.1 环境要求

  • Vue: 3.2+
  • Node.js: 14.0+
  • npm/yarn: 包管理工具

2.2 安装方式

2.2.1 npm安装
npm install vxe-table --save
2.2.2 yarn安装
yarn add vxe-table
2.2.3 克隆仓库安装
git clone https://gitcode.com/gh_mirrors/vx/vxe-table.git
cd vxe-table
npm install --legacy-peer-deps
npm run lib

2.3 引入vxe-table

2.3.1 全局引入

在main.js中全局引入vxe-table:

import { createApp } from 'vue'
import App from './App.vue'
import VxeTable from 'vxe-table'
import 'vxe-table/lib/style.css'

const app = createApp(App)
app.use(VxeTable)
app.mount('#app')
2.3.2 按需引入

如果你的项目需要减小打包体积,可以按需引入所需组件:

import { createApp } from 'vue'
import App from './App.vue'
import { VxeTable, VxeColumn } from 'vxe-table'
import 'vxe-table/lib/style.css'

const app = createApp(App)
app.use(VxeTable)
app.use(VxeColumn)
app.mount('#app')

2.4 CDN引入

对于非构建环境,可以通过CDN引入vxe-table:

<!-- 引入样式 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vxe-table@4/lib/style.css">
<!-- 引入脚本 -->
<script src="https://cdn.jsdelivr.net/npm/vue@3"></script>
<script src="https://cdn.jsdelivr.net/npm/vxe-table@4"></script>

三、基础表格实现

3.1 第一个vxe-table

下面我们来创建一个最简单的vxe-table实例:

<template>
  <div>
    <vxe-table :data="tableData">
      <vxe-column type="seq" title="序号" width="60"></vxe-column>
      <vxe-column field="name" title="姓名"></vxe-column>
      <vxe-column field="role" title="角色"></vxe-column>
      <vxe-column field="sex" title="性别"></vxe-column>
      <vxe-column field="age" title="年龄"></vxe-column>
      <vxe-column field="address" title="地址"></vxe-column>
    </vxe-table>
  </div>
</template>

<script setup>
import { reactive } from 'vue'

const tableData = reactive([
  { id: 10001, name: 'Test1', role: 'Develop', sex: 'Man', age: 28, address: 'Shenzhen' },
  { id: 10002, name: 'Test2', role: 'Test', sex: 'Woman', age: 22, address: 'Guangzhou' },
  { id: 10003, name: 'Test3', role: 'PM', sex: 'Man', age: 32, address: 'Shanghai' },
  { id: 10004, name: 'Test4', role: 'Designer', sex: 'Woman', age: 24, address: 'Beijing' }
])
</script>

在这个例子中,我们使用vxe-table组件创建表格,通过data属性绑定数据源。vxe-column组件定义表格列,field属性指定数据字段,title属性设置列标题。

3.2 表格属性配置

vxe-table提供了丰富的属性配置,用于自定义表格的外观和行为。下面是一些常用的表格属性:

<vxe-table
  :data="tableData"
  border
  stripe
  :height="400"
  :show-header="true"
  :column-config="{ resizable: true }"
>
  <!-- 列定义 -->
</vxe-table>

常用表格属性说明:

属性名类型描述
dataArray表格数据源
borderBoolean/String是否显示边框,可选值:true/false/'full'/'outer'/'inner'
stripeBoolean是否显示斑马纹
heightNumber/String表格高度
minHeightNumber/String表格最小高度
maxHeightNumber/String表格最大高度
showHeaderBoolean是否显示表头
column-configObject列配置,如{ resizable: true }允许列宽调整

3.3 列属性配置

vxe-column也提供了丰富的属性配置:

<vxe-column
  field="name"
  title="姓名"
  width="120"
  align="center"
  :show-overflow="true"
  :sortable="true"
></vxe-column>

常用列属性说明:

属性名类型描述
fieldString对应数据字段名
titleString列标题
widthNumber/String列宽度
minWidthNumber/String列最小宽度
alignString对齐方式,可选值:left/center/right
showOverflowBoolean内容过长时是否显示省略号
sortableBoolean是否允许排序
fixedString是否固定列,可选值:left/right

3.4 表格样式自定义

vxe-table提供了多种方式来自定义表格样式:

3.4.1 内置样式

通过设置表格属性,可以快速应用内置样式:

<vxe-table
  :data="tableData"
  border
  stripe
  round
  size="small"
>
  <!-- 列定义 -->
</vxe-table>
3.4.2 自定义单元格样式

使用cellClassNamecellStyle属性可以自定义单元格样式:

<vxe-table
  :data="tableData"
  :cell-class-name="cellClassName"
  :cell-style="cellStyle"
>
  <!-- 列定义 -->
</vxe-table>

<script>
export default {
  methods: {
    cellClassName({ row, column }) {
      if (column.field === 'age' && row.age > 30) {
        return 'highlight-row'
      }
    },
    cellStyle({ row, column }) {
      if (column.field === 'sex' && row.sex === 'Woman') {
        return { color: '#ff4d4f' }
      }
    }
  }
}
</script>

<style>
.highlight-row {
  background-color: #fff2e8;
}
</style>

四、常用功能实现

4.1 排序功能

vxe-table支持单列排序和多列排序,只需在列上设置sortable属性:

<template>
  <vxe-table :data="tableData">
    <vxe-column type="seq" title="序号" width="60"></vxe-column>
    <vxe-column field="name" title="姓名"></vxe-column>
    <vxe-column field="age" title="年龄" :sortable="true"></vxe-column>
    <vxe-column field="address" title="地址"></vxe-column>
  </vxe-table>
</template>

对于自定义排序逻辑,可以使用sort-method属性:

<vxe-column
  field="age"
  title="年龄"
  :sortable="true"
  :sort-method="sortAge"
></vxe-column>

<script>
export default {
  methods: {
    sortAge(a, b) {
      // 自定义排序逻辑
      return a.age - b.age
    }
  }
}
</script>

4.2 筛选功能

vxe-table提供了多种筛选方式:

4.2.1 基础筛选
<vxe-table :data="tableData">
  <vxe-column type="seq" title="序号" width="60"></vxe-column>
  <vxe-column field="name" title="姓名"></vxe-column>
  <vxe-column field="role" title="角色" :filters="roleFilters" :filter-multiple="true"></vxe-column>
  <vxe-column field="address" title="地址"></vxe-column>
</vxe-table>

<script>
export default {
  data() {
    return {
      roleFilters: [
        { label: 'Develop', value: 'Develop' },
        { label: 'Test', value: 'Test' },
        { label: 'PM', value: 'PM' },
        { label: 'Designer', value: 'Designer' }
      ]
    }
  }
}
</script>
4.2.2 自定义筛选

对于复杂的筛选需求,可以使用自定义筛选:

<vxe-column
  field="age"
  title="年龄"
  :filters="[{ data: 'custom' }]"
  :filter-render="{
    name: 'ElInput',
    props: { type: 'number', placeholder: '请输入年龄' },
    events: {
      input: filterAge
    }
  }"
></vxe-column>

<script>
export default {
  methods: {
    filterAge({ $event, column }) {
      const value = $event.target.value
      column.dataFilter = value ? (row) => row.age >= value : null
      this.$refs.xTable.refreshFilter()
    }
  }
}
</script>

4.3 分页功能

vxe-table可以与分页组件配合使用,实现分页功能:

<template>
  <div>
    <vxe-table
      ref="xTable"
      :data="tableData"
      :loading="loading"
    >
      <!-- 列定义 -->
    </vxe-table>
    
    <vxe-pager
      v-model:current-page="currentPage"
      v-model:page-size="pageSize"
      :total="total"
      @change="handlePageChange"
    ></vxe-pager>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [],
      loading: false,
      currentPage: 1,
      pageSize: 10,
      total: 0
    }
  },
  created() {
    this.loadData()
  },
  methods: {
    loadData() {
      this.loading = true
      // 模拟API请求
      setTimeout(() => {
        // 实际项目中这里会是API请求
        this.tableData = [...]; // 分页数据
        this.total = 100; // 总条数
        this.loading = false
      }, 500)
    },
    handlePageChange() {
      this.loadData()
    }
  }
}
</script>

4.4 单元格编辑

vxe-table支持多种编辑模式,包括单元格编辑、行编辑等。

4.4.1 单元格编辑
<template>
  <vxe-table
    :data="tableData"
    :edit-config="{ trigger: 'click', mode: 'cell' }"
  >
    <vxe-column type="seq" title="序号" width="60"></vxe-column>
    <vxe-column field="name" title="姓名"></vxe-column>
    <vxe-column field="age" title="年龄" :edit-render="{ name: 'input', props: { type: 'number' } }"></vxe-column>
    <vxe-column field="address" title="地址" :edit-render="{ name: 'input' }"></vxe-column>
  </vxe-table>
</template>
4.4.2 编辑校验

可以为编辑字段添加校验规则:

<vxe-column
  field="age"
  title="年龄"
  :edit-render="{ name: 'input', props: { type: 'number' } }"
  :edit-rules="[{ required: true, type: 'number', min: 18, max: 60, message: '年龄必须在18-60之间' }]"
></vxe-column>

4.5 合并单元格

vxe-table支持合并行和列,可以通过span-method实现:

<template>
  <vxe-table
    :data="tableData"
    :span-method="spanMethod"
  >
    <!-- 列定义 -->
  </vxe-table>
</template>

<script>
export default {
  methods: {
    spanMethod({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 0 && rowIndex % 2 === 0) {
        return { rowspan: 2, colspan: 1 }
      } else if (columnIndex === 0 && rowIndex % 2 === 1) {
        return { rowspan: 0, colspan: 0 }
      }
    }
  }
}
</script>

五、高级功能应用

5.1 虚拟滚动

当表格数据量很大时(例如10万+行),普通表格会出现性能问题。vxe-table的虚拟滚动功能可以解决这个问题,只渲染可视区域的行:

<template>
  <vxe-table
    :data="tableData"
    :virtual-y-config="{ itemSize: 50 }"
    height="500"
  >
    <!-- 列定义 -->
  </vxe-table>
</template>

virtual-y-config用于配置纵向虚拟滚动,itemSize指定每行的高度。同样,virtual-x-config可以配置横向虚拟滚动。

5.2 树形表格

vxe-table支持树形数据展示,只需简单配置即可实现:

<template>
  <vxe-table
    :data="treeData"
    :tree-config="{ children: 'children', hasChild: 'hasChild' }"
  >
    <vxe-column type="seq" title="序号" width="60"></vxe-column>
    <vxe-column field="name" title="名称"></vxe-column>
    <vxe-column field="size" title="大小"></vxe-column>
    <vxe-column field="date" title="修改日期"></vxe-column>
  </vxe-table>
</template>

<script>
export default {
  data() {
    return {
      treeData: [
        {
          id: 10000,
          name: '文档',
          size: '',
          date: '2023-01-01',
          hasChild: true,
          children: [
            { id: 10001, name: '简历.docx', size: '20KB', date: '2023-01-01' },
            { id: 10002, name: '报告.pdf', size: '100KB', date: '2023-01-02' }
          ]
        },
        // 更多数据...
      ]
    }
  }
}
</script>

5.3 导出功能

vxe-table支持将表格数据导出为Excel、CSV等格式:

<template>
  <div>
    <vxe-toolbar>
      <template #buttons>
        <vxe-button @click="exportData">导出Excel</vxe-button>
      </template>
    </vxe-toolbar>
    
    <vxe-table
      ref="xTable"
      :data="tableData"
    >
      <!-- 列定义 -->
    </vxe-table>
  </div>
</template>

<script>
export default {
  methods: {
    exportData() {
      this.$refs.xTable.exportData({
        filename: '表格数据',
        type: 'xlsx',
        columns: ['name', 'age', 'sex', 'address']
      })
    }
  }
}
</script>

5.4 导入功能

vxe-table也支持从Excel导入数据:

<template>
  <div>
    <vxe-toolbar>
      <template #buttons>
        <vxe-upload
          accept=".xlsx, .xls"
          @change="importData"
        >
          <vxe-button>导入Excel</vxe-button>
        </vxe-upload>
      </template>
    </vxe-toolbar>
    
    <vxe-table
      ref="xTable"
      :data="tableData"
    >
      <!-- 列定义 -->
    </vxe-table>
  </div>
</template>

<script>
import XLSX from 'xlsx'

export default {
  methods: {
    importData(file) {
      const reader = new FileReader()
      reader.onload = (e) => {
        const data = new Uint8Array(e.target.result)
        const workbook = XLSX.read(data, { type: 'array' })
        const firstSheetName = workbook.SheetNames[0]
        const worksheet = workbook.Sheets[firstSheetName]
        const jsonData = XLSX.utils.sheet_to_json(worksheet)
        this.tableData = jsonData
      }
      reader.readAsArrayBuffer(file.raw)
    }
  }
}
</script>

5.5 快捷菜单

vxe-table支持自定义快捷菜单:

<template>
  <vxe-table
    :data="tableData"
    :menu-config="{ enabled: true, body: { options: menuOptions } }"
    @menu-click="handleMenuClick"
  >
    <!-- 列定义 -->
  </vxe-table>
</template>

<script>
export default {
  data() {
    return {
      menuOptions: [
        { code: 'copy', name: '复制' },
        { code: 'edit', name: '编辑' },
        { code: 'delete', name: '删除', disabled: ({ row }) => row.id === 1 },
        { code: 'sep1', type: 'separator' },
        { code: 'export', name: '导出选中行' }
      ]
    }
  },
  methods: {
    handleMenuClick({ code, row }) {
      switch (code) {
        case 'copy':
          // 复制逻辑
          break
        case 'edit':
          // 编辑逻辑
          break
        case 'delete':
          // 删除逻辑
          break
        case 'export':
          // 导出逻辑
          break
      }
    }
  }
}
</script>

六、性能优化

6.1 大数据优化

除了前面提到的虚拟滚动,还有一些优化大数据表格性能的方法:

  1. 使用row-config.useKeycolumn-config.useKey启用key优化
  2. 关闭不必要的动画效果
  3. 使用keepSource属性保持原始数据,避免数据拷贝
  4. 减少复杂的单元格渲染
<vxe-table
  :data="bigData"
  :row-config="{ useKey: true, keyField: 'id' }"
  :column-config="{ useKey: true }"
  :keep-source="true"
  :animat="false"
  :virtual-y-config="{ itemSize: 50 }"
>
  <!-- 列定义 -->
</vxe-table>

6.2 懒加载

对于非常大的数据集,可以使用懒加载:

<template>
  <vxe-table
    :data="tableData"
    :loading="loading"
    @scroll="handleScroll"
  >
    <!-- 列定义 -->
  </vxe-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [],
      loading: false,
      currentPage: 1,
      pageSize: 50,
      hasMore: true
    }
  },
  created() {
    this.loadMoreData()
  },
  methods: {
    loadMoreData() {
      if (!this.hasMore) return
      
      this.loading = true
      // 模拟API请求
      setTimeout(() => {
        // 实际项目中这里会是API请求
        const newData = [...]; // 加载的新数据
        this.tableData = [...this.tableData, ...newData]
        this.currentPage++
        this.hasMore = newData.length === this.pageSize
        this.loading = false
      }, 500)
    },
    handleScroll({ scrollTop, scrollHeight, clientHeight }) {
      // 滚动到底部时加载更多
      if (scrollTop + clientHeight >= scrollHeight - 10 && !this.loading) {
        this.loadMoreData()
      }
    }
  }
}
</script>

6.3 事件防抖

对于频繁触发的事件(如输入筛选),可以使用防抖优化:

<template>
  <vxe-table
    :data="tableData"
  >
    <vxe-column
      field="name"
      title="姓名"
      :filter-render="{
        name: 'ElInput',
        props: { placeholder: '输入姓名筛选' },
        events: { input: debounceFilterName }
      }"
    ></vxe-column>
    <!-- 其他列 -->
  </vxe-table>
</template>

<script>
import { debounce } from 'lodash'

export default {
  created() {
    this.debounceFilterName = debounce(this.filterName, 300)
  },
  methods: {
    filterName({ $event, column }) {
      const value = $event.target.value
      column.dataFilter = value ? row => row.name.includes(value) : null
      this.$refs.xTable.refreshFilter()
    }
  }
}
</script>

七、实战案例

7.1 复杂表格综合示例

下面是一个综合运用了多种功能的复杂表格示例:

<template>
  <div>
    <vxe-toolbar>
      <template #buttons>
        <vxe-button @click="addRow">新增</vxe-button>
        <vxe-button @click="deleteSelectedRows" :disabled="selectedRows.length === 0">删除选中</vxe-button>
        <vxe-button @click="exportData">导出</vxe-button>
      </template>
      <template #search>
        <vxe-input
          v-model="searchText"
          placeholder="输入关键词搜索"
          @input="debounceSearch"
        ></vxe-input>
      </template>
    </vxe-toolbar>
    
    <vxe-table
      ref="xTable"
      :data="tableData"
      :loading="loading"
      border
      stripe
      :height="500"
      :checkbox-config="{ checkRowKeys: selectedRowKeys }"
      :edit-config="{ trigger: 'click', mode: 'cell', showStatus: true }"
      :virtual-y-config="{ itemSize: 50 }"
      @checkbox-change="handleCheckboxChange"
    >
      <vxe-column type="checkbox" width="60"></vxe-column>
      <vxe-column type="seq" title="序号" width="60"></vxe-column>
      <vxe-column field="name" title="姓名" :edit-render="{ name: 'input' }"></vxe-column>
      <vxe-column field="sex" title="性别" :edit-render="{ name: 'select', options: sexOptions }"></vxe-column>
      <vxe-column field="age" title="年龄" :edit-render="{ name: 'input', props: { type: 'number' } }" :sortable="true"></vxe-column>
      <vxe-column field="role" title="角色" :filters="roleFilters" :filter-multiple="true"></vxe-column>
      <vxe-column field="address" title="地址" :show-overflow="true"></vxe-column>
      <vxe-column field="date" title="日期" :edit-render="{ name: 'datePicker', props: { type: 'date' } }"></vxe-column>
      <vxe-column title="操作" width="120" align="center">
        <template #default="{ row }">
          <vxe-button size="small" @click="editRow(row)">编辑</vxe-button>
          <vxe-button size="small" type="danger" @click="deleteRow(row)">删除</vxe-button>
        </template>
      </vxe-column>
    </vxe-table>
    
    <vxe-pager
      v-model:current-page="currentPage"
      v-model:page-size="pageSize"
      :total="total"
      @change="handlePageChange"
    ></vxe-pager>
  </div>
</template>

<script>
import { ref, reactive, toRefs, onMounted } from 'vue'
import { debounce } from 'lodash'

export default {
  setup() {
    const state = reactive({
      tableData: [],
      loading: false,
      searchText: '',
      selectedRowKeys: [],
      selectedRows: [],
      currentPage: 1,
      pageSize: 10,
      total: 0,
      sexOptions: [
        { label: '男', value: 'Man' },
        { label: '女', value: 'Woman' }
      ],
      roleFilters: [
        { label: 'Develop', value: 'Develop' },
        { label: 'Test', value: 'Test' },
        { label: 'PM', value: 'PM' },
        { label: 'Designer', value: 'Designer' }
      ]
    })
    
    // 防抖搜索
    const debounceSearch = debounce(() => {
      state.currentPage = 1
      loadData()
    }, 300)
    
    // 加载数据
    const loadData = () => {
      state.loading = true
      // 模拟API请求
      setTimeout(() => {
        // 实际项目中这里会是API请求
        state.tableData = [...]; // 表格数据
        state.total = 100; // 总条数
        state.loading = false
      }, 500)
    }
    
    // 分页变更
    const handlePageChange = () => {
      loadData()
    }
    
    // 复选框变更
    const handleCheckboxChange = ({ checked, records }) => {
      state.selectedRowKeys = checked
      state.selectedRows = records
    }
    
    // 新增行
    const addRow = () => {
      const newRow = {
        id: Date.now(),
        name: '',
        sex: 'Man',
        age: 25,
        role: 'Develop',
        address: '',
        date: new Date().toISOString().split('T')[0]
      }
      state.tableData.unshift(newRow)
      // 进入编辑状态
      setTimeout(() => {
        state.$refs.xTable.setActiveCell({ row: newRow, column: { field: 'name' } })
      }, 10)
    }
    
    // 编辑行
    const editRow = (row) => {
      state.$refs.xTable.setActiveCell({ row, column: { field: 'name' } })
    }
    
    // 删除行
    const deleteRow = (row) => {
      const index = state.tableData.indexOf(row)
      state.tableData.splice(index, 1)
    }
    
    // 删除选中行
    const deleteSelectedRows = () => {
      state.tableData = state.tableData.filter(row => !state.selectedRowKeys.includes(row.id))
      state.selectedRowKeys = []
      state.selectedRows = []
    }
    
    // 导出数据
    const exportData = () => {
      state.$refs.xTable.exportData({
        filename: '员工信息表',
        type: 'xlsx'
      })
    }
    
    onMounted(() => {
      loadData()
    })
    
    return {
      ...toRefs(state),
      debounceSearch,
      handlePageChange,
      handleCheckboxChange,
      addRow,
      editRow,
      deleteRow,
      deleteSelectedRows,
      exportData
    }
  }
}
</script>

八、总结与展望

8.1 主要功能回顾

本文详细介绍了vxe-table的安装配置、基础使用和高级功能,包括:

  • 安装与引入vxe-table的多种方式
  • 基础表格的创建和样式自定义
  • 常用功能如排序、筛选、分页、编辑等的实现
  • 高级特性如虚拟滚动、树形表格、导入导出等的应用
  • 性能优化技巧和实战案例

8.2 最佳实践建议

在使用vxe-table时,建议遵循以下最佳实践:

  1. 根据数据量选择合适的渲染模式,大数据集使用虚拟滚动
  2. 合理使用缓存和懒加载,减少不必要的渲染
  3. 对频繁触发的事件使用防抖/节流优化
  4. 按需引入组件,减小打包体积
  5. 遵循组件化思想,将复杂表格拆分为多个组件

8.3 未来展望

vxe-table团队正在不断优化和扩展功能,未来将重点提升虚拟渲染性能,支持千万级数据渲染,并增加数据图表可视化功能。作为开发者,我们可以期待vxe-table在企业级应用开发中发挥更大作用。

vxe-table作为一款功能强大、性能优异的Vue表格组件,为我们解决复杂表格需求提供了完整的解决方案。希望本文能帮助你更好地理解和使用vxe-table,提升开发效率和用户体验。

【免费下载链接】vxe-table vxe-table vue 表单/表格解决方案 【免费下载链接】vxe-table 项目地址: https://gitcode.com/gh_mirrors/vx/vxe-table

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

抵扣说明:

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

余额充值