
在网页开发中,我们经常需要展示动态变化的数值,例如商品库存、限时抢购剩余数量等。一个常见的需求是在同一页面上显示多个独立的计数器,每个计数器拥有自己的初始值、更新逻辑和持久化状态。
原始的JavaScript实现通常会遇到以下问题:
为了解决上述问题,我们可以采用Web Components规范中的自定义元素(Custom Elements)。自定义元素允许开发者创建自己的HTML标签,这些标签拥有独立的JavaScript行为、样式和生命周期管理,从而实现高度封装和可重用的组件。
通过自定义元素,我们可以将库存计数器的所有逻辑(包括初始值设置、随机递减、状态持久化)封装到一个新的HTML标签中,例如 <stock-counter>。
我们设计的 <stock-counter> 元素将包含以下两个核心属性:
使用示例:
<!-- 一个带有初始值40和持久化键的库存计数器 --> <stock-counter quantity="40" storage-key="countdown-one"></stock-counter> <!-- 一个带有初始值50,但不进行状态持久化的库存计数器 --> <stock-counter quantity="50"></stock-counter> <!-- 另一个带有初始值80和持久化键的库存计数器 --> <stock-counter quantity="80" storage-key="countdown-three"></stock-counter>
在页面中,你只需要像使用普通HTML标签一样放置这些 <stock-counter> 元素,它们就会独立运行并显示各自的库存倒计时。
以下是 stock-counter 自定义元素的完整实现:
customElements.define('stock-counter', class extends HTMLElement {
// 获取当前库存量
get quantity() {
// 1. 检查是否存在 storage-key 并且 localStorage 中有保存的值
if (this.storageKey !== null) {
const value = Number(localStorage.getItem(this.storageKey));
// 如果是有效的数字且不为0,则使用 localStorage 中的值
if (!Number.isNaN(value) && value !== 0) {
return value;
}
}
// 2. 否则,从 quantity 属性获取初始值
const value = Number(this.getAttribute('quantity'));
// 如果 quantity 属性无效,则默认为0
if (Number.isNaN(value)) {
return 0;
}
return value;
}
// 设置库存量
set quantity(value) {
if (!isNaN(value)) {
// 如果设置了 storage-key,则将新值保存到 localStorage
if (this.storageKey !== null) {
localStorage.setItem(this.storageKey, value);
}
// 更新元素的 quantity 属性
this.setAttribute('quantity', value);
}
}
// 获取 storage-key 属性值
get storageKey() {
return this.getAttribute('storage-key');
}
// 当元素被添加到文档DOM时调用
connectedCallback() {
this.count(); // 启动计数器
}
// 核心计数逻辑
count = () => {
const qty = this.quantity; // 获取当前库存量
this.textContent = qty; // 更新元素的显示文本
if (qty === 0) {
return; // 如果库存为0,停止计数
}
// 随机减少的库存量 (1到3之间)
let parts = Math.floor((Math.random() * 3) + 1);
// 确保减少量不超过当前库存
if (parts > qty) {
parts = qty;
}
this.quantity -= parts; // 更新库存量 (会触发 set quantity 方法,自动保存到 localStorage)
// 随机延迟时间 (15到30秒之间)
const msec = Math.floor(((Math.random() * 15) + 15) * 1000);
setTimeout(this.count, msec); // 延迟后再次调用 count 方法
};
});customElements.define('stock-counter', class extends HTMLElement { ... });
get quantity() 和 set quantity(value)
get storageKey()
connectedCallback()
count = () => { ... };
通过采用自定义元素,我们成功地将库存计数器封装成一个独立的、可复用的组件。这种方法不仅解决了在同一页面上显示多个独立计数器的难题,还提高了代码的可维护性、可读性和模块化程度。自定义元素是构建现代、组件化Web应用程序的强大工具,能够帮助开发者创建更健壮、更易于管理的前端解决方案。
以上就是构建可复用库存计数器:使用自定义元素实现多实例显示的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号