
本文介绍如何利用 dot.js 模板引擎与 jquery,在不重载页面的前提下,通过按钮实时反转并重新渲染数据列表,适用于 bootstrap 5.3 环境下的动态排序交互。
本文介绍如何利用 dot.js 模板引擎与 jquery,在不重载页面的前提下,通过按钮实时反转并重新渲染数据列表,适用于 bootstrap 5.3 环境下的动态排序交互。
在基于 Bootstrap 5.3 构建的前端模板中,若已通过 doT.js 在客户端完成数据渲染(如 entries 数组生成 .card 列表),仅调用 entries.reverse() 并不能自动更新 DOM —— 因为 doT 是一次性编译渲染,DOM 与数据并无响应式绑定。要实现“点击切换排序”,关键在于:逆转数据 → 重新编译模板 → 替换容器 HTML。
✅ 正确实现步骤
-
确保模板可复用:将 doT 模板定义为外部 HTML 文件(如 entries.html),内容如下(注意保留原始迭代语法):
<!-- entries.html --> <div id="entries"> {{~ it:entry:index}} <div class="card"> <h2>{{=entry}}</h2> </div> {{~}} </div>✅ 提示:使用 it 作为默认数据上下文变量(doT 默认),更健壮;避免硬编码 entries 变量名。
-
编写可复用的反转函数(推荐使用 jQuery + doT):
function reverseEntriesOrder() { // 1. 原地反转数组(或使用 [...entries].reverse() 创建新数组以避免副作用) entries.reverse(); // 2. 加载并编译模板(假设 entries.html 已通过 script 标签或 fetch 预加载) const template = doT.template($('#entries-template').text()); // 方式一:内联模板 // 或 const template = doT.template(templateString); // 方式二:字符串模板(需提前获取) // 3. 渲染新 HTML 并注入目标容器 const renderedHTML = template(entries); $('#entries').html(renderedHTML); // 直接替换 #entries 内容,语义清晰 }? 若模板存于外部文件,需配合 $.get() 异步加载(首次后可缓存):
$.get('entries.html', function(templateStr) { const template = doT.template(templateStr); $('#entries').html(template(entries.reverse())); }); -
绑定按钮事件(推荐脱离内联 JS):
<button type="button" id="toggleSortBtn" class="btn btn-outline-primary"> Toggle Sort Order </button> <div id="entries"><!-- 渲染区域 --></div>
$('#toggleSortBtn').on('click', reverseEntriesOrder);
⚠️ 注意事项与最佳实践
- 避免重复反转副作用:Array.prototype.reverse() 是原地操作。若需支持“升序/降序”明确控制(而非仅 toggle),建议维护一个 isReversed 状态,并用 slice().reverse() 生成新数组。
-
模板加载性能:频繁读取/编译模板影响性能。推荐将模板预编译并缓存:
const entryTemplate = doT.template($('#entries-template').text()); function reverseEntriesOrder() { entries.reverse(); $('#entries').html(entryTemplate(entries)); } - Bootstrap 兼容性:无需额外适配,.card 等组件样式由 CSS 控制,重写 HTML 后自动生效。
-
错误防护:添加空值校验:
if (!Array.isArray(entries) || entries.length === 0) return;
✅ 总结
核心逻辑不是“操作 DOM 节点顺序”,而是“更新数据 → 重绘视图”。借助 doT 的函数式模板能力与 jQuery 的便捷 DOM 操作,即可在纯客户端完成高效、可维护的排序切换,完全契合 Bootstrap 单页交互场景。无需引入 Vue/React,轻量可靠。











