mirror of https://github.com/layui/layui
259 lines
6.7 KiB
Markdown
259 lines
6.7 KiB
Markdown
<pre class="layui-code" lay-options="{preview: true, layout: ['preview'], codeStyle: 'max-height: 520px;', copy: false, tools: ['full'], addTools: null}">
|
||
<textarea>
|
||
{{!
|
||
<style>
|
||
.laytpl-demo{border: 1px solid #eee;}
|
||
.laytpl-demo:first-child{border-right: none;}
|
||
.laytpl-demo>textarea{position: relative; display: block; width:100%; height: 320px; 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 #eee; background-color: #F8F9FA;}
|
||
.laytpl-demo .layui-tabs{top: -1px;}
|
||
|
||
#ID-tpl-view-body {
|
||
max-height: 320px; overflow: auto; clear: both;
|
||
}
|
||
#ID-tpl-view-body > div {
|
||
display: none;
|
||
}
|
||
.laytpl-demo pre {
|
||
margin: 0; padding: 16px; background-color: #1F1F1F; color: #F8F9FA; font-family: 'Courier New',Consolas, monospace;
|
||
}
|
||
</style>
|
||
<div class="layui-row">
|
||
<div class="layui-col-xs6 laytpl-demo">
|
||
<div>
|
||
<div style="cursor: pointer;" id="ID-tpl-src-title">
|
||
<strong>模板(旧版本)</strong>
|
||
<i class="layui-icon layui-icon-down layui-font-12"></i>
|
||
</div>
|
||
</div>
|
||
<textarea id="ID-tpl-src"></textarea>
|
||
</div>
|
||
<div class="layui-col-xs6 laytpl-demo">
|
||
<div><strong>数据</strong></div>
|
||
<textarea id="ID-tpl-data">
|
||
{
|
||
"title": "Layui 常用组件",
|
||
"desc": "<a style=\"color:blue;\">一段带 HTML 的内容</a>",
|
||
"list": [
|
||
{
|
||
"title": "弹层",
|
||
"name": "layer"
|
||
},
|
||
{
|
||
"title": "表单",
|
||
"name": "form"
|
||
},
|
||
{
|
||
"title": "表格",
|
||
"name": "table"
|
||
},
|
||
{
|
||
"title": "日期选择器",
|
||
"name": "laydate"
|
||
},
|
||
{
|
||
"title": "标签页",
|
||
"name": "tabs"
|
||
}
|
||
]
|
||
}
|
||
</textarea>
|
||
</div>
|
||
<div class="layui-col-xs12 laytpl-demo" style="border-top: none;">
|
||
<div class="layui-row">
|
||
<div class="layui-col-xs6 layui-tabs" id="ID-tpl-view-header">
|
||
<ul class="layui-tabs-header">
|
||
<li><strong>渲染结果</strong></li>
|
||
<li><strong>源码</strong></li>
|
||
</ul>
|
||
</div>
|
||
<div class="layui-col-xs6" style="text-align: right">
|
||
<span class="layui-badge" id="ID-tpl-view-time"></span>
|
||
</div>
|
||
</div>
|
||
<div id="ID-tpl-view-body">
|
||
<div class="layui-show layui-padding-3 layui-text" id="ID-tpl-view"></div>
|
||
<div><pre id="ID-tpl-view-code" ></pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="layui-clear"></div>
|
||
|
||
<!-- 新版本模板 -->
|
||
<script type="text/html" id="ID-tpl-template-modern">
|
||
<p>转义输出:{{= d.desc }}</p>
|
||
<p>原文输出:{{- d.desc }}</p>
|
||
|
||
{{#注释标签 - 仅在模板中显示,不在视图中输出 }}
|
||
|
||
<p>{{! 忽略标签,可显示原始标签:
|
||
{{ let a = 0; }} {{= escape }} {{- source }} {{#comments }} {{! ignore !}}
|
||
!}}</p>
|
||
|
||
{{#标签空主体测试 }}
|
||
{{}} {{ }} {{ }} {{= }} {{=}} {{= }}
|
||
|
||
<p>
|
||
条件语句:
|
||
{{= d.list.length ? d.title : '' }}
|
||
{{ if(d.title){}} - #AAAA{{='A'}}{{ } }}
|
||
</p>
|
||
<p>循环语句:</p>
|
||
<ul>
|
||
{{ d.list.forEach(function(item) { }}
|
||
<li>
|
||
<span>{{= item.title }}</span>
|
||
<span>{{= item.name }}</span>
|
||
</li>
|
||
{{ }); }}
|
||
</ul>
|
||
{{ if (d.list.length === 0) { }}
|
||
无数据
|
||
{{} }}
|
||
</script>
|
||
|
||
<!-- 旧版本模板 -->
|
||
<script type="text/html" id="ID-tpl-template-legacy">
|
||
<p>转义输出:{{= d.desc }}</p>
|
||
<p>原文输出:{{- d.desc }}</p>
|
||
<p>
|
||
条件语句:
|
||
{{= d.list.length ? d.title : '' }}
|
||
{{#if(d.title){}} - #AAAA{{='A'}}{{#}}}
|
||
</p>
|
||
<p>循环语句:</p>
|
||
<ul>
|
||
{{#d.list.forEach(function(item) { }}
|
||
<li>
|
||
<span>{{= item.title }}</span>
|
||
<span>{{= item.name }}</span>
|
||
</li>
|
||
{{#}); }}
|
||
</ul>
|
||
{{#if (d.list.length === 0) { }}
|
||
无数据
|
||
{{#} }}
|
||
</script>
|
||
|
||
<!-- import layui -->
|
||
<script>
|
||
layui.use(['laytpl', 'util', 'tabs', 'dropdown'], function() {
|
||
var laytpl = layui.laytpl;
|
||
var util = layui.util;
|
||
var tabs = layui.tabs;
|
||
var dropdown = layui.dropdown;
|
||
var $ = layui.$;
|
||
|
||
// 默认设置
|
||
laytpl.config({
|
||
// tagStyle: 'modern' // 初始化标签风格
|
||
});
|
||
|
||
// 获取模板和数据
|
||
var getData = function(type) {
|
||
return {
|
||
template: $('#ID-tpl-src').val(), // 获取模板
|
||
data: function(){ // 获取数据
|
||
try {
|
||
return JSON.parse($('#ID-tpl-data').val());
|
||
} catch(e) {
|
||
$('#ID-tpl-view').html(e);
|
||
}
|
||
}()
|
||
};
|
||
};
|
||
|
||
// 视图渲染
|
||
var renderView = function(html, startTime) {
|
||
timer(startTime);
|
||
$('#ID-tpl-view').html(html);
|
||
$('#ID-tpl-view-code').html(util.escape(html));
|
||
};
|
||
|
||
// 生成模板
|
||
var createTemplate = function(opts) {
|
||
opts = $.extend({
|
||
tagStyle: 'legacy'
|
||
}, opts);
|
||
|
||
// 初始化模板
|
||
var elem = $('#ID-tpl-template-'+ opts.tagStyle);
|
||
$('#ID-tpl-src').val(elem.html().replace(/^\s+/g, ''));
|
||
|
||
return opts;
|
||
};
|
||
var tplConfig = createTemplate();
|
||
var data = getData();
|
||
|
||
// 耗时计算
|
||
var timer = function(startTime, title) {
|
||
var endTime = new Date();
|
||
$('#ID-tpl-view-time').html((title || '本次渲染总耗时:')+ (endTime - startTime) + 'ms');
|
||
};
|
||
var startTime = new Date();
|
||
|
||
// 创建一个模板实例
|
||
var templateInst = laytpl(data.template, {
|
||
condense: false, // 不处理连续空白符,即保留模板原始结构
|
||
tagStyle: tplConfig.tagStyle
|
||
});
|
||
|
||
// 初始渲染
|
||
templateInst.render(data.data, function(html) {
|
||
renderView(html, startTime);
|
||
});
|
||
|
||
// 编辑
|
||
$('.laytpl-demo textarea').on('input', function() {
|
||
var data = getData();
|
||
var startTime = new Date();
|
||
|
||
// 若模板有变化,则重新编译模板
|
||
if (this.id === 'ID-tpl-src') {
|
||
templateInst.compile(data.template);
|
||
}
|
||
|
||
// 若模板没变,数据有变化,则从模板缓存中直接渲染数据(效率大增)
|
||
templateInst.render(data.data, function(html) {
|
||
renderView(html, startTime);
|
||
});
|
||
});
|
||
|
||
// 视图结果 tabs
|
||
tabs.render({
|
||
elem: '#ID-tpl-view-header',
|
||
body: ['#ID-tpl-view-body', '>div']
|
||
});
|
||
|
||
// 切换模板
|
||
dropdown.render({
|
||
elem: '#ID-tpl-src-title',
|
||
data: [{
|
||
title: '新版本模板',
|
||
tagStyle: 'modern'
|
||
}, {
|
||
title: '旧版本模板',
|
||
tagStyle: 'legacy'
|
||
}],
|
||
click: function(obj){
|
||
createTemplate({
|
||
tagStyle: obj.tagStyle
|
||
});
|
||
this.elem.children('strong').html(obj.title);
|
||
|
||
// 同步设置标签风格
|
||
templateInst.config.tagStyle = obj.tagStyle;
|
||
|
||
var data = getData();
|
||
var startTime = new Date();
|
||
|
||
// 重新渲染
|
||
templateInst.compile(data.template).render(data.data, function(html) {
|
||
renderView(html, startTime);
|
||
});
|
||
}
|
||
})
|
||
});
|
||
</script>!}}</textarea>
|
||
</pre>
|