<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>视图模板引擎 - layui</title> <link rel="stylesheet" href="../src/css/layui.css"> <style> .laytpl-demo{border: 1px solid #EBEBEB;} .laytpl-demo>textarea{position: relative; display: block; width:100%; height: 300px; padding: 11px; border: 0; box-sizing: border-box; resize: none; background-color: #fff; font-family: Courier New; font-size: 13px;} .laytpl-demo>div:first-child{height: 32px; line-height: 32px; padding: 6px 11px; border-bottom: 1px solid #EBEBEB; background-color: #F8F9FA;} </style> </head> <body> <div> <div class="layui-row"> <div class="layui-col-xs6 laytpl-demo"> <div>模板</div> <textarea id="demoTPL1"><h1>{{ d.title }}</h1> <p>转义输出(HTML):{{ d.desc }}</p> <p>转义输出(HTML):{{= d.desc }}</p> <p>原始输出(HTML):{{- d.desc }}</p> {{#}} <div class="layui-section"> <hr> <ul> {{# var str = "a b c"; layui.each(d.items, function(index, item){ }} <li class="{{ index > 0 ? 'list' : '' }}"> <strong>{{ item.title }}</strong> {{# if(item.content){ }} <span>{{ item.content }}</span> {{# } }} <span>{{ item.time || '' }}</span> {{ str }} </li> {{# }); if(d.items.length === 0){ }} 无数据 {{# } }} </ul> <hr> </div> <div> {{ d.content || '' }} {{ }} {{}} {{ }} \a '12'""""" "哈''哈" </div> <p>渲染时间:{{ layui.util.toDateString(new Date()) }}</p></textarea> </div> <div class="layui-col-xs6 laytpl-demo"> <div class="layui-row"> <div class="layui-col-xs3">数据</div> <div class="layui-col-xs9" style="text-align: right"> <button class="layui-btn layui-btn-sm layui-btn-primary" lay-on="createData">生成数据</button> </div> </div> <textarea id="demoData1"> { "title": "标题", "desc": "<a href=\"\" style=\"color:blue;\">一段描述</a>", "items": [ { "title": "list 1", "child": [{ "title": "list 1-1", "child": [{ "title": "list 1-1-1" }] }] }, { "title": "list 2", "child": [{ "title": "list 2-1" }] }, {"title": "list 3"} ] }</textarea> </div> <div class="layui-col-xs12 laytpl-demo"> <div class="layui-row"> <div class="layui-col-xs4">视图</div> <div class="layui-col-xs4" style="text-align: center"> <button class="layui-btn layui-btn-sm layui-btn-primary" lay-on="test1">性能测试</button> </div> <div class="layui-col-xs4" style="text-align: right"> <span id="demoViewTime"></span> </div> </div> <div class="layui-padding-sm" id="demoView1"></div> </div> </div> <script type="type/html" template id="demoTplCommon"> 公共模板 - {{ d.title }} </script> <script type="type/html" template id="demoTplList"> {{# if(d.items && d.items.length > 0){ }} <ul> {{# layui.each(d.items, function(index, item){ }} <li><strong>{{ item.title }}</strong>{{ laytpl.include('demoTplList', {items: item.child}) }}</li> {{# }); }} </ul> {{# } }} </script> <script type="type/html" template id="laytplTestTpl"> {{# for(var i = 0; i < d.items.length; i++){ }} 第{{= d.items[i].index }}个,Name: {{- d.items[i].name }} Number: {{= d.items[i].number }} {{# } }} </script> </div> <script src="../src/layui.js"></script> <script> layui.use(['laytpl', 'util'], function(){ var laytpl = layui.laytpl; var util = layui.util; var $ = layui.$; // 获取模板和数据 var get = function(type){ return { template: $('#demoTPL1').val(), // 获取模板 data: function(){ // 获取数据 try { return JSON.parse($('#demoData1').val()); } catch(e){ $('#demoView1').html(e); } }() }; }; var data = get(); // 耗时计算 var startTime = new Date().getTime(), timer = function(startTime, title){ var endTime = new Date().getTime(); $('#demoViewTime').html((title || '模板解析耗时:')+ (endTime - startTime) + 'ms'); }; // 全局设置 /*laytpl.config({ open: '<%', close: '%>' });*/ // 渲染模板 var thisTpl = laytpl(data.template); // 执行渲染 thisTpl.render(data.data, function(view){ timer(startTime); $('#demoView1').html(view); }); // 编辑 $('.laytpl-demo textarea').on('input', function(){ var data = get(); if(!data.data) return; // 计算模板渲染耗时 var startTime = new Date().getTime(); // 若模板有变化,则重新解析模板;若模板没变,数据有变化,则从模板缓存中直接渲染(效率大增) if(this.id === 'demoTPL1'){ thisTpl.parse(data.template, data.data); // 解析模板 } // 执行渲染 thisTpl.render(data.data, function(view){ timer(startTime); $('#demoView1').html(view); }); }); // 事件 util.on({ // 性能测试 test1: function(){ var dataLen = 1000 // 数据量 var renderTimes = 1000; // 渲染次数 // 初始化数据 var data = { title: '性能测试', items: function(items){ for(var i = 0; i < dataLen; i++){ items.push({ index: i ,name: '<strong style="color: red;">张三</strong>' ,number: 100+i }); } return items; }([]) }; // 模板 var startTime = new Date(); for(var j = 0; j < renderTimes; j++){ var template = document.getElementById('laytplTestTpl').innerHTML; var html = laytpl(template).render(data); } timer(startTime, '本次测试耗时:'); $('#demoView1').html(html); } }); // 自定义标签符 laytpl(` <%# var job = ["前端工程师"]; %> <%= d.name %>是一名<%= job[d.type] %>。 `, { open: '<%', close: '%>' }).render({ name: '张三', type: 0 }, function(str){ console.log(str); // 张三是一名前端工程师。 }); }); </script> </body> </html>