684 字
3 分钟
详细解读:如何用原生 JavaScript 实现功能齐备的购物车

购物车不仅是电商平台的核心,也是前端面试中考察事件处理节点操作业务逻辑闭环的经典题目。本文将带你从零开始,使用原生 JavaScript 构建一个逻辑严密的购物车系统。

一、 购物车逻辑架构图#

在动手写代码前,我们需要理清“数据”、“视图”与“交互”的关系:

二、 核心功能模块设计#

我们将功能拆解为四个核心模块,确保代码的可维护性。

1. 商品列表动态渲染#

在实际开发中,商品数据通常来自 API。我们使用 template literals(模板字符串)来代替繁琐的字符串拼接,使代码更易读。

// 使用 ES6 语法优化渲染逻辑
const renderProductList = (data) => {
const oUl = document.querySelector("#box ul");
oUl.innerHTML = data.map((item, index) => `
<li>
<div class="pro_img"><img src="${item.imgUrl}" width="150" height="150"></div>
<h4 class="pro_name"><a href="#">${item.proName}</a></h4>
<p class="pro_price">${item.proPrice}元</p>
<p class="pro_rank">${item.proComm}万人好评</p>
<div class="add_btn" data-index="${index}">加入购物车</div>
</li>
`).join('');
};

2. 事件委托:处理动态生成的节点#

由于购物车里的商品是动态添加的,直接给“删除”或“加减”按钮绑定事件会导致新生成的按钮失效。事件委托是最佳解决方案。

3. 核心交互逻辑实现#

我们通过监听购物车容器的点击事件,通过 target.classList 来判断用户点击的是哪个功能按钮:

// 统一管理购物车内的点击行为
oCar.onclick = function(e) {
const tar = e.target;
// 数量增加
if (tar.classList.contains('count_i')) {
let numNode = tar.parentNode.querySelector('.c_num');
numNode.innerText = parseInt(numNode.innerText) + 1;
updateSubtotal(tar);
}
// 选中/取消选中
if (tar.classList.contains('i_check')) {
tar.classList.toggle('i_acity');
checkAllStatus(); // 检查是否需要同步更新全选按钮
}
getAmount(); // 无论什么操作,最后统一计算总价
};

三、 性能与体验优化建议#

1. 数据驱动 (State Management)#

目前的实现是直接从 DOM 节点读取价格和数量。在大型项目中,建议先维护一个 cartList 数组(状态),每次操作先修改数组,再根据数组渲染视图。这能避免频繁读取 DOM 带来的性能损耗。

2. 防抖与节流 (Debounce & Throttle)#

当用户疯狂点击“+”号时,不应立即向后端发送请求。可以使用节流技术,在用户停止点击后的 300ms 再同步最终数量。

3. 本地持久化#

使用 localStorage 存储购物车数据,确保用户刷新页面后,选中的商品不会消失。


四、 总结#

实现购物车的难点不在于 UI 布局,而在于状态同步。当数量变化、选中状态变化或删除商品时,必须确保“小计”与“总计”能实时反馈准确。

详细解读:如何用原生 JavaScript 实现功能齐备的购物车
https://sw.rscclub.website/posts/javascriptgwcgnsx/
作者
杨月昌
发布于
2018-01-18
许可协议
CC BY-NC-SA 4.0