组件化的可编辑数据表格

一、设计思路:

  • 首先创建一个含表头的表单
  • 利用json-server和axios进行表格数据的获取,利用模板字符串生成对应的行列
  • 设置相关的配置项(哪些列可编辑、编辑时的验证规则等)
  • 设置一个函数setEditable()来设置哪些列可以编辑
  • 编辑时需要利用正则表达式验证是否符合修改规则
  • 在编辑后利用axios发送请求将json文件中的数据更新

二、具体实现:

1.html结构:

<body>
    <div class="form">
      <table class="table">
        <thead>
          <tr>
            <th>学号</th>
            <th>姓名</th>
            <th>性别</th>
            <th>语文</th>
            <th>数学</th>
            <th>英语</th>
            <th>理综</th>
            <th>操作</th>
          </tr>
        </thead>
        <tbody></tbody>
      </table>
    </div>

    <script></script>
    <script src="./axios.js"></script>
    <script src="./index-(1).js"></script>
  </body>

2.axios获取表格数据:

//创建axios实例 instance
const instance = axios.create({
  //该地址为默认的地址
  baseURL: "http://localhost:3000/t_grades",
});

function getEnrollments() {
  instance.get("http://localhost:3000/t_grades").then((res) => {
    const Table = document.querySelector(".table");
    Table.tBodies[0].innerHTML = "";
    const jsonData = res.data; // 响应数据
    console.log(res.data, 2);
    var trs = "";
    jsonData.forEach((item) => {
      // 从关联表中获取学生姓名和课程名称
      const studentId = item.id;
      const studentName = item.Student_name;
      const studentSex = item.Student_sex;
      const chinese = item.Chinese_score;
      const math = item.Math_score;
      const english = item.English_score;
      const consolidation = item.consolidation_score;
      // 创建一行表格,并将选课数据添加到其中
      const row = `<tr>
                                <td>${studentId}</td>
                                <td>${studentName}</td>
                                <td>${studentSex}</td>
                                <td>${chinese}</td>
                                <td>${math}</td>
                                <td>${english}</td>
                                <td>${consolidation}</td>
                                <td><button class='delete' id = ${item.id}>删除</button></td>
                            </tr>`;
      // 将这一行添加到表格中
      trs += row;
    });
    Table.tBodies[0].innerHTML = trs;
    handleOper();
    setEditable(editable);
    totalTable();
    last();
  });
}

getEnrollments();

3.可配置项的设置

// 配置项
let jsonData = "";
let editable = [2, 3, 4, 5, 6]; //可编辑的列数 第 3 4 5 6列
let Regnum = /^(1[0-4][0-9]|150)$|^([1-9][0-9])$|^[0-9]$/; //正则表达式判断
let Regsex = /^(男|女){1}$/; //正则表达式判断性别
let Regnum_300 = /^([1-2][0-9][0-9]|300)$|^([1-9][0-9])$|^[0-9]$/; //正则表达式判断0-300

4.设置可编辑的单元格:

// 1.设置可编辑单元格——setEditable
function setEditable(editable) {
  let table = document.querySelector("table");
  var row_num = table.rows.length; // 获取表格行数
  for (let i = 1; i < row_num; i++) {
    let column_num = table.rows[i].cells; //获取表格列数
    let e = editable;
    editable.forEach((element) => {
      column_num[element].setAttribute("name", "editable");
    });
  }
  // click(); //点击时
}

5.点击单元格进行编辑时判断利用哪个正则表达式,并调用更新函数

 function click() {
    let editcells = document.getElementsByName("editable");
    console.log(editcells, 1);
    for (let i = 0; i < editcells.length; i++) {
      if (i == 0 || i == 5 || i == 10 || i == 15) {
        editcells[i].onclick = function () {
          updateCell(this, Regsex);
        };
      } else if (i == 4 || i == 9 || i == 14 || 19) {
        editcells[i].onclick = function () {
          updateCell(this, Regnum_300);
        };
      } else {
        editcells[i].onclick = function () {
          updateCell(this, Regnum);
        };
      }
    }
  }

6.更新函数(此处暂时只能判断是否符合修改规则,进行单元格数据的修改,没有利用axios发送post请求进行json文件数据的更改)

// 3.数据更新、验证规则——updateCell
  function updateCell(element, Reg) {
    if (document.getElementsByClassName("new_input").length == 0) {
      //  获取当前数据
      let old_value = element.innerText;
      element.innerHTML = "";

      // 创建新元素input
      var input = document.createElement("input");
      input.value = old_value;
      input.setAttribute("class", "new_input");
      input.type = "text";
      element.appendChild(input);

      input.focus();
      // 失去焦点时——确认修改
      input.onblur = function () {
        // this.value = parseFloat(this.value);
        console.log(this.value);
        console.log(this.type);
        // 判断是否符合修改规则
        /* if (isNaN(this.value)) {
          this.value = old_value;
        } else { */
        if (!Reg.test(this.value)) {
          console.log("error", this.value, Reg);
          this.value = old_value;
          // updateData()
          // 错误提示
          alert("不符合规则");
          this.classList.remove("new_input");
          return;
        } else {
          element.innerHTML = this.value;
        }
        // }
        // document.querySelector(".new_input").remove();
      };
    } else {
      console.log("ERROR-input.length!=0");
    }
  }
  function updateData() {
    //利用instance.post().then()更新json数据
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vben是一款基于Vue.js框架开发的前端组件库,提供了丰富的可视组件和工具,方便开发人员快速构建数据可视的网页应用。在vben中,大数据量可编辑表格可能会出现卡顿的情况。 首先,大数据量意味着表格中包含的数据量非常庞大,可能达到成千上万条记录。在渲染这么大量的数据时,就需要消耗较多的计算和内存资源。如果浏览器或设备的性能不够强大,就可能导致表格在进行数据更新和渲染时出现卡顿的现象。 其次,可编辑表格需要实时监听用户的操作,并及时更新表格中的数据。这个过程也需要进行数据的计算和更新,当数据量较大时,这个过程就会变得更加耗时,从而导致表格的卡顿。 为了解决这个问题,可以采取以下的优措施: 1. 数据分页加载:将大数据量分为多个页面进行加载,每次只加载当前页面所需的数据,这样可以降低渲染负担和提高数据更新的速度。 2. 虚拟滚动:只渲染当前可见的部分数据,随着用户滚动表格,再动态加载其他数据。这样可以减少DOM元素的数量,优性能。 3. 合理使用缓存:合理使用缓存机制,尽可能减少重复的计算和请求,提高数据的读取和更新效率。 4. 优算法和数据结构:通过优算法和数据结构,减少不必要的计算和数据操作,提高整体的性能。 总之,处理大数据量可编辑表格卡顿的问题需要综合考虑各种因素,包括数据量、设备性能、算法优等。通过合理的优措施,可以提升表格的更新和渲染效率,降低卡顿的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值