如何将res.render()的参数传递给多层嵌套EJS模板实现跨模板传值
EJS多层模板传值的3种标准实现方案
1. 显式透传参数(你当前的写法为官方推荐的标准实现,可正常使用)
EJS的include语法原生支持第二个参数传入自定义上下文对象,你写的逻辑完全符合规范:
- 服务端渲染
home.ejs时传入tofirstejs: usercount home.ejs引入header.ejs时将tofirstejs重命名为tolastejs传入子模板header.ejs直接通过<%= tolastejs %>即可拿到对应值
如果该写法未正常渲染出值,优先排查两个常见问题:- 服务端
usercount变量是否已正确赋值,EJS渲染时未定义的变量会默认返回空值 - 多级传递时的变量名是否完全匹配,EJS变量严格区分大小写
2. 批量透传所有父级变量
如果需要将父模板可访问的所有参数全部传给子模板,不需要逐个手动声明,可以直接传入EJS内置的locals全局对象:
<!-- home.ejs 写法 --> <%- include('partials/header.ejs', locals); -%>
此时header.ejs可以直接调用所有home.ejs能访问的变量,无需单独声明传值,适合子模板需要用到多个父级参数的场景。
3. 全局挂载公共变量
如果是全站通用的参数(比如用户数、站点配置、登录状态等),可以直接在服务端挂载到res.locals对象,所有模板都能直接访问,不需要逐层传递:
// server.js 全局中间件中统一挂载公共变量 app.use((req, res, next) => { res.locals.usercount = usercount // 所有渲染的模板都能直接调用usercount变量 next() }) // 路由渲染时不需要再单独传递该参数 app .route("/") .get((req, res) => { res.render("home") })
此时home.ejs、header.ejs、signin.ejs等所有参与渲染的模板,都可以直接用<%= usercount %>拿到值,无需任何传值操作。
内容的提问来源于stack exchange,提问作者Ambattz
相关产品推荐
相关产品推荐

