前端实现el-table的数据修改和删除,将处理后的数据传给后台

<!--
 * @Descripttion: this.$set的正确使用
 * @version: 
 * @Author: zhangfan
 * @email: 2207044692@qq.com
 * @Date: 2020-05-18 14:05:13
 * @LastEditors: zhangfan
 * @LastEditTime: 2021-04-25 17:47:12
-->

<template>
  <div>
    <el-table :data="tableData" border style="width: 100%">
      <el-table-column prop="date" label="日期" width="180"> </el-table-column>
      <el-table-column prop="name" label="姓名" width="180"> </el-table-column>
      <el-table-column prop="address" label="地址"> </el-table-column>
      <el-table-column align="left" label="操作" width="250px" fixed="right">
        <template slot-scope="scope">
          <div>
            <el-link type="primary" @click="editName(scope.row.id)"
              >修改姓名</el-link
            >
            <el-link type="danger" @click="handleDelete(scope.$index)"
              >删除</el-link
            >
          </div>
        </template>
      </el-table-column>
    </el-table>
    <!--修改QPS-->
    <el-dialog
      title="修改姓名"
      :visible.sync="visible"
      :close-on-click-modal="false"
      @close="handleClose"
      custom-class="dialog-minwidth"
      width="500px"
      :modal-append-to-body="false"
    >
      <el-form :model="ruleForm" ref="ruleForm" class="demo-ruleForm">
        <el-form-item prop="name">
          <el-input v-model="ruleForm.name"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click.native="handleClose" class="cancel">取消</el-button>
        <el-button type="primary" @click.native="toSave" class="save"
          >保存</el-button
        >
      </div>
    </el-dialog>
  </div>
</template>

<script>
export default {
  data() {
    return {
      ruleForm: {
        name: "",
      },
      visible: false,
      userId: "",
      tableData: [
        {
          id: "1",
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄",
        },
        {
          id: "2",
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄",
        },
        {
          id: "3",
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1519 弄",
        },
        {
          id: "4",
          date: "2016-05-03",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1516 弄",
        },
      ],
    };
  },
  methods: {
    /**
     * @description: 修改表格姓名
     */
    editName(userId) {
      this.visible = true;
      this.userId = userId;
    },
    /**
     * @description: 删除表格数据
     */
    handleDelete(index) {
      this.$confirm("确认删除吗?", "提示", {
        cancelButtonClass: "btn-custom-cancel",
        type: "warning",
      })
        .then(() => {
          this.tableData.splice(index, 1);
          this.$message({
            message: "删除成功",
            type: "success",
          });
        })
        .catch(() => {});
    },
    /**
     * @description: 关闭弹框
     */
    handleClose() {
      this.visible = false;
    },
    /**
     * @description: 保存修改
     */
    toSave() {
      let obj = {};
      let index = "";
      this.tableData.forEach((item, i) => {
        if (item.id == this.userId) {
          index = i;
          item.name = this.ruleForm.name;
          obj = item;
        }
      });
      this.$set(this.tableData, index, obj);
      this.$message({
        type: "success",
        message: "修改成功!",
      });
      this.visible = false;
      console.log(this.tableData)
    },
  },
};
</script>

<style  scoped lang="less">
</style>

在这里插入图片描述

### 回答1: 在使用 el-table 渲染大量数据时,会发现渲染速度很慢,甚至会卡死。这是因为 el-table 默认是将所有数据渲染到页面上,当数据量很大时,会导致页面渲染速度极慢,甚至卡死。 解决方法有以下几种: 1. 使用分页功能。el-table 提供了分页功能,可以将大量数据分成多个页面,每次只渲染当前页面的数据,减少内存消耗。 2. 使用虚拟滚动。el-table 还提供了虚拟滚动功能,可以在滚动条滚动时才渲染数据,减少内存消耗。 3. 使用数据预加载。当数据量很大,分页和虚拟滚动都无法满足要求时,可以使用数据预加载的方式。在用户滚动到底部时,再加载下一页数据。 示例代码如下: ``` <template> <div> <el-table :data="tableData" height="500" @scroll="handleScroll" > <el-table-column prop="name" label="Name" ></el-table-column> <el-table-column prop="age" label="Age" ></el-table-column> </el-table> </div> </template> <script> export default { data() { return { tableData: [], currentPage: 1, perPage: 10, total: 0, isLoading: false } }, created() { this.loadData() ### 回答2: 如果使用el-table组件渲染10000条数据导致页面卡死,可以尝试以下几种解决方法: 1. 分页加载数据:可以将数据分成多个分页,每次只加载当前显示的分页数据,减少一次性加载大量数据的压力。可以使用el-pagination组件实现分页功能。 2. 虚拟滚动:可以使用el-table的虚拟滚动功能,只渲染当前可见区域的数据,而不是全部数据。这样可以减少DOM元素的数量,提高性能。可以通过设置el-table的属性::virtual-scroll="true",并根据实际情况调整每页渲染的行数。 3. 后台分批加载数据:如果从后台获取数据,可以通过分批加载的方式减轻前端的渲染压力。可以设置每次请求的数据量适当增加,然后通过监听滚动事件来动态加载下一批数据。 4. 异步渲染:可以将渲染任务放入浏览器的异步队列中执行,避免阻塞主线程。可以使用setTimeout或requestAnimationFrame等方法来实现异步渲染。 5. 数据过滤和搜索:可以根据实际需求对数据进行筛选和搜索,只展示符合条件的数据,而不是全部数据。 需要根据具体的业务场景和数据量来选择合适的解决方法,并结合其他性能优化措施来提升页面的渲染速度和用户体验。 ### 回答3: 当el-table渲染10000条数据时容易卡死,这是因为浏览器无法快速处理这么大数量级的DOM元素。为了解决这个问题,一种常用的方法是将数据分页显示。可以通过设置el-table组件的pageSize属性来限制每页显示的数据条数,这样就可以避免页面卡死的情况。 另外,对于大量数据的渲染,应使用虚拟滚动技术。el-table组件提供了"fixed"属性,可以设置表格的固定高度,同时需要设置表格的max-height属性,以确保表格出现滚动条。这样就能实现在页面上只渲染可见区域的数据,有效减少DOM的数量,提高页面渲染性能。 以下是一个示例代码片段,演示了如何使用分页和虚拟滚动来解决el-table渲染大量数据卡死的问题: ``` <template> <el-table :data="tableData" :max-height="tableHeight" height="100%"> <!-- 表格列定义 --> </el-table> </template> <script> export default { data() { return { tableData: [], // 用于存储总数据 currentPage: 1, // 当前页数 pageSize: 50, // 每页显示的数据条数 tableHeight: '500px', // 表格的高度,需要根据实际情况调整 }; }, created() { // 模拟获取10000条数据的请求 this.getData(); }, methods: { getData() { // 模拟请求后端接口获取数据 // 假设接口返回的数据格式为 { data: [/* 数据数组 */], total: /* 总数据条数 */ } const response = /* 发送请求并获取响应 */; this.tableData = response.data; }, handleCurrentChange(val) { // 分页改变时触发该方法 this.currentPage = val; this.getData(); // 重新获取数据 }, }, }; </script> ``` 在以上示例中,我们使用了el-table组件的分页功能,每页显示50条数据。并且设置了表格的高度为500px,超出部分将自动显示滚动条。同时在handleCurrentChange方法中,需要重新获取当前页的数据,保证只渲染当前页的数据,以提高渲染性能。 通过以上的方法,就可以解决el-table渲染大量数据卡死的问题。当然,具体的解决方案还需要根据实际场景进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值