
在网页中实现一个动态变化的库存计数器,通常会涉及到dom元素的更新和数据持久化。常见的做法是使用一个<span>元素配合javascript来显示和更新数量,并通过localstorage来保存当前计数,以便页面刷新后能恢复状态。然而,当需要在同一页面上展示多个独立的库存计数器时,这种方法会遇到显著的问题:
简单地复制脚本并修改ID并不能解决localStorage共享的问题,因为每个脚本实例仍然会尝试读写同一个localStorage键,导致行为不一致。为了解决这些挑战,我们需要一种更组件化、更封装的解决方案。
JavaScript的自定义元素(Custom Elements)提供了一种强大的方式来创建可重用的组件,它们拥有自己的生命周期、属性和方法,并且能够封装内部逻辑和状态。通过自定义元素,我们可以为每个库存计数器创建一个独立的实例,从而避免上述问题。
我们将创建一个名为<stock-counter>的自定义元素。每个<stock-counter>实例都可以独立地管理其库存数量,并可选择通过唯一的storage-key在localStorage中进行持久化。
以下是定义<stock-counter>自定义元素的完整代码:
customElements.define('stock-counter', class extends HTMLElement {
// quantity 属性的 getter 方法
get quantity() {
// 检查是否设置了 storageKey 且 localStorage 中存在有效值
if (this.storageKey !== null) {
const value = Number(localStorage.getItem(this.storageKey));
// 如果值是有效数字且不为0,则使用 localStorage 中的值
if (!Number.isNaN(value) && value !== 0) {
return value;
}
}
// 否则,从元素的 quantity 属性中获取初始值
const value = Number(this.getAttribute('quantity'));
// 如果 quantity 属性值无效,则返回 0
if (Number.isNaN(value)) {
return 0;
}
return value;
}
// quantity 属性的 setter 方法
set quantity(value) {
if (!isNaN(value)) {
// 如果设置了 storageKey,则将新值保存到 localStorage
if (this.storageKey !== null) {
localStorage.setItem(this.storageKey, value);
}
// 更新元素的 quantity 属性
this.setAttribute('quantity', value);
}
}
// storageKey 属性的 getter 方法
get storageKey() {
return this.getAttribute('storage-key');
}
// 当元素被添加到文档时调用
connectedCallback() {
this.count(); // 启动计数器
}
// 核心计数逻辑
count = () => {
const qty = this.quantity; // 获取当前数量
this.textContent = qty; // 更新元素显示的文本内容
if (qty === 0) {
return; // 如果数量为0,停止计数
}
let parts = Math.floor((Math.random() * 3) + 1); // 随机生成减少的数量 (1-3)
if (parts > qty) {
parts = qty; // 如果减少量大于当前数量,则减少量等于当前数量
}
this.quantity -= parts; // 更新数量(通过 setter 会自动更新 localStorage 和属性)
const msec = Math.floor(((Math.random() * 15) + 15) * 1000); // 随机生成延迟时间 (15-30秒)
setTimeout(this.count, msec); // 在指定延迟后再次调用 count 方法
};
});customElements.define('stock-counter', class extends HTMLElement { ... });:
quantity 属性(getter 和 setter):
storageKey 属性(getter):
connectedCallback():
count() 方法:
一旦自定义元素被定义,你就可以像使用任何标准HTML标签一样在页面中使用它。
<!-- 第一个库存计数器:初始数量40,使用 "countdown-one" 作为 localStorage 键 --> <stock-counter quantity="40" storage-key="countdown-one">40</stock-counter> <!-- 第二个库存计数器:初始数量50,没有设置 storage-key,因此不会持久化 --> <stock-counter quantity="50">50</stock-counter> <!-- 第三个库存计数器:初始数量80,使用 "countdown-three" 作为 localStorage 键 --> <stock-counter quantity="80" storage-key="countdown-three">80</stock-counter>
在上面的示例中:
通过采用自定义元素,我们能够优雅地解决在同一页面上部署多个独立动态库存计数器的难题,为产品展示、活动倒计时等场景提供了强大而灵活的解决方案。这种组件化的方法不仅使代码更清晰,也大大提升了开发效率和用户体验。
以上就是在同一页面实现多个独立库存计数器:利用自定义元素解决状态隔离问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号