简单模板模式

本文共--字 阅读约--分钟 | 浏览: -- 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操作拼接视图的执行性能。