前端MVVM 模式有点很多,完全摆脱了意大利面条式的代码。

个人认为,所有MVVM 的框架基础就是一个高性能的JS模板引擎,它极大简化了 DOM 操作, 使页面渲染和业务逻辑彻底分离.

为了理解模板引擎原理(zhaungbi),所以我折腾了一个简化版的模板引擎.可以实现数据绑定,三元表达式, for 循环和 if 判断.

如何实现三元表达式, for 循环和 if 判断,将在下一篇介绍.

HTML 模板

下面是我定义好的html 模板字符串。

var template = `
<div>
<span>
{{number}}
</span>
</div>
`;

这是我的数据

var scope ={
number:10
}

好了,现在怎么把数据渲染到模板上面呢?

很自然的想到 正则表达式

正则替换

第一步 ,可以使用字符串的replace 函数。

这是正则

   var regex = /\{\{([A-Za-z_\$]+[A-Za-z0-9_\$]*)\}\}/g;

好了,现在编写一个函数,我把我的模板引擎就叫 SS。

var SS = (function() {
var regex = /\{\{([A-Za-z_\$]+[A-Za-z0-9_\$]*)\}\}/g;
var result = ""; var ss = {};
ss.Render = function(template, scope) {
result = template.replace(regex, function(a, b) {
b = b.trim();
return scope[b];
})
return result;
}
return ss;
})()

测试一下

SS.Render(template,scope);

这是结果

但是,仅仅渲染一级属性的模板引擎有什么用呢?

渲染多级属性

在这里,渲染多级属性还是分为两种。

  • 变量属性 (不知道这么称是否准确,就是类似于 person.name)
  • 数组属性 (数组元素,key 必须是数字类型)

这里,先解决变量属性

变量属性

首先,需要一个新的正则表达式

      var regex = /\{\{([A-Za-z_\$]+(\.[A-Za-z_\$]+|[A-Za-z0-9_\$])*)\}\}/g;

正则写的很烂,如果发现错误希望不吝赐教

html 模板

var template =
`
<div>
{{title}}
<ul>
<li>{{item.name}}</li>
<li>{{item.age}}</li>
<ul/>
<div>
`

按照上面模板匹配的数据

var scope = {
title:"hello",
item:{
name:'pawn',age:15
}
}

渲染函数

ss.Render = function(template, scope) {
result = template.replace(regex, function($, $1) {
$1 = $1.trim();
var innerdata = scope;
var items = $1.split('.');
for (var i = 0; i < items.length; i++) {
innerdata = innerdata[items[i]];
}
return innerdata;
}); return result;
}

在这里考虑到元素的属性,所以将{{}} 中包含字符'.' 也匹配出来,再使用'.'分割,然后依次向下寻找

测试代码

var res = ss.Render(template, scope);
console.log(res);

这是结果:

貌似这个模板引擎已经具有雏形了

数组属性

在这里,要是正则能够匹配上[] ,而且里面必须是数字

 var regex = /\{\{([A-Za-z_\$]+(\[\d+\]+|\.[A-Za-z_\$]+|[A-Za-z0-9_$])*)\}\}/g;

这个正则主要是匹配形如 items[0].name 类型.

变量名必须是字母下划线或者$ 符号打头,后面必须是 [],.[A-Za-z_$] 或者

[A-Za-z0-9_$]

如果正则有错,还忘各位不吝赐教.

形如,items[0].name.a.b 中,可以使用'.' 来分割字符串,然后进行迭代找到最终数据.

在每一次迭代中,可以使用 /[\d+]/.test(items[i]) 来判断是否包含'[]',如果包含,那么使用/[\d+]/循环匹配取出其中每一项.

