组件化的可编辑数据表格

本文将介绍一个组件化的可编辑数据表格的设计思路、实现方法和核心代码及注解。同时,也会探讨基于数据的Web页面设计与开发思路和方法。

一、设计思路

在设计可编辑数据表格时,我们需要考虑以下几个方面:

1. 数据源:表格需要从哪里获取数据?如何将数据传递给表格组件?

2. 表格结构:表格应该具有哪些列?每列的数据类型是什么?如何定义表头和表格内容?

3. 编辑功能:如何实现表格的编辑功能?如何保存编辑后的数据?

4. 组件化:如何将表格封装成一个可复用的组件?

二、实现方法和核心代码及注解

1. 撰写一个可编辑的表格的大体框架,包含一个输入框和一个“新增”按钮,以及一个已经填充好数据的表格。在输入框中输入商品名称、价格和数量,点击“新增”按钮,就可以在表格中新增一行数据,同时计算出总价。表格中的数据可以随意修改,修改后总价也会自动更新:

<div id="tableBox">
      <h2 class="title">可编辑表格</h2>
      <div class="err">输入有误,请重新输入!</div>
      <div class="table1" name="add">
        <h>商品:</h>
        <input type="text" class="name" />
        <h>价格:</h>
        <input type="text" class="price" />
        <h>数量:</h>
        <input type="text" class="num" />
        <button id="add">新增</button>
      </div>

      <table class="table2">
        <thead>
          <tr>
            <th>商品</th>
            <th>价格</th>
            <th>数量</th>
            <th>总价</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td name="goods">鼠标</td>
            <td name="price">98</td>
            <td name="num">2</td>
            <td name="AllPrice">196</td>
          </tr>
          <tr>
            <td name="goods">桌子</td>
            <td name="price">150</td>
            <td name="num">3</td>
            <td name="AllPrice">450</td>
          </tr>
          <tr>
            <td name="goods">滑板</td>
            <td name="price">231</td>
            <td name="num">3</td>
            <td name="AllPrice">693</td>
          </tr>
          <tr>
            <td name="goods">钟</td>
            <td name="price">111</td>
            <td name="num">2</td>
            <td name="AllPrice">222</td>
          </tr>
        </tbody>
      </table>
    </div>

2.通过获取 DOM 元素的方式,获取了表格、价格、数量、错误提示、行和添加按钮等元素:

var stutable = document.getElementsByClassName("table2")[0];
      var prices = document.getElementsByName("price");
      var nums = document.getElementsByName("num");
      var thetips = document.getElementsByClassName("err")[0];
      var trs = document.getElementsByTagName("tr");
      var add = document.querySelector("#add");

3.给价格(prices)和数量(nums)的每个单元格添加点击事件,当单元格被点击时,会调用updateCell函数进行更新操作。其中,updateCell函数的具体实现需要进一步查看代码:

function setCellCilck() {
        for (var i = 0; i < prices.length; i++) {
          for (var j = 0; j < nums.length; j++) {
            prices[i].onclick = function () {
              updateCell(this);
            };
            nums[j].onclick = function () {
              updateCell(this);
            };
          }
        }
      }
      setCellCilck();

4.更新一个 HTML 元素的内容。具体来说,它会将该元素的原始内容保存到一个变量 oldhtml 中,然后将该元素的内容清空,并创建一个 input 元素,将其添加到该元素中。这个 input 元素的 class 属性被设置为 "active-input",并且它的 value 属性被设置为 oldhtml。当 input 元素失去焦点时,会触发一个 onblur 事件处理函数。如果 input 元素的值不是数字,或者超出了一定范围,那么会显示一个错误提示框。否则,该元素的内容会被更新为 input 元素的值,并调用 updateScore 函数更新分数。如果已经存在一个 class 为 "active-input" 的元素,则不会执行任何操作:

function updateCell(newhtml) {
        if (document.getElementsByClassName("active-input").length == 0) {
          var oldhtml = newhtml.innerHTML;
          newhtml.innerHTML = "";
          var newInput = document.createElement("input");
          newInput.setAttribute("class", "active-input");
          newInput.value = oldhtml;
          newInput.onblur = function () {
            if (!Number(this.value) || this.value > 500 || this.value < 0) {
              console.log("err");
              addAnimate();
              thetips.style.display = "block";
              return;
            } else {
              thetips.style.display = "none";
              newhtml.innerHTML = this.value == oldhtml ? oldhtml : this.value;
              updateScore();
            }
          };
          newInput.select();
          newhtml.appendChild(newInput);
          newInput.focus();
        } else {
          return;
        }
      }

5. 实现一个简单的商品列表添加功能的。当点击按钮(add)时,会创建一个新的tr元素,并将输入框中的商品名称、价格、数量和总价添加到新的tr元素中,最后将新的tr元素添加到表格(tbody)中:

 var tbody = document.querySelector("tbody");
      var goods = document.querySelector(".name");
      var price = document.querySelector(".price");
      var num = document.querySelector(".num");
      var td = document.createElement("td");
      var td2 = document.createElement("td");
      var td3 = document.createElement("td");
      var td4 = document.createElement("td");
      add.addEventListener("click", function () {
        var tr = document.createElement("tr");
        tbody.appendChild(tr);
        td.innerHTML = goods.value;
        td2.innerHTML = price.value;
        td3.innerHTML = num.value;
        td4.innerHTML = parseInt(price.value * num.value);
        tr.appendChild(td);
        tr.appendChild(td2);
        tr.appendChild(td3);
        tr.appendChild(td4);
        tbody.appendChild(tr);
      });

6. 实现更新表格中的价格和数量信息。具体来说,它遍历表格中的每一行,获取该行中的价格和数量单元格,计算出总价,并将总价更新到该行的总价单元格中。最后,调用该函数即可更新表格中的所有总价信息。

function updateScore() {
        for (let n = 1; n < trs.length + 1; n++) {
          var price1 = prices[n].querySelectorAll("td[name]");
          var num1 = nums[n].querySelectorAll("td[name]");
          var allprice = prices[n].querySelectorAll("td[name]");

          var all = 1;

          for (var i = 0; i < price1.length; i++) {
            all = parseFloat(price1[i].value * num1[i].value);

            for (var m = 0; m < allprice.length; m++) {
              allprice[m].innerHTML = all;
            }
          }
        }
      }
      updateScore();

三、拓展思考

基于数据的Web页面设计与开发思路和方法,可以从以下几个方面进行拓展思考:

1. 数据可视化:如何将数据以可视化的方式呈现给用户?如何设计数据可视化的交互方式?

2. 数据分析:如何对数据进行分析?如何设计数据分析的算法和模型?

3. 数据安全:如何保护用户数据的安全?如何防止数据泄露和攻击?

4. 数据交互:如何设计数据交互的接口和协议?如何实现数据的跨平台和跨设备交互?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值