LayUI模板引擎渲染数据

news2024/11/17 8:37:49

前端模板引擎介绍

接上节Spring boot项目开发实战——(LayUI实现前后端数据交换与定义方法渲染数据)

模板引擎能简化开发,极大提高效率,小编之前使用过JSP和Thymeleaf,以及python的jinja2,这些是后端的模板引擎,数据的渲染都需要借助服务器,对html重新解析,在特定标识符处填入数据。

Node第一次把JavaScript带入到后端服务器开发,js也成为后端大家族的一员,前端模板就是基于js的,模板基于js解析器使逻辑和数据之间更加清晰。

模板引擎文档 - layui.laytpl

在这里插入图片描述

占位符只起一个填充数据的作用,关键还是模板的函数:

如果模版默认的 {{ }} 分隔符与你的其它模板(一般是服务端模板)存在冲突,你也可以重新定义分隔符

laytpl.config({
  open: '<%',
  close: '%>'
});

使用模板引擎需要用script标签包裹起来,并为script标签添加id="demo" type="text/html"属性声明该段需要为模板语法。

<script id="demo" type="text/html">
...
</script>

使用script包裹有两个意义:

  1. 使用script标签包裹的html内部可以使用js语法,类似于java jsp中时使用<%-----%>包裹的部分可以是使用java代码一样;
  2. 为被包裹的部分起别名便由获取静态html;
  3. 声明script内部有模板语法需要特殊解析。

使用步骤

  • 导入模板引擎模块
 layui.use(['layer','laytpl'], function () {
         layer = layui.layer,
         laytpl = layui.laytpl;
});
  • 编写重解析页面和显示区域
<script id="demo" type="text/html">
	<div>{{d.title}}</div>
</script>
<div id="sentence"></div>

注意这里容易忽视,首先用<script>标签包裹的为冲解析页面,前端模板引擎比后端模板引擎解析复杂一些,原因在于js既是浏览器解析语言又是后端解析语言,所以需要区分,这里layui的实现方案使主动获取需要解析的部分传入模板引擎,回调函数得到页面文件。

简单来说,就是后端引擎能直接识别占位符模板语法,而js需要标注模板语法,并将解析模板传入模板引擎得到最终页面,因此该过程也是异步任务。

因此上面需要定义两个模板,一个是待解析模板,一个使最终显示模板。

  • 获取待带解析模板传入数值返回最终页面
layui.use(['layer','jquery','laytpl'], function () {
    var $ = layui.$,   //jQuery复制
        layer = layui.layer,
        laytpl = layui.laytpl;
		//定义数据
		var data = {"title":"layui模板引擎的测试!"}
		
		//获取待解析模板
		let tpl = demo.innerHTML
		//获取显示区域
		let view = document.getElementById("sentence")
		//将带解析模板和数据传入laytpl模板引擎,返回最终页面html
		laytpl(tpl).render(data,function(html){
		//将返回的html通过DOM操作赋值给显示区域
		view.innerHTML = html
	})
});

核心部分:

//定义数据(数据可以后端获取)
var data = {"title":"layui模板引擎的测试!"}