总体代码就是这样

  ss.Render = function (template, scope) {
result = template.replace(regex, function ($, $1) {
$1 = $1.trim();
var innerdata = scope;
var items = $1.split('.'); for (var i = 0; i < items.length; i++) {
var m;
if (/\[\d+\]/.test(items[i])) {
innerdata = innerdata[items[i].split('[')[0]];
var reNumber = /\[(\d+)\]/g;
while (m = reNumber.exec(items[i])) {
innerdata = innerdata[m[1]];
}
}
else {
innerdata = innerdata[items[i]];
}
}
return innerdata;
});

html 模板

var template =
`<div>
{{title}}
<ul>
<li>
name:{{items[0].name}}
<br />
age:{{items[0].age}}
<br />
sex:{{items[0].sex}}
</li>
<li>
name:{{items[1].name}}
<br />
age:{{items[1].age}}
<br />
sex:{{items[1].sex}}
</li>
<ul/>
<div>
`;

模板数据

var scope = {
title: "person list",
items: [{
name: 'pawn',
age: 21,
sex: 1
}, {
name: 'jk',
age: 30,
sex: 0
},] }

测试

console.log(SS.Render(template, scope));

结果

结束

SS 模板中简单的数据绑定就已经实现.

在 SS 前端模板引擎.(二) 中会插入 三元表达式,for循环和if条件判断

SS - DIY一个前端模板引擎.(一)的更多相关文章

  1. DIY一个前端模板引擎.(一)

    前端MVVM 模式有点很多,完全摆脱了意大利面条式的代码.个人认为,所有MVVM 的框架基础就是一个高性能的JS模板引擎,它极大简化了 DOM 操作, 使页面渲染和业务逻辑彻底分离.为了理解模板引擎原 ...

  2. Mustache.js前端模板引擎源码解读

    mustache是一个很轻的前端模板引擎,因为之前接手的项目用了这个模板引擎,自己就也继续用了一会觉得还不错,最近项目相对没那么忙,于是就抽了点时间看了一下这个的源码.源码很少,也就只有六百多行,所以 ...

  3. JST(JavaScript Trimpath)前端模板引擎简介

    JST(JavaScript Trimpath)前端模板引擎简介及应用 今天在做某系统日志列表的时候用到了这个玩意儿.刚开始只是根据别人的例子照葫芦画瓢完成了日志列表及对应详情,晚上有空了才仔细去网上 ...

  4. artTemplate-优秀的前端模板引擎

    artTemplate-优秀的前端模板引擎 1.html中引入artTemplate的js文件: <script type="text/javascript" src=&qu ...

  5. 前端模板引擎doT.js的用法

    简介 一款简单好用的前端模板引擎 用法 <script type="text/javascript" src="js/doT.min.js">< ...

  6. 前端模板引擎artTemplate.js

    . 关于artTemplate模板引擎的详细原理请移步高性能JavaScript模板引擎原理解析,本文只探讨如何使用.初学前端的人一般对于绑定数据都是使用原生js或者jquery来拼接字符串,此为ha ...

  7. jquery template.js前端模板引擎

    作为现代应用,ajax的大量使用,使得前端工程师们日常的开发少不了拼装模板,渲染模板 在刚有web的时候,前端与后端的交互,非常直白,浏览器端发出URL,后端返回一张拼好了的HTML串.浏览器对其进行 ...

  8. 前端模板引擎doT.js的使用

    前言 我们在做前端开发时,经常需要根据后台返回的json数据动态生成html并插入到页面中显示.最简单的方法就是通过jQuery去遍历数据拼接html,如以下: <script> var ...

  9. Java 前端模板引擎学习:thymeleaf 模板引擎

    模板引擎接口 ITemplateEngine 一.后台数据与外部数据 1.处理后台数据 $表达式是个变量表达式,用于处理在  request parameters and the request, s ...

随机推荐

  1. homework-01

    我的GitHub账户名是Firedamp. 其实我最一开始看到最大子序列的和这个题目,最先想到的就是最简单的O(n^3)的算法,在课堂上教的也确实是这个程序,但是这种算法的时间复杂度必然是最高的,在数 ...

  2. Jtable 表格按多列排序(支持中文汉字排序)

    这两天公司让做一个Jtable表格的排序,首先按A列排序,在A列相等时按B列排序,B列相等时按C列排序,ABC三列可以任意指定,最多分三列,这样的一个需求.由于我是大神,所以必须做了出来.ok,不自恋 ...

  3. Devexpress EXCEL导出

    #region EXCEL导出 /// <summary> /// EXCEL导出 /// </summary> /// <param name="saveFi ...

  4. redis配置文件英译汉

    # By default Redis asynchronously dumps the dataset on disk. This mode is # good enough in many appl ...

  5. JQuery 获取父级元素、同级元素、子元素等

    例: <div> <div id="div_1">这是内容1</div> <div id="div_2">这是内 ...

  6. 不需要sql进行计算数据的平均值、最大值、最小值、和

    介绍下SqlServer.前端js.后台C#三个阶段对均值.最大值.最小值.和计算int[] jisuan = {0, 1, 3, 5, 7,8 }; List<int> jisuan2 ...

  7. 浏览器中CSS的BUG

    对于web2.0的过度,请尽量用xhtml格式写代码,而且DOCTYPE 影响 CSS 处理,作为W3C的标准,一定要加 DOCTYPE声明. 其它请参考:CSS hack 针对IE6,IE7,fir ...

  8. Expert 诊断优化系列------------------给TempDB 降温

    前面文章针对CPU.内存.磁盘.语句.等待讲述了SQL SERVER的一些基本的问题诊断与调优方式.为了方便阅读给出导读文章链接方便阅读: SQL SERVER全面优化-------Expert fo ...

  9. ABP理论学习之N层架构

    返回总目录 自从写这个系列博客之后,发现很多园友还是希望有个直接运行的demo,其实在github上就有官方的demo,我直接把这demo的链接放到这里吧,另外,我分析,这些找不到demo的同学,很可 ...

  10. 让浏览器不再显示 https 页面中的 http 请求警报

    HTTPS 是 HTTP over Secure Socket Layer,以安全为目标的 HTTP 通道,所以在 HTTPS 承载的页面上不允许出现 http 请求,一旦出现就是提示或报错: Mix ...