本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2021-12-15
简单模板模式(Simple template):通过格式化字符串拼凑出视图避免创建视图时大量节点操作,优化内存开销。
var A = A || {};
A.root = document.getElementById('container');
// str : <p>{#demo#}</p> + data { demo: 'abc'} => <p>abc</p>
A.formatString = function (str, data) {
return str.replace(/{#(\w+)#}/g, function(match, key) {
return typeof data[key] === undefined ? '' : data[key]
})
}
// 模板生成器
A.view = function(name) {
// 模板库
var tpls = {
code: '<pre><code>{#code#}</code></pre>',
img: '<img src="{#src#}" alt="{#alt#}" title="{#title#}" />',
part: '<div id="{#id#}" class="{#class#}">{#part#}</div>',
theme: [
'<div>',
'<h1>{#title}</h1>',
'{#content#}',
'</div>'
].join('')
}
// 如果是数组,就进行递归
if (Object.prototype.toString.call(name) === '[object Array]') {
var tpl = '';
for (var i = 0, len = name.length; i < len; i++) {
// arguments.callee 指向当前正在执行的函数 即 A.view 相当于递归
tpl += arguments.callee(name[i]);
}
return tpl;
} else {
// 如果模板库里面有就返回该模板,如果没有就根据name组装一个简易模板返回
return tpls[name] ? tpls[name] : `<${name}>{#${name}#}</${name}>`
}
}
A.strategy = {
// 文字列表展示
'listPart': function(data) {
var s = document.createElement('div');
var ulStr = '';
var liData = data.liData;
var tpl = A.view(['ul'])
var liTpl = A.formatString(A.view('li'), { li: A.view(['strong', 'span'])})
// 用到的 li 和 strong span 模板库都没有 就会生成简易模板
if (data.id) {
s.id = data.id;
}
for (var i = 0, len = liData.length; i < len; i++) {
if (liData[i].strong || liData[i].span) {
ulStr += A.formatString(liTpl, liData[i])
}
}
data.ul = ulStr;
s.innerHTML = A.formatString(tpl, data);
A.root.appendChild(s);
},
}
A.init = function(data) {
this.strategy[data.type](data);
}
A.init({
type: 'listPart',
liData: [
{
strong: '一',
span: '内容1'
},
{
strong: '二',
span: '内容2'
}
]
})
简单模板模式主要包含三部分,字符串模板库、格式化方法、字符串拼接操作。在不同需求的实现中,字符串模板库都是灵活多变的,而格式化方法却通常是不变的,字符串拼接操作常常随需求中的视图变化而变化。简单模板模式意在解决运用DOM操作创建视图时造成资源消耗大、性能低下、操作复杂等问题,用正则匹配方式去格式化字符串的执行的性能要远高于DOM操作拼接视图的执行性能。