TypeScript代码

import template = require('art-template/lib/template-web');

interface TemplateBindConfig {
el: string
data: object
} interface TemplateList {
els: object
template: string
} class TmpBind { el: string template: any data: object renderFn: any // 构造函数
constructor(config:TemplateBindConfig) {
// 绑定的容器id
this.el = config.el; // 注入的数据
this.data = config.data; this.renderFn = null
var nodes=document.querySelector(config.el).children;
var i=nodes.length;
if(i>0){
while(i--){
if(nodes[i].tagName.toLowerCase()=="script" && nodes[i].getAttribute("type")=="text/html"){
// 模版id
this.template = nodes[i].innerHTML;
break;
}
}
} this.render()
} // 渲染模版
render(data?): void {
if (data) {
this.data = data;
}
// 解析模版
if(!this.renderFn){
this.renderFn= template.compile(this.template);
} const source = this.renderFn(this.data);
// 更新容器的值
document.querySelector(this.el).innerHTML = source; } setData(value: any): void {
this.data=value;
this.render();
} // 重新设置模板
setTemplate(value: any): void {
this.template = value;
this.renderFn= template.compile(value);
this.render();
} // 获取数据
getData(): object {
return this.data;
} }

编译后的JavaScript

    var TemplateList = /** @class */ (function () {
function TemplateList() {
}
return TemplateList;
}());
var TmpBind = /** @class */ (function () {
// 构造函数
function TmpBind(config) {
// 绑定的容器id
this.el = config.el;
// 注入的数据
this.data = config.data;
this.template = new Array();
var nodes = document.querySelector(config.el).children;
TmpBind.getTemplates(nodes, this);
this.render();
}
TmpBind.getTemplates = function (nodes, instance) {
var i = nodes.length;
if (i > 0) {
while (i--) {
if (nodes[i].tagName.toLowerCase() == "script" && nodes[i].getAttribute("type") == "text/html") {
// 模版id
var ts = new TemplateList();
ts.el = nodes[i];
ts.template = nodes[i].innerHTML;
ts.renderFn = template.compile(ts.template);
ts.source = ts.renderFn(instance.data);
ts.els = new Array();
instance.template.push(ts);
}
if (nodes[i].children && nodes[i].children.length > 0) {
TmpBind.getTemplates(nodes[i].children, instance);
}
}
}
};
// 渲染模版
TmpBind.prototype.render = function (data) {
this.reset();
if (data) {
this.data = data;
}
for (var i = 0; i < this.template.length; i++) {
var div1 = document.createElement("div");
this.template[i].source = this.template[i].renderFn(this.data);
div1.innerHTML = this.template[i].source;
this.template[i].els = new Array();
while (div1.childNodes.length > 0) {
this.template[i].els.push(div1.childNodes[0]);
this.template[i].el.parentNode.insertBefore(div1.childNodes[0], this.template[i].el);
}
}
document.querySelector(this.el).template = this.template;
};
// 重置
TmpBind.prototype.reset = function () {
var template = document.querySelector(this.el).template;
if (template) {
for (var i = 0; i < template.length; i++) {
if (template[i].els && template[i].els.length > 0) {
var j = template[i].els.length;
while (j--) {
template[i].els[j].parentNode.removeChild(template[i].els[j]);
}
}
}
}
};
// 设置数据
TmpBind.prototype.setData = function (value) {
this.data = value;
this.render();
};
// 获取数据
TmpBind.prototype.getData = function () {
return this.data;
};
return TmpBind;
}());

示例:

<div id="div2">
这是第一个模版......
<script type="text/html">
<p>{{msg}}</p>
<ul>
{{each list as item}}
<li>{{item}}</li>
{{/each}}
</ul>
</script>
二个模版
<script type="text/html"> <ul>
{{each list as item}}
<li>{{item}}</li>
{{/each}}
</ul>
</script>
N个模版
<script type="text/html"> <ul>
{{each list as item}}
<li>{{item}}</li>
{{/each}}
</ul>
</script>
</div>
<script>
var vm = new TmpBind({
el: "#div2",
data: {
msg: "欢迎来到模版绑定的世界",
list: [1, 2, 3, 4, 5, 6, 7, 8, 9]
}
})
// 获取数据
var data = vm.getData();
// 更改数据
data.msg = "欢迎来到模版绑定的世界3333333333"
data.list.push(333) setTimeout(function () {
// 设置数据
vm.setData(data)
}, 3000) </script>

如果这篇文章对您有帮助,您可以打赏我

技术交流QQ群:15129679

 
 

