TypeScript代码

  1. import template = require('art-template/lib/template-web');
  2.  
  3. interface TemplateBindConfig {
  4. el: string
  5. data: object
  6. }
  7.  
  8. interface TemplateList {
  9. els: object
  10. template: string
  11. }
  12.  
  13. class TmpBind {
  14.  
  15. el: string
  16.  
  17. template: any
  18.  
  19. data: object
  20.  
  21. renderFn: any
  22.  
  23. // 构造函数
  24. constructor(config:TemplateBindConfig) {
  25. // 绑定的容器id
  26. this.el = config.el;
  27.  
  28. // 注入的数据
  29. this.data = config.data;
  30.  
  31. this.renderFn = null
  32. var nodes=document.querySelector(config.el).children;
  33. var i=nodes.length;
  34. if(i>0){
  35. while(i--){
  36. if(nodes[i].tagName.toLowerCase()=="script" && nodes[i].getAttribute("type")=="text/html"){
  37. // 模版id
  38. this.template = nodes[i].innerHTML;
  39. break;
  40. }
  41. }
  42. }
  43.  
  44. this.render()
  45. }
  46.  
  47. // 渲染模版
  48. render(data?): void {
  49. if (data) {
  50. this.data = data;
  51. }
  52. // 解析模版
  53. if(!this.renderFn){
  54. this.renderFn= template.compile(this.template);
  55. }
  56.  
  57. const source = this.renderFn(this.data);
  58. // 更新容器的值
  59. document.querySelector(this.el).innerHTML = source;
  60.  
  61. }
  62.  
  63. setData(value: any): void {
  64. this.data=value;
  65. this.render();
  66. }
  67.  
  68. // 重新设置模板
  69. setTemplate(value: any): void {
  70. this.template = value;
  71. this.renderFn= template.compile(value);
  72. this.render();
  73. }
  74.  
  75. // 获取数据
  76. getData(): object {
  77. return this.data;
  78. }
  79.  
  80. }

编译后的JavaScript

  1. var TemplateList = /** @class */ (function () {
  2. function TemplateList() {
  3. }
  4. return TemplateList;
  5. }());
  6. var TmpBind = /** @class */ (function () {
  7. // 构造函数
  8. function TmpBind(config) {
  9. // 绑定的容器id
  10. this.el = config.el;
  11. // 注入的数据
  12. this.data = config.data;
  13. this.template = new Array();
  14. var nodes = document.querySelector(config.el).children;
  15. TmpBind.getTemplates(nodes, this);
  16. this.render();
  17. }
  18. TmpBind.getTemplates = function (nodes, instance) {
  19. var i = nodes.length;
  20. if (i > 0) {
  21. while (i--) {
  22. if (nodes[i].tagName.toLowerCase() == "script" && nodes[i].getAttribute("type") == "text/html") {
  23. // 模版id
  24. var ts = new TemplateList();
  25. ts.el = nodes[i];
  26. ts.template = nodes[i].innerHTML;
  27. ts.renderFn = template.compile(ts.template);
  28. ts.source = ts.renderFn(instance.data);
  29. ts.els = new Array();
  30. instance.template.push(ts);
  31. }
  32. if (nodes[i].children && nodes[i].children.length > 0) {
  33. TmpBind.getTemplates(nodes[i].children, instance);
  34. }
  35. }
  36. }
  37. };
  38. // 渲染模版
  39. TmpBind.prototype.render = function (data) {
  40. this.reset();
  41. if (data) {
  42. this.data = data;
  43. }
  44. for (var i = 0; i < this.template.length; i++) {
  45. var div1 = document.createElement("div");
  46. this.template[i].source = this.template[i].renderFn(this.data);
  47. div1.innerHTML = this.template[i].source;
  48. this.template[i].els = new Array();
  49. while (div1.childNodes.length > 0) {
  50. this.template[i].els.push(div1.childNodes[0]);
  51. this.template[i].el.parentNode.insertBefore(div1.childNodes[0], this.template[i].el);
  52. }
  53. }
  54. document.querySelector(this.el).template = this.template;
  55. };
  56. // 重置
  57. TmpBind.prototype.reset = function () {
  58. var template = document.querySelector(this.el).template;
  59. if (template) {
  60. for (var i = 0; i < template.length; i++) {
  61. if (template[i].els && template[i].els.length > 0) {
  62. var j = template[i].els.length;
  63. while (j--) {
  64. template[i].els[j].parentNode.removeChild(template[i].els[j]);
  65. }
  66. }
  67. }
  68. }
  69. };
  70. // 设置数据
  71. TmpBind.prototype.setData = function (value) {
  72. this.data = value;
  73. this.render();
  74. };
  75. // 获取数据
  76. TmpBind.prototype.getData = function () {
  77. return this.data;
  78. };
  79. return TmpBind;
  80. }());

