返回

3天学写MVVM框架[二]:模板解析

前端

经过前一篇文章的铺垫,我们已经了解了MVVM框架的基本原理和编写方式,也写了一个简单的例子。本篇我们来实现一个更加复杂的例子——一个简单的列表页,包含列表、新增和编辑功能。

在开始之前,我们需要先对MVVM框架进行一些扩展,以支持模板解析。

模板解析

模板解析,简单来说就是把一个字符串形式的模板解析成一个数据结构,这个数据结构可以被框架用来创建视图。

这里我们采用最简单的实现方式:

function parseTemplate(template) {
  // 将模板字符串按行分割
  const lines = template.split('\n');

  // 创建AST树
  const astTree = [];

  for (let line of lines) {
    // 如果是空行,则跳过
    if (!line.trim()) continue;

    // 如果是注释行,则跳过
    if (line.startsWith('<!--')) continue;

    // 如果是指令,则解析指令
    if (line.startsWith('<!--@')) {
      const指令 = line.slice(4, -3);
      astTree.push({
        type: '指令',
        指令:指令,
      });
    } else {
      // 否则,则为普通文本
      astTree.push({
        type: '文本',
        文本: line,
      });
    }
  }

  返回astTree;
}

以上代码中,我们首先将模板字符串按行分割,然后遍历每一行。如果当前行是空行或注释行,则跳过。如果是指令,则解析指令。否则,则为普通文本。

我们把解析的结果称为AST树(抽象语法树),它是一个包含指令和文本节点的数据结构。

示例

让我们使用模板解析器来解析一个简单的列表模板:

<ul>
  <#for item in items#>
    <li><#= item #></li>
  <#/#for#>
</ul>

解析后的AST树为:

[
  {
    type: '文本',
    文本: '<ul>'
  },
  {
    type: '指令',
    指令: 'for item in items'
  },
  {
    type: '文本',
    文本: '<li><#= item #></li>'
  },
  {
    type: '指令',
    指令: '/for'
  },
  {
    type: '文本',
    文本: '</ul>'
  },
]

总结

以上就是模板解析的基本实现。通过模板解析,我们可以将模板字符串转换成一个数据结构,这个数据结构可以被框架用来创建视图。在下一篇文章中,我们将介绍如何使用AST树来创建视图。