火次果
火次果

暂无菜单项

首页/文章/技术文章/web前端/HTML5/
打开 MD 链接

Handlebars 动态变量名:在 JS 层预处理

发布于 17小时前
2

Handlebars 的模板语法在编译期确定,运行期拼出来的字符串不会被当成变量名解析。期望用 {{result[0]}} 这类写法按索引取变量,模板只会把它当成一条普通路径,输出为空或原样保留。

屏幕上显示 JavaScript 代码,用于说明模板变量的数据预处理
变量名的解析发生在编译期,动态取值要前置到数据层

能做的一件事:lookup

{{lookup this fieldName}}
const html = template({ fieldName: 'title', title: '示例标题' });

lookup 接收对象与键名,适合字段名来自变量、层级只有一层的场景。嵌套路径与表达式拼接仍然不支持。

更通用的做法:在 JS 层预处理

const keys = ['title', 'author', 'date'];
const data = {
  rows: list.map((row) => ({
    cells: keys.map((key) => ({ key, value: row[key] ?? '' }))
  }))
};

const html = template(data);
{{#each rows}}
  <tr>
    {{#each cells}}
      <td data-field="{{key}}">{{value}}</td>
    {{/each}}
  </tr>
{{/each}}

把「按变量名取值」转成「按键取值后一起传进模板」,模板里只剩遍历与输出,不再依赖运行期解析。列顺序、字段白名单、缺省值都在 JS 层控制。

三个注意点

  1. 不要用 eval 或 new Function 拼表达式。模板层没有这类能力,硬加会引入注入风险。
  2. 预处理时定白名单。字段名来自外部输入时先与白名单求交集,避免把内部字段渲染出去。
  3. 转义交给模板。取值后由 {{value}} 做 HTML 转义,需要原样输出时用三个大括号并确认来源可信。

取舍

字段固定的表格直接用点路径最省事;字段名由配置或后端下发的场景,走 JS 层预处理。定下这一条之后,模板不需要为动态取值再引入自定义 helper。

常见问题(FAQ)

Handlebars 能解析拼接出来的变量名吗?
不能。模板在编译期确定访问路径,运行期拼接的字符串会被当作普通路径的一部分,不会被解析为变量名。
lookup 能用于嵌套路径吗?
不行。lookup 只支持一层键值访问,嵌套与表达式需要在传入模板前先处理好数据结构。
可以做「变量名反射」吗?
模板层没有对应能力。可行做法是在 JavaScript 中把动态键映射成实际值,再作为上下文传入模板渲染。
动态字段名会不会带来安全问题?
会。字段名来自外部输入时应与白名单求交集,避免内部字段被渲染出去,同时保留模板的输出转义。
什么时候适合写自定义 helper?
取值规则需要复用、且无法在数据层一次性完成时。单次场景优先在数据层处理,模板保持只做遍历与输出。
支持作者
如果这篇内容对你有帮助,可以请作者喝杯咖啡
0 点赞
0 收藏
分享
0 讨论
反馈
0 / 600
细中粗
0 讨论
热门最新
总结
暂无总结
嗨,下午好!
所有的成功,都源自一个勇敢的开始
创作
社区
购物
会员
近期热门

暂无数据

火次果
火次果
首页
资迅中心
小店
AI导航
社区
所有的成功,都源自一个勇敢的开始
不辜负每一个勇敢的开始
关于FAQ协议
火次果 © 2026