//获取待解析模板
let tpl = demo.innerHTML
//获取显示区域
let view = document.getElementById("sentence")
//将带解析模板和数据传入laytpl模板引擎,返回最终页面html
laytpl(tpl).render(data,function(html){
//将返回的html通过DOM操作赋值给显示区域
view.innerHTML = html

在这里插入图片描述
到此已经可以渲染数据了,另外需要注意的有一下几点:

  1. <div>{{d.title}}</div>占位符中的d全局未定义却可以使用,因为这是固定写法,所有模板处传入的data都会直接赋值给d。例如:
//对象定义
var data = {"title":"layui模板引擎的测试!"}

//数组定义
var data = [1,2,3,4,5]

在这里插入图片描述
在这里插入图片描述

  1. 待解析的模板可以为空,显示模板一定要存在

带解析模板为空只会什么也不显示,但是模板为空或不存在会报错。
在这里插入图片描述
3. script标签包裹的html不会显示其本身内容,也不影响布局,起css样式会在最终显示模板展现。

模板使用最多的应该是循环渲染数据和分支,layui模板的循环使用layui.each方法,分支为if

layui模板分支和循环

后端接收数据并使用模板填充数据

场景介绍:js通过DOM想html中添加数据,但数据很多时DOM操作繁琐,对于有些数据,结构一致,动态赋值有规律可寻,如下图:

在这里插入图片描述
每一行都包含一个字符串和时间。

<!--原始数据-->
 <div class="layuimini-notice">
     <div class="layuimini-notice-title" id="title">_xiao_</div>
     <div class="layuimini-notice-extra">2019-07-11 12:57</div>
 </div>
 <div class="layuimini-notice">
     <div class="layuimini-notice-title">_xiao_</div>
     <div class="layuimini-notice-extra">2019-07-11 12:57</div>
 </div>
 <div class="layuimini-notice">
     <div class="layuimini-notice-title">_xiao_</div>
     <div class="layuimini-notice-extra">2019-07-05 14:28</div>
 </div>
 <div class="layuimini-notice">
     <div class="layuimini-notice-title">_xiao_</div>
     <div class="layuimini-notice-extra">2019-07-04 11:02</div>
 </div>
 <div class="layuimini-notice">
     <div class="layuimini-notice-title">_xiao_</div>
     <div class="layuimini-notice-extra">2019-07-05 14:28</div>
 </div> 

获取后台数据:

//定义ajax获取后台数据
function newsData(){
    $.ajax({
        type: "GET",
        url: "http://localhost:8080/product/newRecord",
        data: null,
        dataType: "json",
        success: function (data) {
            console.log(data)
            //updateSaleData(data)
        }
    });
}

//定义前端模板重解析方法
//最近消费记录
function getTpl(data){
    let tpl = demo.innerHTML
    let view = document.getElementById("sentence")
    laytpl(tpl).render(data,function(html){
    view.innerHTML = html
    })
}

由于ajax和模板引擎都是异步任务,也不知道谁先执行,只能通过调用的方式使用。

回显数据
在这里插入图片描述
根据回显的数据构造显示模板:
在这里插入图片描述

<script id="news" type="text/html">
    {{#  layui.each(d, function(index, item){ }}
    <div class="layuimini-notice">
        <div class="layuimini-notice-title" id="title">{{item.sentence}}</div>
        <div class="layuimini-notice-extra">{{ item.time }}</div>
    </div>
    {{#  }); }}
</script> 
<div id="view"></div> 

在这里插入图片描述

模板引擎完整小案例:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<!--引入 layui.css -->
		<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/layui/2.4.5/css/layui.min.css">
		 
		<!-- 引入 layui.js -->
		<script src="https://cdnjs.cloudflare.com/ajax/libs/layui/2.4.5/layui.js"></script>
		<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
	</head>
	<body>
		<script id="demo" type="text/html">
			<div>{{d[0]}}</div>
		</script>
		<div id="sentence"></div>
	</body>
	<script>
		    layui.use(['layer','jquery','laytpl'], function () {
		        var $ = layui.$,   //jQuery复制
		            layer = layui.layer,
		            laytpl = layui.laytpl;
					
				//var data = {"title":"layui模板引擎的测试!"}
				var data = [1,2,3,4,5]
				let tpl = demo.innerHTML
				let view = document.getElementById("sentence")
				laytpl(tpl).render(data,function(html){
					view.innerHTML = html
				})
			});
	</script>
</html>

喜欢就关注吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/339133.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring(二)-----------如何注入bean

我们从第三方框架mybatis为引&#xff0c;看看如何往spring中注入一个bean 1、纯mybatis开发生成一个mapper对象 如果不使用spring的情况下&#xff0c;mybatis想生成一个mapper对象大概需要做下面的操作&#xff1a; 假设我们有了一个TMapper接口&#xff0c;此时获取该map…

12款开源数据资产(元数据)管理平台选型分析(三)

如上&#xff0c;是ChatGPT的百度指数和微信指数&#xff0c;继2022年12月上旬技术圈火热之后&#xff0c;因为微软、谷歌等巨头的推广加持&#xff0c;ChatGPT成为全球大众热源的话题。各大媒体都在消费这波舆论红利&#xff0c;打开微信公众号&#xff0c;劈天盖地各种姿势的…

前后端学习

最近和锴哥想搞一下前后端接口的事儿&#xff0c;但是不会&#xff0c;所以打算再学学前后端的基础知识&#xff0c;之后好抄作业&#xff0c;做缝纫机&#xff1b;达哥觉得我浮躁&#xff0c;这次一定要支棱起来&#xff1b;这次开始&#xff0c;面向openai学习。 前后端学习1…

ChatGPT (可能)是怎么炼成的

学习自李宏毅老师的课https://www.youtube.com/watch?ve0aKI2GGZNg 1.学习文字接龙 学习方式 GPT只需要在网上阅读大量的句子&#xff0c;不需要人工标注即可学习到大量句子接龙的知识 然而实际上&#xff0c;“你好”后面可以接的字有很多。实际上&#xff0c;GPT学的就是…

3、Go基础数据类型

目录一、Go数据类型二、字符串三、强制类型转换一、Go数据类型 基础数据类型 类型长度(字节)默认值说明bool1falsebyte10uint8&#xff0c;取值范围[0,255]rune40Unicode Code Point, int32int, uint4或8032 或 64 位&#xff0c;取决于操作系统int8, uint810-128 ~ 127, 0 ~…

Freemarker介绍

2. Freemarker介绍 FreeMarker 是一个用 Java 语言编写的模板引擎&#xff0c;它基于模板来生成文本输出。FreeMarker与 Web 容器无关&#xff0c;即在 Web 运行时&#xff0c;它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术&#xff0c;而且还可以用于生成 XML…

Python数据结构:概念、栈

1.概念 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。简单来说&#xff0c;数据结构就是设计数据以何种方式组织并存储在计算机中。 比如:列表、集合与字典等都是一种数据结构。 N.Wirth:“程序数据结构算法’ 2.分类 数据结…

基于comsol软件弯曲单模光纤模拟仿真

在本节中&#xff0c;主要基于实验室实际光纤单模圆柱光纤进行模拟&#xff0c;与comsol案例库文件在分析过程和建模有些差异&#xff1a; 模拟主要通过以下三个步骤进行&#xff1a;模型的几何构建、物理场的添加研究、结构处理分析来进行。 下面是第一步骤&#xff1a;几何…

unity2022.1.8之后版本的新的输入行为控制对象变化

文章目录unity2022.1.8之后版本的新的输入行为控制对象变化怎么导入&#xff1f;如何使用&#xff1f;unity2022.1.8之后版本的新的输入行为控制对象变化 我们先了解大概的逻辑。我们要设置触发行为的方式并且让他和对象的行为绑定&#xff0c;再将行为和对象绑定&#xff0c;…

SpringBoot开发规范部分通用模板+idea配置【项目通用-1】

SpringBoot开发规范通用模板 1 分页插件使用 通过MybatisPlus配置分页插件拦截器 Configuration MapperScan("com.xuecheng.content.mapper") public class MybatisPlusConfig {//定义分页的拦截器Beanpublic MybatisPlusInterceptor getMybatisPlusInterceptor() {…

Pascal版本的 - freopen

参数 filename -- 这是包含要打开的文件的名称的字符串。 mode -- 这是包含文件访问模式的字符串。它包括 - 高级编号模式&说明1个 “r” 打开文件进行读取。该文件必须存在。 2个 “w” 创建一个用于写入的空文件。如果已存在同名文件&#xff0c;则删除其内容并将该文件…

【Java容器(jdk17)】ArrayList深入源码,就是这么简单

ArrayList深入源码一、ArrayList源码解析1. MIXIN 的混入2. 属性说明3. 构造方法4. 其他方法&#xff08;核心&#xff09;iterator 和 listIterator 方法add方法remove 方法sort方法其他二、ArrayList 为什么是线程不安全的&#xff1f;体现哪些方面呢&#xff1f;三、ArrayLi…

(day12) 自学Java——集合进阶(双列集合)

目录 1.双列集合特点 Map遍历三种方式 2.HashMap 3.LinkedHashMap 4.TreeMap 5.源码解析 6.可变参数(形参个数可变) 7.Collections 8.综合练习 1.双列集合特点 ①双列集合一次需要存一对数据&#xff0c;分别为键和值 ②键不能重复&#xff0c;值可以重复 ③键和值是一…

全志H616——用C语言的形式操作数据库

sqlite3_open(const char *filename, sqlite3 **ppDb)该例程打开一个指向 SQLite 数据库文件的连接&#xff0c;返回一个用于其他 SQLite 程序的数据库连接对象。sqlite3_close(sqlite3*)该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关…

【Linux】环境变量本地变量

文章目录环境变量基本概念常见环境变量和环境变量相关的命令为什么带./运行我们的可执行程序本地变量环境变量的组织方式环境变量具有全局属性环境变量 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如&#xff1a;我们…

gRPC的简单应用

gRPC的简单应用 gRPC是由开发的一个高性能、通用的开源RPC框架&#xff0c;主要面向移动应用开发且基于HTTP/2协议标准而设计&#xff0c;同时支持大多数流行的编程语言。 官网&#xff1a;https://grpc.io/ 安装protoc 工具 https://protobuf.dev/ 安装Go插件 旧版本直接…

学习HandlerThread

HandlerThread是一个扩展了Thread的类。也就意味着它和普通的Thread类的调用没有什么区别&#xff0c;仍然要调用start()。 如上图所示&#xff0c;扩展后的HandlerThread类有一个Looper和Handler。 关于这一块的知识可以参考一下《关于Handler我们应该知道的知识》 HandlerTh…

普冉PY32系列(五) 使用JLink RTT代替串口输出日志

目录 普冉PY32系列(一) PY32F0系列32位Cortex M0 MCU简介普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单普冉PY32系列(四) PY32F002A/003/030的时钟设置普冉PY32系列(五) 使用JLink RTT代替串口输出日志 JLink …

Python-第五天 Python函数

Python-第五天 Python函数一、函数介绍1. 什么事函数二、函数的定义1.函数的定义&#xff1a;2.案例三、函数的参数1.函数的传入参数2.案例升级四、函数的返回值1.什么是返回值2.返回值的语法3.None类型4.None类型的应用场景五、函数说明文档1.函数的说明文档2.在PyCharm中查看…

脑机接口协议V1.0

脑机接口&#xff0c;有时也称作“大脑端口”direct neural interface或者“脑机融合感知”brain-machine interface&#xff0c;它是在人或动物脑&#xff08;或者脑细胞的培养物&#xff09;与外部设备间建立的直接连接通路。在单向脑机接口的情况下&#xff0c;计算机或者接…