利用art.template模仿VUE 一次渲染多个模版的更多相关文章

  1. 利用art.template模仿VUE

    首先先看一下Typescript代码: import template = require('art-template/lib/template-web'); interface TemplateBi ...

  2. 利用 vue-cli 构建一个 Vue 项目

    一.项目初始构建 现在如果要构建一个 Vue 的项目,最方便的方式,莫过于使用官方的 vue-cli . 首先,咱们先来全局安装 vue-cli ,打开命令行工具,输入以下命令: $ npm inst ...

  3. vue + element 动态渲染、移除表单并添加验证

    博客地址:https://ainyi.com/66 又接到新需求了吧~~ 背景 在一个大表单里,有可能会出现这种需求,用户可以自己操作动态添加.移除表单,更加个性化的效果. 常见于填写个人信息.附加内 ...

  4. Vue(服务端渲染)

    一.前言 1.服务端渲染图解                                                 2.简介服务端渲染                             ...

  5. vue服务端渲染添加缓存

    缓存 虽然 Vue 的服务器端渲染(SSR)相当快速,但是由于创建组件实例和虚拟 DOM 节点的开销,无法与纯基于字符串拼接(pure string-based)的模板的性能相当.在 SSR 性能至关 ...

  6. [vue] vue服务端渲染nuxt.js

    初始化 使用脚手架工具 create-nuxt-app 快速创建 npx create-nuxt-app <项目名> npx create-nuxt-app 执行一些选择 在集成的服务器端 ...

  7. webpack4+koa2+vue 实现服务器端渲染(详解)

    _ 阅读目录 一:什么是服务器端渲染?什么是客户端渲染?他们的优缺点? 二:了解 vue-server-renderer 的作用及基本语法. 三:与服务器集成 四:服务器渲染搭建 4.1 为每个请求创 ...

  8. vue服务端渲染之nuxtjs

    前言 本篇主要针对nuxtjs中的一些重要概念整理和代码实现! 在学习vue服务端渲染之前,先搞清楚几个概念: 什么是客户端渲染(CSR) 什么是服务端渲染(SSR) CSR和SSR有什么异同 客户端 ...

  9. art template前端模板引擎

    偶然看到后台有一段代码 采用的是art template的模板引擎 地址为 http://aui.github.io/artTemplate/ 这段代码很简洁 var html = template( ...

随机推荐

  1. python基础-函数递归

    函数递归 概念:直接或间接地重复调用函数本身,是一种函数嵌套调用的表现形式. 直接调用:在函数内部,直接调用函数本身 def foo(): print("这是foo函数") foo ...

  2. 0x01 Python logging模块

    目录 Python logging 模块 前言 logging模块提供的特性 logging模块的设计过程 logger的继承 logger在逻辑上的继承结构 logging.basicConfig( ...

  3. 树莓派安装系统+ssh登录

    一.准备工作: (1)树莓派3b (2)官网下载系统 (3)SD卡 (4)网线 (5)SDFormatter.exe (6)win32diskimager.exe (7)putty (7)笔记本 二. ...

  4. Principle如何制作动效设计?简单易学的Principle动效设计教程

    Principle for Mac是一款新开发的交互设计软件.相比 Pixate 更容易上手,界面类似 Sketch 等做图软件,思路有点像用 Keynote 做动画,更「可视化」一些. 如果您还没有 ...

  5. NUCLEO-8L152开发板中文应用笔记整理集合

    [AN5182]基于Adafruit TFT Shield与STM8 Nucleo-64板的图片查看器:https://www.yiboard.com/thread-962-1-1.html 本应用笔 ...

  6. mac 使用 brew 安装 nginx 及各种命令

    一.安装 brew install nginx 或 sudo brew install nginx 二.启动 brew services start nginx 或 sudo brew service ...

  7. Linux 文件监控之谁动了我的奶酪

    有时候配置文件会被莫名其妙的修改,但是找不到修改他的进程,从而无法抓住罪魁祸首,这时候就诞生了摄像头.呃呃,应该是audit 比如我要监控一个文件test.txt [root@hsun /]# aud ...

  8. C#使用ODP.NET(Oracle.ManagedDataAccess.dll)操作Oracle数据库

    在刚接触C#的时候由于公司使用的就是Oracle数据库,那么C#怎么连接Oracle数据库就成了首要去掌握的知识点了.在那时没有ODP.NET,但visual studio却对Oralce数据库的调用 ...

  9. ajax、axios、fetch 对比

    前言 今天在看到一个比较好的插件,写一个示例时,由于需要请求在线数据,官方给的是用 $.get(),就为了一个示例使用 JQuery 没必要. 又找了找,发现有用 fecth 的,挺方便,这里就做一个 ...

  10. CPU 的三大架构 —— numa smp mpp

    SMP 模式 SMP模式将多个处理器与一个集中的存储器相连.在SMP模式下,所有处理器都可以访问同一个系统物理存储器,这就意味着SMP系统只运行操作系统的一个拷贝. 因此SMP系统有时也被称为一致存储 ...