在AJAX请求回数据之后,我们要将这些数据渲染到页面DOM树上。此时,我们有三种方式:

1. 创建元素

最最基本的方法

// 1 创建h2
var h2 = document.createElement("h2");
// 2 创建div
var div = document.createElement("div");
// 3 设置innerHTML
h2.innerHTML = arr[i].title;
// 4 设置innerHTML
div.innerHTML = arr[i].log;
// 5 添加到li中
li.appendChild(h2);
// 6 添加到li中
li.appendChild(div);
// 以上代码可行,但是略繁琐,而且上树次数太多会引起多次重绘和回流。会影响效率。

2. 单行字符串拼接

将所有的html元素,看成一个元素的内部文案,这样就将“创建元素”这个行为转变成“拼接字符串”。

str += "<h2>" + arr[i].title + "</h2><div>" + arr[i].log + "</div>";

此种方式,在dom结构简单的时候可行, 但是当要上树的dom结构复杂的时候,单行字符串拼接很可能会看不清楚标签的嵌套关系,修改不方便

3. template模板字符串

underscore使用template模板字符串

template_.template(templateString, [settings])

将 JavaScript 模板编译为可以用于页面呈现的函数, 对于通过JSON数据源生成复杂的HTML并呈现出来的操作非常有用。 模板函数可以使用 <%= … %>插入变量, 也可以用<% … %>执行任意的 JavaScript 代码。 如果您希望插入一个值, 并让其进行HTML转义,请使用<%- … %>。 当你要给模板函数赋值的时候,可以传递一个含有与模板对应属性的data对象 。 如果您要写一个一次性的, 您可以传对象 data 作为第二个参数给模板 template 来直接呈现, 这样页面会立即呈现而不是返回一个模板函数. 参数 settings 是一个哈希表包含任何可以覆盖的设置 _.templateSettings.

var compiled = _.template("hello: <%= name %>");
compiled({name: 'moe'});
=> "hello: moe"var template = _.template("<b><%- value %></b>");
template({value: '<script>'});
=> "<b>&lt;script&gt;</b>"

自定义方法使用模板字符串,需要三个步骤:

步骤一: 根据最终渲染出的dom结构定义模板字符串

定义模板的方式:

1. 先在真实的dom结构中使用假数据将结构与样式调整完毕。

2. 将调整完毕的html代码放在一个被改变了type类型无法执行的script标签内(最好是 type="text/template")。

3. 挖空假数据,使用特殊标签将假数据部分代替,并写入字典中目标数据的层级关系。

例如,underscore中的template模板字符串

先在真实的dom结构中使用假数据将结构与样式调整完毕

将调整完毕的html代码放在无法执行的script标签内(type="text/template")

挖空假数据,使用特殊标签<%=%>将假数据部分代替,而且underscore模板字符串中可以使用模板语法

<script type="text/template" id="template"><div><span><%=name%></span><span><%=age%></span><span><%=sex%></span><div><span><%=wife.name%></span><span><%=wife.age%></span><span><%=wife.sex%></span><div><span><%=wife.son.name%></span><span><%=wife.son.age%></span><span><%=wife.son.sex%></span></div></div></div>
</script>

步骤二:  定义格式化函数

自定义格式化函数

/** @tpl  字符串模板* @dic  数据字典* @return  返回的是格式化好的字符串*/
function format(tpl, dic) {// 将tpl中所有的<%=xxx%>、 <%=xxx.xxx%>、<%=xxx.xxx.xxx%>找出来// 定义正则表达式var reg = /<%=((\w+)(\.\w+)*)%>/g;// 替换tpl中符合正则表达式描述的那些内容return tpl.replace(reg, function(match, $1, $2, $3, $4) {// console.log($1);// $1是字典与模板的层级路径关系 我们需要按照该路径将数据提取出来并返回 // 第一步 按照.分割路径var arr = $1.split(".");// 备份dicvar result = dic;// console.log(arr);// 循环arr 并一层一层往下获取数据for(var i = 0; i < arr.length - 1; i++) {// 将result指向下一层及result = result[arr[i]];}return result[arr[i]];});
}

步骤三:  使用格式化函数格式化template,并且添加到DOM结构

var aaa = format(str, data)
document.body.innerHTML += aaa;