示例:

  1. <div id="div2">
  2. 这是第一个模版......
  3. <script type="text/html">
  4. <p>{{msg}}</p>
  5. <ul>
  6. {{each list as item}}
  7. <li>{{item}}</li>
  8. {{/each}}
  9. </ul>
  10. </script>
  11. 二个模版
  12. <script type="text/html">
  13.  
  14. <ul>
  15. {{each list as item}}
  16. <li>{{item}}</li>
  17. {{/each}}
  18. </ul>
  19. </script>
  20. N个模版
  21. <script type="text/html">
  22.  
  23. <ul>
  24. {{each list as item}}
  25. <li>{{item}}</li>
  26. {{/each}}
  27. </ul>
  28. </script>
  29. </div>
  30. <script>
  31. var vm = new TmpBind({
  32. el: "#div2",
  33. data: {
  34. msg: "欢迎来到模版绑定的世界",
  35. list: [1, 2, 3, 4, 5, 6, 7, 8, 9]
  36. }
  37. })
  38. // 获取数据
  39. var data = vm.getData();
  40. // 更改数据
  41. data.msg = "欢迎来到模版绑定的世界3333333333"
  42. data.list.push(333)
  43.  
  44. setTimeout(function () {
  45. // 设置数据
  46. vm.setData(data)
  47. }, 3000)
  48.  
  49. </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. 【DATAGUARD】物理dg的switchover切换(五)

    [DATAGUARD]物理dg的switchover切换(五) 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其 ...

  2. JQuery中两个ul标签的li互相移动

    实例 <html > <head> <meta http-equiv="Content-Type" content="text/html; ...

  3. MySQL/MariaDB数据库的复制监控和维护

      MySQL/MariaDB数据库的复制监控和维护 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.清理日志 1>.删除指定日志文件名称之前的日志(也可用基于时间) M ...

  4. Kali下的内网劫持(二)

    前一小节说到在Kali下可以进行捕获客户端的图片,那么同样的,客户端访问的网页也是可以捕获的: . 以上可以看出监听完毕,那么在被监听端访问阿里云的一个网站: 在监听端用urlsnart这个工具进行捕 ...

  5. sqliteman install parameter

    .安装前准备 系统要求:linux Qt库版本:一般都有 .安装文件 官网自行下载 .安装 )这里用的pscp pscp .\sqliteman-.tar.gz root@192.168.30.140 ...

  6. 解决windows下合上、掀开笔记本盖子后屏幕黑屏的问题

    我在macbook上安装了windows10,但是由于驱动问题,虽然我设置的是关闭盖子仅息屏,但是在关闭盖子后一段时间,再掀开,屏幕就怎么样都唤不醒了. 我找到一个方法,虽然治标不治本,但是起码能解决 ...

  7. Tarjan算法分解强连通分量(附详细参考文章)

    Tarjan算法分解强连通分量 算法思路: 算法通过dfs遍历整个连通分量,并在遍历过程中给每个点打上两个记号:一个是时间戳,即首次访问到节点i的时刻,另一个是节点u的某一个祖先被访问的最早时刻. 时 ...

  8. 大数据JavaWeb之java基础巩固----Junit&反射&注解

    最近打算从0开始学学大数据,目前的主业是Android开发,但是当年毕业之后其实是搞J2EE的,所以打算没事又来拓展一下后台的技能,扩宽一下自己的知识体系对于自己的未来也能够多一些可能,另外大数据的一 ...

  9. python测试开发django-rest-framework-61.权限认证(permission)

    前言 用户登录后,才有操作当前用户的权限,不能操作其它人的用户,这就是需要用到权限认证,要不然你登录自己的用户,去操作别人用户的相关数据,就很危险了. authentication是身份认证,判断当前 ...

  10. discuz x3.4 开启tags聚合标签及伪静态配置方法

    因为SEO的需要,要做tags聚合到一个页面,做到伪静态. 例如: misc.php?mod=tag >>> /tag/ misc.php?mod=tag&id=47 > ...