如何在Vapor Leaf中分配变量?实现表格模板复用
你的思路完全可行,而且这正是Leaf模板实现复用的最佳实践之一,非常适合解决这种多数据结构适配的场景。
具体实现步骤:
修改Leaf模板,抽象数据引用
把模板里所有page.table的引用替换成直接的table,让模板只关注表格本身的数据结构,不绑定到特定的页面数据路径:<div class="card shadow mb-4"> <div class="card-header py-3"> <h6 class="m-0 font-weight-bold text-primary">DataTables Example</h6> </div> <div class="card-body"> <div class="table-responsive"> <table class="table table-bordered" id="dataTable" width="100%" cellspacing="0"> <thead> <tr> #for(column in table.columns) { <th>#(column)</th> } </tr> </thead> <tfoot> <tr> #for(column in table.columns) { <th>#(column)</th> } </tr> </tfoot> <tbody> #for(row in table.rows) { <tr> #for(data in row.datas) { <td>#(data)</td> } </tr> } </tbody> </table> </div> </div> </div>(小提示:你原来的模板里有个笔误
colums,改成column更规范哦)在页面中嵌入模板时传递变量
不管是原来的page.table还是新的page.grid.table,只要在嵌入模板时把对应的数据传递给table变量即可:- 原页面(使用
page.table):#embed("your-table-template-name", table: page.table) - 新页面(使用
page.grid.table):#embed("your-table-template-name", table: page.grid.table)
- 原页面(使用
这个方案的优势:
- 完全解耦:模板不再依赖页面的特定数据结构,只要传入的
table包含columns和rows.datas结构,就能正常渲染。 - 多场景复用:不仅支持这两个页面,以后任何有类似表格结构的数据,都可以直接复用这个模板。
- 易于扩展:如果以后需要给表格加自定义配置(比如不同的ID、标题、样式类),可以给
table结构体新增属性(比如table.id、table.title),然后在模板里引用,灵活性非常高。
有没有其他可选方案?
如果你的项目中需要更灵活的上下文传递,也可以使用Leaf的#set指令在嵌入前设置变量:
#set("table" = page.grid.table) #embed("your-table-template-name")
但这种方式和直接传递参数的效果几乎一致,推荐用参数传递的方式,可读性更强,也更符合Leaf的最佳实践。
内容的提问来源于stack exchange,提问作者Terrick Mansur
相关产品推荐
相关产品推荐

