组件化的可编辑数据表格

1、设计思路

本次翻转是想要设计一个动态的可编辑表格,首先要保证页面的数据是通过Ajax发送请求获取来的数据,而不是在HTML结构里面把数据写死。等数据返回来之后,将允许动态编辑的部分用input框来进行展示,而不允许修改的部分,则是直接展示到页面。并且输入的值也是有要求的,如果不满足输入条件则会弹出提示框来提醒用户输入有误,并且会将错误修改前的值重新呈现在页面中,除非用户输入正确。

2、实现方法

1、HTML结构

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <div class="table">
      <table>
        <thead></thead>
        <tbody></tbody>
      </table>
    </div>
    <script src="demo.js"></script>
  </body>
</html>

2、通过遍历axios返回回来的json数据,动态的生成表头以及初始化表格内容

3、给所有的tbody里面的input框绑定失去焦点事件,只要失去焦点事件被触发了,就会执行函数体,获取当前失焦表格所在的行和列,然后找到对应表格,就可以进行判断语句,如果输入的值转成Number类型后为NaN,或者输入的值小于0或大于100,就进行弹窗提醒,同时将修改前的初始数据重新渲染到页面对应的表格当中。如果输入合法,就替换掉当前表格的内容,同时也同步修改请求过来的数据。

4、给tbody每一行都绑定删除事件,我们在动态生成模板的时候就在最后一格里面添加了一个删除按钮,当我们点击该按钮应该触发删除事件。先找到父元素tbody,然后再通过点击时候的执行上下文this来找到当前点击的这一行,用removeChild删除点击的当前行,同时修改请求来的students数据。

3、核心代码及注解

  // 根据students动态生成表格内容 初始化
  var arr = Object.keys(students[0]);
  var flag = "";
  var tbody = document.querySelector("tbody");
  for (let i = 0; i < students.length; i++) {
    let tr = document.createElement("tr");
    for (let j = 0; j < 6; j++) {
      flag = arr[j];
      let td = document.createElement("td");
      if (j > 1 && j < 5) {
        td.innerHTML = `<input type='text' value='${students[i][flag]}'/>`;
      } else if (j == 5) {
        td.innerHTML = `<button studentId=${students[i].studentId}>删除</<button>`;
      } else {
        td.innerHTML = students[i][flag];
        td.style.cursor = "not-allowed";
      }
      tr.appendChild(td);
    }
    tbody.appendChild(tr);
  }
  // 给所有tbody的input框绑定失去焦点事件
  var inputs = document.querySelectorAll("table input");
  inputs.forEach((item, index) => {
    item.onblur = function () {
      var key,
        flag = 1;
      let row = Math.ceil((index + 1) / 3); //失去焦点时所在的横坐标
      let column = (index % 3) + 1; //失去焦点时所在的纵坐标
      for (let i in students[0]) {
        if (flag == column + 2) {
          key = i;
        }
        flag++;
      }
      // console.log(key);
      if (isNaN(Number(this.value)) || this.value < 0 || this.value > 100) {
        alert("非法操作!");
        console.log(Math.ceil((index + 1) / 3), (index % 3) + 1);
        //   console.log(arr[row - 1].key);
        this.value = students[row - 1][key]; //修改失败,原值不变
      } else {
        students[row - 1][key] = ~~this.value; //修改数据成功
        this.value = students[row - 1][key]; //展示到页面
      }
    };
  });
  // 绑定删除事件
  var buttons = document.querySelectorAll("table button");
  buttons.forEach((item) => {
    item.onclick = function () {
      console.log("更新前的students", students);
      // 删除页面显示的对应行
      tbody.removeChild(this.parentNode.parentNode);
      // 更新students表格
      students = students.filter((element) => {
        return element.studentId !== item.getAttribute("studentId");
      });
      console.log("更新后的students", students);
    };
  });
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值