模板引擎?看这一篇就懂了

article/2025/11/9 16:27:13

概念

模板引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,这就大大提升了开发效率,良好的设计也使得代码重用变得更加容易。

光看生硬的概念没有用,接下来我来给大家详细解释,这模板引擎究竟是何物?

假设现在你打开电脑浏览器,进入某宝的网站,然后输入“笔记本”,唰的一下页面上就出现了琳琅满目的商品,让你是应接不暇,然后你又输入了“辣条”,一下子页面上又是不一样的商品了,这个时候,疑问就产生了:页面上的这些商品究竟是直接写在页面上的还是实时渲染的呢?

毫无疑问,这些展示的商品肯定是实时渲染出来的,如果直接写死在页面上,那么我们每次输入不同的关键词查找,都需要一个新页面,这样会导致占用的内存太大了,完全不划算,而模板引擎的作用就在这体现出来了,它可以根据从数据库中实时取出来的数据对html页面实时的渲染,这,就是模板引擎。

实例

下面举个例子
请添加图片描述
上图是从后端数据库中取出来的数据,可以看到,取出来的原始数据是有些不符合格式的,因此我们渲染数据之前,还需要把原始数据格式化一下,得到可以直接渲染的数据
请添加图片描述
格式化数据的同时,我们还要对需要返回的数据部分的默认值进行设置

这里采用正则表达式来去掉原始数据中productTitle的开头部分的"PTD!6-"

productTitle = productTitle.replace(/PTD16-/gi, '');

这里用到空值合并运算符"??"来设置默认值

productTitle = productTitle ?? '暂无信息';

空值合并运算符 ?? 提供了一种简短的语法,用来获取列表中第一个“已定义”的变量(译注:即值不是 null 或 undefined 的变量)。

下面我们先自己写一个编译模板来生成渲染数据
请添加图片描述
这里用到了es6的模板字符串,也就是反引号``,它既可以当做普通的字符串进行拼接,同时也可以嵌入变量,像上图中的

${item?.productImgUrl ?? '暂无信息'}
${item?.productTitle ?? '暂无信息'}
${item?.productDesc ?? '暂无信息'}
${item?.productPrice ?? '暂无信息'}

这四个就是嵌入字符串中的变量,然后通过循环填入相应的数据,最后通过li标签的这个模板,可以通过数据来生成这部分的html页面

因为这里我们是采用的面向对象的写法,所以无论是格式化函数,编译模板函数,都是类的成员函数
请添加图片描述
renderHtml函数中只需要渲染页面就行了

