一层的渲染

将下面的模板中的mustache语法使用给定数据渲染.
模板如下

<div id="root"><div><div><p>{{name}} - {{message}}</p></div></div><p>{{name}}</p><p>{{msg}}</p>
</div>

数据如下

const data = {name: '一个新name',message: '一个消息',msg: '哈哈哈'
}

思路

  • 首先使用document.querySelector方法获取DOM结构
  • 然后得到其所有的子元素,通过节点类型(node.nodeType)来判断其是文本节点还是元素节点
  • 如果是文本节点,则使用正则表达式来判断,文本值中是否有mustache语法.
  • 如果有则用data中的数据去替换它

知识点

  • 使用正则表达式来判断是否含有{{}}, 若有解析出其中的值.使用data中的值替换
const mustache = /\{\{(.+?)\}\}/g;  // 这个正则规则匹配`{{}}`,其中(.+?)代表任意的字符
// 获取文本节点的值, 假设是 `<p>{{ name }}</p>`
let txt = textNode.nodeValue
txt = txt.replace(mustache, function(_, g){return data[g.trim()]   // data = {name: '一个新name'}
})

实现

const mustache = /\{\{(.+?)\}\}/g;
let tmpNode = document.quertSelector('#root')
let data = {name: '一个新name',message: '一个消息',msg: '哈哈哈'
}
function compiler(template, data) {let childNodes = template.childNodesfor(let i = 0 , len = childNodes.length; i < len ; i++){let nodeType = childNodes[i].nodeTypeif(type == 3 ){// 文本节点let txt = childNodes[i].nodeValue;// 得到替换后的文本txt = txt.replace(mustache, function(_, g){return data[g.trim()]})// 将替换后的文本放到DOM中childNodes[i].nodeValue = txt} else if(type == 1) {compiler(childNodes[i], data)}}
}

深层次的渲染

  • 上面的函数只能替换简单对象,而不能替换引用类型的对象
  • 即: a.name之类的就无法替换
  • 需要使用对象深层次遍历的方法
  • 根据路径得到对象中的值
function getValueByPath(obj, path){let res = obj,currProp,props = path.split('.')while((currProp = props.shift())){if(!res[currProp]){return undefined} else {res = res[currProp]}}return res
}
function compiler(template, data){// 其他位置和上述一样// 仅改写文本节点中的...if(type == 3){// 文本节点let txt = childNodes[i].nodeValue// 得到替换后的文本txt = txt.replace(mustache, function(_, g){return getValueByPath(data, g.trim())})childNodes[i].nodeValue = txt}...
}

javascript --- vue中简单的模板渲染相关推荐

  1. spring mvc 渲染html,在Spring MVC中使用Thymeleaf模板渲染Web视图

    Thymeleaf模板是原生的,不依赖于标签库.它能在接受原始HTML的地方进行编辑和渲染.由于没有与Servlet规范耦合,因此Thymeleaf模板能够进入JSP所无法涉及的领域 如果想要在Spr ...

  2. vue中简单的小插曲

    我们现在来学习一下vue中一些简单的小东西: 首先我们必须要引入vue.js文件哦! 1.有关文本框里的checkbox js代码: new Vue({el:"#app",data ...

  3. Vue 中 强制组件重新渲染的正确方法

    作者:Michael Thiessen 译者:前端小智 来源:hackernoon 有时候,依赖 Vue 响应方式来更新数据是不够的,相反,我们需要手动重新渲染组件来更新数据.或者,我们可能只想抛开当 ...

  4. vue中父子组件先后渲染_vue父子组件钩子函数的执行顺序

    加载渲染过程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount-& ...

  5. vue中手写动态渲染左右滚动菜单栏 点击居左 以及设置scrollLeft属性设置无效的原因解决

    vue中可能会碰到无法使用框架的问题,此时需要手写左右滚动的滑动菜单栏,并且头部或者底部还有对应的标题点击定位.此时应该怎么做呢? (1)下面看结构: <div class="cour ...

  6. vue中父子组件先后渲染_vue父子组件传值(子传父,非父子组件传值)

    1. 子组件向父组件传值 子组件: <template><div>子组件:<span>{{childValue}}</span><!-- 定义一个 ...

  7. vue中父子组件先后渲染_Vue中父子组件执行的先后顺序

    前几天,朋友向我提出了一个关于Vue中父子组件执行的先后顺序问题,相信很多朋友在学习的过程中也会遇到这个问题,所以我就在此提出我自己的一些小看法. 问题如下:请问下图中父子组件执行的先后顺序? 首先, ...

  8. VUE中简单封装二次确认组件

    如何快速封装简单二次确认组件? 一.首先在src文件夹内的components文件中创建一个secn-conf.vue 二 .在secn-conf.vue页面中将弹出层.提示消息等样式写好 三 .在p ...

  9. vue中父子组件先后渲染_VUE如何实现子父组件、父子组件、兄弟组件传值

    父子组件传值: 父组件定义: 代码示例 子父组件传值: 父组件方法定义: 子组件执行父组件方法定义: methods: { closeOrOpenLeftMenu() { if (this.isLef ...

最新文章

  1. 关于程序员的59条搞笑但却真实无比的编程语录_技术/软件
  2. C#中用NPOI的excel导出
  3. linux内核启动时间优化
  4. fatal error C1010: unexpected end of file while looking for precompiled head
  5. 如何用matlab画正态分布曲线
  6. Android 系统性能优化(72)-----App启动优化
  7. Mssql高级注入笔记.txt (转自:慕容小雨BLOG)
  8. 关于暂停或终止更新的相关读书笔记
  9. 自动驾驶_高精地图与车辆协同
  10. JQuery文档信息
  11. phpStudy启动失败提示:缺少VC9运行库
  12. 小程序php上传图片到服务器,关于微信小程序上传图片到服务器的代码
  13. 2017计算机知识竞赛题,2017年《西游记》知识竞赛试题100题附答案.doc
  14. 优酷android 离线 导出来,手机优酷缓存的视频如何导出 缓存视频导出到电脑方法...
  15. python工程师学习路径
  16. 准备学python用什么电脑_001-小白学python-初入python世界
  17. jstat -gcutil 输出结果分析_助你了解jvm命令,查找JVM堆栈信息,分析性能问题
  18. java面向对象抽象类和接口
  19. springboot 模块引用_Spring Boot(三):SpringBoot多模块(module)项目搭建
  20. 风丘科技为您提供电动汽车高压测试方案

热门文章

  1. 数字图像处理技术详解程序_大学专业详解系列135——数字媒体技术(工学学士)...
  2. esp8266接收到的数据如何存放到数组中_Java中HashMap的实现原理
  3. pid调节软件_非常实用的PID算法和PID控制原理
  4. ios上架图片在线制作_不同风格gif在线制作,公众号动态图片制作方法
  5. php ziparchive(),php的ZipArchive类用法实例
  6. 充电原理_电动汽车充电桩如何设置?充电桩原理介绍
  7. GPU Gems1 - 10 电影级的光照
  8. applicationproperties不是小叶子_三角梅整株叶子发黄从这里找原因,早解决早生长!...
  9. softmax理论及代码解读——UFLDL
  10. Python10/22--面向对象编程/类与对象/init函数