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. Vi 和 Vim 编辑器详细使用方法

    学习linux的一项必会技能,熟练使用vi/vim编辑器那便最重要的了.不过一堆操作看的也是太头疼了,以下整理了些常用到的命令. 工作模式 vi编辑界面有三种不同的工作模式,分别为命令模式.输入模式. ...

  2. Linux无法被远程登录;用户的关机, 重启,注销,新增用户,删除用户

    不能使用xshell连接到我的Linux服务器 通过再windows的cmd中ping了我的Linux地址,发现网络不通. 查看百度发现是因为网络没有选桥接模式,然后选完桥接模式告诉我: 然后发现没有 ...

  3. PAT甲级1011水题飘过

    题目分析:对于输入的数据分三条,选出每条中最大值记录下来,按照题目要求算出最大可能的获利即可 #include<iostream> using namespace std; ]; //k数 ...

  4. 洛谷 P2725 邮票题解

    题目背景 给一组 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K —— 表示信封上能够贴 K 张邮票.计算从 1 到 M 的最大连续可贴出的邮资. 题目描述 例如,假设有 1 分和 3 ...

  5. jmeter+nmon+crontab简单的执行接口定时压测

    一.概述 临时接到任务要对系统的接口进行压测,上面的要求就是:压测,并发2000 在不熟悉系统的情况下,按目前的需求,需要做的步骤: 需要有接口脚本 需要能监控系统性能 需要能定时执行脚本 二.观察 ...

  6. python测试开发django-rest-framework-65.序列化(ModelSerializer)

    前言 serializers.Serializer可以对modle模型中的字段序列化,并且必须写create和update两个方法.ModelSerializer可以看成是Serializer的一个升 ...

  7. jdk8的32位下载

    下载地址:http://www.wmzhe.com/soft-30119.html#download

  8. eclipse正常启动,debug无法启动,解决办法

  9. 08.vue-router动态路由匹配

    动态匹配路由的基本用法 思考: <!-有如下3个路由链接.-> <router-link to="/user/1">User1</router-lin ...

  10. 【http】认识HTTP

    HTTP基础概念 我们学计算机网络的时候就知道,我们把计算机网络分层了5层,一般我们现在用的都是TCP/IP这么一个分层结构. 虽然官方的是ISO 提出的7层结构,但是仅仅是理论基础,在实际上大多人都 ...