template模板字符串相关推荐

  1. ES6, Angular,React和ABAP中的String Template(字符串模板)

    String Template(字符串模板)在很多编程语言和框架中都支持,是一个很有用的特性.本文将Jerry工作中使用到的String Template的特性做一个总结. ES6 阮一峰老师有一个专 ...

  2. ie模版字符串_字符串模板、模板字符串、Vue中使用template等等。

    1:模板字符遇新是直朋能到串 传统的一如分算需上来处一定迹面数一跳这件我子作JS语言,输出模板新直能分支调二浏页器朋代说,事刚需求是这样写的: $('#result').append( 'There ...

  3. Vue模板字符串的使用,【html标签、Element-uivue template模板渲染】

    文章目录 技术 背景 关于在vue 中 html标签的渲染与使用[v-html] 关于在vue 中element组件标签模板渲染与使用 技术 Vue父子组件传值 Vue render函数的引用 Vue ...

  4. ES6 Template String 模板字符串

    语法 模板字符串(Template String)是增强版的字符串,用反引号(`)标识,它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量. 用法 // 普通字符串 `In J ...

  5. 设计模式之——Template模板模式

    Template模式又叫模板模式,是在父类中定义处理流程的框架,在子类中实现具体处理逻辑的模式.当父类的模板方法被调用时程序行为也会不同,但是,不论子类的具体实现如何,处理的流程都会按照父类中所定义的 ...

  6. 重学ES6 模板字符串

    在两三年前,jQuery还是比较主流的开发技术,当我们要为页面添加DOM时,一般,我们是这样写的 $("#container").append('Today is <b> ...

  7. ES6中的模板字符串---反引号``

    在react中,反引号``有特殊的含义. 如MDN中所述,模板字符串(Template literals)允许嵌入表达式,并且支持多行字符串和字符串插补特性.基本语法为以下几种: 其中第一行为最基本用 ...

  8. Ansible PLaybook template 模板详解

    template 模板 模板是一个文本文件,可以做为生成文件的模版,并且模板文件中还可嵌套jinja语法 jinja2语言 网站:https://jinja.palletsprojects.com/e ...

  9. 【小白学习C++ 教程】十五、C++ 中的template模板和泛型

    @Author:Runsen template模板在 C++ 中一个简单但非常强大的工具.简单的想法是将数据类型作为参数传递,这样我们就不需要为不同的数据类型编写相同的代码. C++ 添加了两个新关键 ...

最新文章

  1. 华为昇腾师资培训沙龙·南京场 |华为昇腾 ACL 语言开发实践全程干货来了!看完就实操系列...
  2. 文件不能断点 webstorm_详解python使用金山词霸的翻译功能(调试工具断点的使用)...
  3. python 模拟抽象类
  4. fatal error C1001的一个解决心得
  5. Python基础day07 作业解析【文件操作(文件读写、文件夹操作)】
  6. aspose转pdf横版_aspose实现Office转Pdf
  7. 绑定任意格式的XML文档到WPF的TreeView
  8. 计算机二级选择题40分,2017年计算机二级选择题及答案
  9. 宏定义Define的一些用法
  10. BootStrap-
  11. jQuery 的CSS选择器 中 使用变量的方法
  12. boot客户管理系统源码_「计算机毕设」基于SpringBoot开发的仓库管理系统
  13. 已经被说“烂”的微服务,到底是个什么鬼?通过拆分实战案例来带你入门。...
  14. mysql优化 my.cnf_MySQL性能调优my.cnf详解
  15. 主机无法ping通虚拟机xp系统
  16. php 模拟登陆新浪微博,[Javascript] 爬虫 模拟新浪微博登陆
  17. 惠普打印机如何取消任务
  18. Cisco ASA 9.16(Adaptive Security Appliance (ASA) Software)
  19. 【循序渐进学运维】MySQL运维系列文章汇总
  20. Spring第一讲:谈谈你对Spring的理解?从该问题着手深入解析Spring/Spring5新特性

热门文章

  1. 源码编译freeswitch-1.10.7遇到问题总结
  2. MAX6675驱动(STM32,K 热电偶)
  3. 魔方、齿轮、融合剂:当新ICT技术邂逅教育产业
  4. python异常-binascii.Error: Incorrect padding 报错解决
  5. css加载更多动画效果,css3实现loading动画效果
  6. neo4j 出现error py2neo.database.work.ClientError [Statement.SyntaxError] Invalid input ‘W‘ expected ‘
  7. 情感计算-基于肢体动作和生理信号的情感识别
  8. PyQt5学习:通过按钮控件打开windows系统文件软件(文件资源管理器)的文件夹进行浏览文件夹下所有文件
  9. 坑人的Synchronized,请慎用!
  10. wxpython开发的上传下载功能