探究Vue源码:mustache模板引擎(7) 手写模板字符串转换tokens数组过程

文章详细介绍了在Vue源码分析过程中,如何实现mustache模板引擎的Scanner类,用于处理字符串并分割成tokens。接着,作者展示了如何在formConversToken.js中进行tokens的格式转换,处理包括文本、变量以及特殊符号如#和/的情况,以支持简单的循环结构。虽然目前仅能处理一维数组,但已为处理更复杂的模板结构打下基础。
摘要由CSDN通过智能技术生成

上文 探究Vue源码:mustache模板引擎(6) 编写Scanner扫描类处理字符串按格式分割我们针对模板引擎将字符串转tokens 展开了 代码编写
我们用Scanner 已经可用根据大括号分割内容 那么 现在 我们就继续研究tokens转换

我们打开我们之前创建的项目
在src目录下创建一个文件 叫 formConversToken.js
在这里插入图片描述
我们就在这个文件夹中门来做这种格式转换的处理
然后 这个文件我们先这样 默认给他导出一个函数

export default function formConversToken() {
    
}

然后 我们到src下的index.js来引入这个文件
在这里插入图片描述
然后 我们将index.js改成这样

import formConversToken from "./formConversToken";
window.GrManagData = {
    render(templateStr,data) {
        let tokens = formConversToken(templateStr);
        console.log(tokens);
    }
}

上文中再render中写的内容 我们不要了 因为那个只是为了写这个Scanner类做测试用的

然后 我们给src下的formConversToken.js引入一下Scanner 它有用
在这里插入图片描述
然后 我们直接 formConversToken 函数 代码编写如下

export default function formConversToken(templateStr) {
    let tokens = [];
    let scanner = new Scanner(templateStr);
    while(scanner.pos != templateStr.length) {
        let text = scanner.scanUtil("{{");
        tokens.push(["text",text]);
        scanner.scan("{{");
        let name = scanner.scanUtil("}}");
        tokens.push(["name",name]);
        scanner.scan("}}");
    }
    return tokens;
}

这里 我们定义了一个叫 tokens 的数组
然后 将上文 我们过滤的循环条件又加上去
如果这个templateStr模板字符串没有被处理完 就一直走
然后 先过滤出 从开头到 {{ 中的内容 这个内容是 text文本类型
然后 从 {{开始 到 }} 过滤出来 叫name
因为花括号中的都是采用的data中的字段
我们要将这个内容取出来
一次一次循环 直到整个模板字符串的内容都被处理完
循环结束之后 将我们存储的tokens 数组返回回来
然后 运行结果如下
在这里插入图片描述
我们这里的tokens就被处理出来了

看着很神奇 但其实功能很弱小
现在我们这个这能抗住一维数组
如果来个二维的就废了
我们将 index.html中的templateStr内容改成这样

let templateStr = `
    <div>
       {{#students}}
           <ul>
               <li>{{ item.name }}</li>
           </ul>
       {{/students}}
   </div>
`;

我们再次运行
在这里插入图片描述
其实 看着也还行 不过还是多少有点乱
而且这个我们还是弄的一个一维数组

按正常 我们循环结构要存在内部嵌套 例如 我们这里 一个循环结构就是二维数组
数组嵌套 我们下一篇在继续讲
这次 我们就先将这个 # 和 / 解决一下
在这里插入图片描述
这里 我们找到 src下的 formConversToken.js
然后 看到 tokens.push([“name”,name]);这个位置
我们改成

if(name) {
    if(name[0] == "#") {
        tokens.push(["#",name.substring(1)]);
    }else if(name[0] == "/") {
        tokens.push(["/",name.substring(1)]);
    }else{
        tokens.push(["name",name]);
    }
}

首先if(name)判断 首先 name不能是空的
然后 判断 如果第一个字符是井号 那就 名称为井号 然后内容 取这个字符串的第二个字符到结尾
然后 如果第一个字符串是 反斜杠 这个 名称为反斜杠 然后 内容还是从第二个字符串开始取
然后 否则 就是正常取
在这里插入图片描述
这样 我们这个循环的部分语法就被处理出来了
当然 一个枪套的循环处理 我们后续再说 今天就到这啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值