vue2+vxe-table实现表格增删改查+虚拟滚动

vue2+vxe-table实现表格增删改查+虚拟滚动

使用的vxe-table版本:v3.x (vue 2.6 长期维护版)
在这里插入图片描述

完整代码

<template>
  <div>
    <vxe-toolbar ref="xToolbar" export :refresh="{query: findList}">
      <template #buttons>
        <vxe-button @click="insertEvent(null)">从第一行插入</vxe-button>
        <vxe-button @click="insertEvent(-1)">从最后插入</vxe-button>
        <vxe-button @click="insertEvent($refs.xTable.getData(100))">插入到 100</vxe-button>
        <vxe-button @click="insertEvent($refs.xTable.getData(300))">插入到 300</vxe-button>
        <vxe-button @click="$refs.xTable.removeCheckboxRow()">删除选中</vxe-button>
        <vxe-button @click="delFirst">删除第一行</vxe-button>
        <vxe-button @click="$refs.xTable.remove($refs.xTable.getData($refs.xTable.getData().length - 1))">删除最后一行</vxe-button>
        <vxe-button @click="$refs.xTable.remove($refs.xTable.getData(100))">删除第 100</vxe-button>
        <vxe-button @click="getInsertEvent">获取新增</vxe-button>
        <vxe-button @click="getRemoveEvent">获取删除</vxe-button>
        <vxe-button @click="getUpdateEvent">获取修改</vxe-button>
        <vxe-button icon="vxe-icon-save" @click="saveEvent" status="primary">保存</vxe-button>
      </template>
    </vxe-toolbar>

    <vxe-table border resizable show-overflow keep-source ref="xTable" height="400" :loading="loading" 
        :export-config="{}"
        :edit-config="{trigger: 'click', mode: 'row', showStatus: true}"
        :scroll-y="{enabled: true}"
    >
      <vxe-column type="checkbox" width="60"></vxe-column>
      <vxe-column type="seq" width="100"></vxe-column>
      <vxe-column field="name" title="Name" sortable :edit-render="{autofocus: '.vxe-input--inner'}">
        <template #edit="{ row }">
          <vxe-input v-model="row.name" type="text"></vxe-input>
        </template>
      </vxe-column>
      <vxe-column field="age" title="Age" :edit-render="{}">
        <template #edit="{ row }">
          <vxe-input v-model="row.age" placeholder="请输入" type="float" digits="1">
            <template #suffix>
              <i class="vxe-icon-warning-triangle-fill"></i>
            </template>
          </vxe-input>
        </template>
      </vxe-column>
      <vxe-column field="sex" title="Sex" :edit-render="{}">
        <template #edit="{ row }">
          <vxe-input v-model="row.sex" placeholder="请输入" type="float" digits="2">
            <template #suffix>
              <i>%</i>
            </template>
          </vxe-input>
        </template>
      </vxe-column>
      <vxe-column field="rate" title="Rate"></vxe-column>
      <vxe-column field="region" title="Region"></vxe-column>
      <vxe-column field="time" title="Time"></vxe-column>
      <vxe-column field="address" title="Address" width="300" show-overflow></vxe-column>
    </vxe-table>
  </div>
</template>

<script>
export default {
  data () {
    return {
      loading: false,
    }
  },
  created () {
    this.$nextTick(() => {
      // 将表格和工具栏进行关联
      this.$refs.xTable.connect(this.$refs.xToolbar)
    })
    this.findList()
  },
  methods: {
    findList () {
      this.loading = true
      return new Promise(resolve => {
        setTimeout(() => {
          const data = this.mockList(200)
          // 阻断 vue 对大数组的监听,避免 vue 绑定大数据造成短暂的卡顿
          if (this.$refs.xTable) {
            this.$refs.xTable.loadData(data)
          }
          resolve()
          this.loading = false
        }, 500)
      })
    },
    mockList (size) {
      const list = []
      for (let index = 0; index < size; index++) {
        list.push({name: `名称${index}`, sex: '0', num: 123, age: 18, num2: 234, rate: 3, address: 'shenzhen'})
      }
      return list
    },
    insertEvent (row) {
      let xTable = this.$refs.xTable
      const record = {
        checked: false
      }
      xTable.insertAt(record, row).then(({ row }) => {
        xTable.setEditRow(row)
      })
    },
    getInsertEvent () {
      let insertRecords = this.$refs.xTable.getInsertRecords()
      console.log(insertRecords);
    },
    getRemoveEvent () {
      let removeRecords = this.$refs.xTable.getRemoveRecords()
      console.log(removeRecords);
    },
    getUpdateEvent () {
      let updateRecords = this.$refs.xTable.getUpdateRecords()
      console.log(updateRecords);
    },
    delFirst() {
      this.$refs.xTable.remove(this.$refs.xTable.tableFullData[0])
      console.log(222, this.$refs.xTable.tableFullData);
    },
    /**
     * 点击保存按钮
     */
    async saveEvent () {
      const $table = this.$refs.xTable
      const errMap = await $table.validate().catch(errMap => errMap)
      if (errMap) {
        VXETable.modal.message({ status: 'error', message: '校验未通过,请填写必填项' })
      } else {
        // 可以用这3个变量发送请求
        // 要新增的数据,要删除的数据,要更新的数据
        const { insertRecords, removeRecords, updateRecords } = $table.getRecordset()
        console.log("insertRecords", insertRecords);
        console.log("removeRecords", removeRecords);
        console.log("updateRecords", updateRecords);
        // insertRecords.length && this.insertData(insertRecords);
        // removeRecords.length && this.deleteData(removeRecords);
        // updateRecords.length && this.updateData(updateRecords);
        // await this.getTableList1();
      }
    },
  }
}
</script>

结果
在这里插入图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Vue3中使用vxe-table和TypeScript进行国际化的步骤如下: 1. 首先,安装vxe-tablevue-i18n依赖: ```shell npm install vxe-table vue-i18n ``` 2. 在Vue的入口文件(通常是main.ts)中,引入vxe-tablevue-i18n,并进行相关配置: ```typescript import { createApp } from 'vue'; import App from './App.vue'; import XEUtils from 'xe-utils'; import VXETable from 'vxe-table'; import 'vxe-table/lib/style.css'; import { createI18n } from 'vue-i18n'; // 导入vxe-table的国际化语言包 import zhCN from 'vxe-table/lib/locale/lang/zh-CN'; import enUS from 'vxe-table/lib/locale/lang/en-US'; // 创建vue-i18n实例 const i18n = createI18n({ locale: 'zh-CN', // 设置默认语言 messages: { 'zh-CN': zhCN, 'en-US': enUS } }); // 使用vxe-table const app = createApp(App); app.use(VXETable); app.use(i18n); app.mount('#app'); ``` 3. 在组件使用vxe-table的国际化功能,可以通过`$t`方法来获取对应的翻译文本: ```html <template> <div> <vxe-table :data="tableData"> <vxe-table-column type="index" title="序号"></vxe-table-column> <vxe-table-column field="name" title="姓名"></vxe-table-column> <vxe-table-column field="age" title="年龄"></vxe-table-column> </vxe-table> </div> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 20 }, { name: '李四', age: 25 }, { name: '王五', age: 30 } ] }; } }; </script> ``` 4. 在组件使用vue-i18n的国际化功能,可以通过`$t`方法来获取对应的翻译文本: ```html <template> <div> <p>{{ $t('message.greeting') }}</p> </div> </template> <script> export default { mounted() { console.log(this.$t('message.greeting')); } }; </script> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码上暴富

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

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

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

打赏作者

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

抵扣说明:

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

余额充值