组件化的可编辑数据表格

一、实现效果

 二、实现原理

我们建立了两个实例化对象(购物车、菜单),将菜单的数据保存在json数组中,再通过Ajax调用,当我们触发增加或者删除按钮时,进行逻辑上的计算,然后通过函数进行显示化的展示。

三、核心代码

    class Menu {
            constructor() {//创建实例对象
                this.menus = [];
            }
            loadData() {
                var xhr = new XMLHttpRequest();
                xhr.open('GET', 'menu.json', false);
                xhr.send();
                var data=xhr.responseText;
                data=JSON.parse(data);
                this.menus=data;
            }
            initHtml() {
                this.loadData();
                var cd = document.getElementById("CD");
                var html = ` <tr>
                                <th>商品名称</th>
                                <th>单价</th>
                                <th>操作</th>
                            </tr>`;
                for (var m of this.menus) {
                    html += `<tr>
                                <td style="text-align: center ;line-height:500%;">${m.name}<img src="${m.src}" alt=""></td>
                                <td>单价:<span class="CDprice">${m.price}</span></td>
                                <td>操作:<input class="CDadd" type="button" value="添加"></td>
                            </tr>`;
                }
                cd.innerHTML = html;
            }
        }//建立一个空的实例化对象(购物车),再调用函数进行添加
//菜单功能
            //添加
            Oadd(CDbut) {
                let that = this;
                //获取菜单中商品名称
                let OCDshoop = CDbut.parentNode.parentNode.firstElementChild;
                //获取菜单单价
                //获取 previousElementSibling 的 firstElementChild,这行代码可能获取待添加到购物车的商品的实际价格值
                let OCSprice = CDbut.parentNode.previousElementSibling.firstElementChild;
                //动态创建
                let Otbody = document.getElementById("GWC").firstElementChild;//获取tbody
                let Olasttr = Otbody.lastElementChild;//获取购物车最后一行
                let Otr = document.createElement("tr");//创建tr

                let OCDpName = document.getElementsByClassName("shopname");//获取购物车中所有的商品名

                let Oflagtext = false;//假设列表无重复

                for (let i = 0; i < OCDpName.length; i++) {
                    if (OCDpName[i].innerHTML == OCDshoop.innerHTML) {
                        //如果有重复的将按钮作为实参传递,调用添加商品函数
                        that.addgoods(OCDpName[i].nextElementSibling.lastElementChild);
                        Oflagtext = true;
                        break;
                    }
                }
                if (Oflagtext == false) {
                    Otr.innerHTML =
                        `<td class="shopname">${OCDshoop.innerHTML}</td>
            <td>
            <button class="butt" type="button">-</button>
            <span class="Num">0</span>
            <button class="butt" type="button">+</button>
            </td>
            <td>单价:<span class="price">${OCSprice.innerHTML}</span></td>
            <td>小计:<span class="total">0</span></td>
            <td>操作:<input class="del" type="button" value="删除"></td>
            `
                    Otbody.insertBefore(Otr, Olasttr);//将tr添加到tbody中倒数一行的之前
                    that.eventbind();
                }
            }

            addgoods(but) {//点击加按钮让数字累加
                let OaddNum = but.previousElementSibling;//获取Num元素
                OaddNum.innerHTML = Number(OaddNum.innerHTML) + 1;//点击一次让元素内容加一
                //找单价节点
                let OgoodsPrice = but.parentNode.nextElementSibling.firstElementChild;
                //找小计节点
                let OTotal = but.parentNode.nextElementSibling.nextElementSibling.firstElementChild;
                //计算小计
                OTotal.innerHTML = this.countTotal(OaddNum.innerHTML, OgoodsPrice.innerHTML);
                this.getTotalNum();
                this.gettotal();
            }
            mingoods(but) {
                let OminNum = but.nextElementSibling;//获取Num元素
                if (OminNum.innerHTML > 0) {
                    OminNum.innerHTML = OminNum.innerHTML - 1;//点击一次让元素内容减一
                    //找单价节点
                    let OgoodsPrice = but.parentNode.nextElementSibling.firstElementChild;
                    //找小计节点
                    let OTotal = but.parentNode.nextElementSibling.nextElementSibling.firstElementChild;
                    //计算小计
                    OTotal.innerHTML = this.countTotal(OminNum.innerHTML, OgoodsPrice.innerHTML);
                    this.getTotalNum();
                    this.gettotal();
                }
            }

四、总结

还需要进行购物车的数据存储,才是一个好的设计。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值