renderHtml() {//渲染页面this.parentEle.innerHTML += this.templateHtml;}

还有不要忘了在这些之前需要实例化类

new TempRender(productData, '#product-list');

html标签部分,只需要一个ul标签,id为’product-list’即可

<body><ul id="product-list"></ul>
<body>

最后渲染出来的页面如图
请添加图片描述
虽然最后渲染成功了,但是对不同的标签或者不同的工程,我们又需要重新写模板,这样会显得十分繁琐,所以接下来我们就使用模板工具,现在市面上的模板工具特别多,我们今天用到的是art-template

模板引擎工具:art-template

模板工具使用十分简便,我们访问art-template官网查看文档就可以知道使用方式
请添加图片描述
在文件中引入相应的js文件后,我们要了解这个工具的语法,在文档中查看

在了解语法之前,我们先来了解一下在实际运用中我们怎么使用模板引擎

	let oUl = document.querySelector('#product-list');let templateHtml = template('testTemp', formatData(productData));oUl.innerHTML = templateHtml;function formatData(data) {//格式化原始数据,并返回需要渲染的数据部分let list = data.list;data.list = list.map(({ productImgUrl, productTitle, productDesc, productPrice, productCount }) => {productPrice = productPrice / 100;productTitle = productTitle.replace(/PTD16-/gi, '');productImgUrl = productImgUrl || 'img/1.webp';productTitle = productTitle ?? '暂无信息';productDesc = productDesc || '暂无信息';productPrice = productPrice || '暂无信息';return {productImgUrl,productTitle,productDesc,productPrice,productCount}})return data;}

这里的原始数据还是和之前一样,但是在这里我们不用书写编译模板,而是直接调用template这个函数,我们传入’testTemp’和经过处理后的数据两个参数,强大的模板工具就会给我们返回已经编译好的html部分,然后我们只需要将其渲染上页面就可以看见效果了

这里有个点,那就是’testTemp’这个参数是干嘛的,我们找到id为’testTemp’的标签
请添加图片描述
这里要注意,script标签的type的值一定是’text/template’,这是模板引擎规定的格式
可以看到,这个标签中写的就是模板的语法,关于语法,我们再次查看文档
请添加图片描述
因为原始语法太过于复杂,所以我们使用标准语法
标准语法十分容易上手,在需要渲染的数据的部分使用{{}}来嵌入相应的变量就可以了,我们还可以在模板中使用,循环,if语句等特殊的语句,但是我们一般只采用这些语句来更方便的渲染数据,像

{{set price = $value.productPrice}}

这类的编程类语句,不适合在模板内出现

上面我们说到使用template函数传入两个参数,第一个是引擎指定的类型,第二个则是处理后的数据,传入的数据在上面这个模板中是一个顶级变量,因为数据是一个JSON对象的格式,其中有一个’title’和一个’list’,这两个变量在{{}}中都是可以直接使用的

<h1>{{title}}</h1>
{{each list}}

如直接使用title变量和对list变量进行循环,在循环中每一项的值可以用’$value’来表示,因此我们可以看到在循环中
注意:’$index’是每一项的下标

{{each list}}<li>{{set price = $value.productPrice}}<img src="{{$value.productImgUrl}}" alt=""><h3 class="title">{{$value.productTitle}} {{$index}}</h3><p class="desc">{{$value.productDesc}}</p><p class="price"><span>{{price}}</span>元起</p>{{if $value.productCount == 0}}<i style="color:red">无货</i>{{/if}}{{if $value.productCount != 0}}<i style="color:green">有货</i>{{/if}}</li>
{{/each}}

最后我们采用模板引擎渲染出来的页面为
请添加图片描述


http://chatgpt.dhexx.cn/article/iFkotL8L.shtml

相关文章

前端模板引擎 artTemplate

artTemplate是新一代 javascript 模板引擎 特性&#xff1a;性能卓越&#xff0c;执行速度通常是 Mustache 与 tmpl 的 20 多倍&#xff08;性能测试&#xff09; 支持运行时调试&#xff0c;可精确定位异常模板所在语句&#xff08;演示&#xff09; 对 NodeJS Express 友好…

js模板引擎渲染html,JavaScript模板引擎 art-template.js 的使用

一、基本使用 1、引入模板引擎(版本为4.13.2) 2、编写模板和渲染的容器 {{title}} 3、获取模板并往模板里插入数据 var data { title: "hello world", desc: " 这是一段描述" }; var html template("test-template",data); 4、把模板渲染到页面…

前端开发--art-template模板引擎及实现原理

#博学谷IT学习技术支持# 目录 简介 安装 使用步骤 ​编辑 art-template标准语法 值输出 原文输出 条件输出 循环输出 过滤器 模板引擎的实现原理 1.基本语法 2.分组 3.字符串的replace函数 4.多次replace 5.使用while循环replace 6.replace替换为真值 实现简…

template.js——前端模板引擎

1. 什么情况下推荐使用template.js (1)在你的页面布局中存在一样的模块,可以提出公共的模块,便于维护 注:此处用到循环来减少工作量 对应代

jquery template.js前端模板引擎

1、加载模板引擎js&#xff08;jquery.tmpl.js&#xff09; 可下载链接&#xff1a;https://github.com/BorisMoore/jquery-tmpl 2、直接上代码 <script type"text/javascript" src"${ctxStatic}/web/js/jquery.tmpl.js"></script> <!--…

java 前端模板_前端模板引擎入门

模板引擎 模板引擎 起到 数据和视图分离的作用&#xff0c; 模板对应视图&#xff0c; 关注如何展示数据&#xff0c; 在模板外头准备的数据&#xff0c; 关注那些数据可以被展示。 后端模板引擎 freemarker 如下介绍&#xff0c; java后台的模板引擎&#xff0c; freemark介绍…

art-template前端模板引擎

目录 内容介绍一、使用方法二、主要API1、原文输出2、逻辑判断3、循环语句 三、代码四、页面显示五、其他1、pre标签2、code标签 内容介绍 今天我们要了解的是一款高性能的 art-template 前端模板引擎 —— template-web.js。 一、使用方法 定义容器元素通过type"text/…

前端模板引擎——handlebars

目录 一、代码二、页面显示 一、代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>handlebars 前…

ESLINT错误提示 no-unused-vars

ESLINT错误提示 no-unused-vars 使用ESLINT时遇到如下错误的提示 查阅资料得知&#xff0c;是需要使用插件 https://github.com/typescript-eslint/typescript-eslint/issues/941 全局按照 eslint-plugin-react npm install eslint-plugin-react -g 修改eslint的配置项 "e…

Jmeter书中不会教你的(2)——vars.get和${}引用区别

在上一篇中&#xff0c;我们了解了在beanshell中可以利用vars获取和设置新的变量&#xff0c;也知道了如何用log去查看日志&#xff0c;以及两种获取变量值的方法。没看过的可以点这里Jmeter书本中不会教你的&#xff08;1&#xff09;——beanshell用来获取变量和设置变量的va…

【Python报错-01】解决matplotlib在Pycharm中运行报错:vars()参数必须有__dict__属性

1 运行错误 &#xff08;1&#xff09;程序的原代码如下图所示&#xff1a; import matplotlib.pyplot as plt # 是可视化绘图工具 …… #省略了计算SSE的代码 plt.plot(range(1, 11), SSE) plt.xlabel("聚类数k", fontsize12) plt.ylabel("误差平方和SSE&…

Jmeter书中不会教你的(1)——beanshell用来获取变量和设置变量的vars

这几年Jmeter用的相对比较多&#xff0c;自己每次在做项目时也常会去翻看以前遇到的问题&#xff0c;记录的一些技巧&#xff0c;解决方案&#xff0c;也一直考虑把它整理出来&#xff0c;一来方便自己查找&#xff0c;二来也希望同行可以互相切磋。我写的这些文章不是针对Jmet…

eslint 配置no-unused-vars规则,TypeScript接口抛出“ no-unused-vars”报错

1.项目使用了typescript&#xff0c;并在.eslintrc.js中使用该配置&#xff0c;type类型接口形参检测报错 no-unused-vars: 检测未使用的变量&#xff0c;函数和函数的参数 type类型接口如下&#xff1a; 报错如下&#xff1a; 2.解决 将 “no-unused-vars” 替换成 “typesc…

mmdetection报错 TypeError: vars() argument must have __dict__ attribute

下载官方代码&#xff0c;安装好环境后第一个demo就报错 报错1、error: the following arguments are required: img, config, checkpoint 添加-- 报错2、manager_pyplot_show vars(manager_class).get("pyplot_show")TypeError: vars() argument must have __dict_…

Pycharm使用matplotlib报错:TypeError: vars() argument must have __dict__ attribute 解决方法

Pycharm使用matplotlib绘图时报错 问题描述 TypeError: vars() argument must have __dict__ attribute源程序&#xff1a; # -*- encoding: utf-8 -*-File : MaLearnTest01_1.py Time : 2023/03/03 09:39:05 Author : seveN1foR Version : 1.0 Contact : s…

JMeter常用内置对象:vars、ctx、prev

在前文 Beanshell Sampler 与 Beanshell 断言 中&#xff0c;初步阐述了JMeter beanshell的使用&#xff0c;接下来归集整理了JMeter beanshell 中常用的内置对象及其使用。 注&#xff1a;示例使用JMeter版本为5.1 1 vars 如 API 文档 所言&#xff0c;这是定义变量的类&am…

jmeter内置变量 vars 和props使用详解

vars和props都是jmeter的内置变量&#xff0c;且本质都是Map类型 用python语言来理解的话&#xff0c;就是字典格式 最主要两点的区别&#xff1a; vars 只能在当前线程组内使用&#xff0c;props 可以跨线程组使用 vars 只能保持String 或者Objec&#xff0c; props 是 Hash…

Ansible中vars(变量)定义

1、变量使用的原因 playbook的编写是使用yml的语法&#xff0c;虽然该语法规则较为简单&#xff0c;但是&#xff0c;同其他语法相同该语法也有变量、循环等机制的使用。变量的使用就是为了提高我们所写剧本的复用性&#xff08;当某个参数更改时&#xff0c;直接更改变量的赋…

vue3解决no-unused-vars报错

vue3解决no-unused-vars 前言添加配置 前言 在上一节&#xff0c;针对 vue3配置了ESLint&#xff0c;此时&#xff0c;App.vue 和 HelloWorld.vue 报了一个 no-unused-vars 的错误。 添加配置 vue3 是尤大写的&#xff0c;参考下尤大的配置&#xff1a;.eslintrc.js {no-u…

Jmeter内置变量vars和props

在使用jmeter作接口测试时&#xff0c;有些参数并不是明文直接传递的&#xff0c;须编码或加密后传输。此时可以使用BeanShell取样器、BeanShell前置和后置处理器等对参数进行加工处理。 vars和props都是jmeter的内置变量&#xff0c;不必先定义&#xff0c;可以直接使用 二者…