vue查找指令和模板思路详解

 更新时间:2023年10月16日 09:11:24   作者:BNTang  
这篇文章主要介绍了vue查找指令和模板,基本思路是需要判断当前遍历到的节点是一个元素还是一个文本,随着思路的展开我们就来实现这个功能,需要的朋友可以参考下

本文要实现的是查找指令和模板。

大致的思路是这样的:

  • 遍历所有的节点
  • 需要判断当前遍历到的节点是一个元素还是一个文本
  • 如果是一个元素, 我们需要判断有没有v-model属性
  • 如果是一个文本, 我们需要判断有没有{{}}的内容

那么随着思路的展开,接下来我们就来实现这个功能。

首先我们编写一个 buildTemplate 方法,主要功能是利用指定的数据编译内存中的元素:

buildTemplate(fragment) {
    let nodeList = [...fragment.childNodes];

    // 1.遍历所有的节点
    nodeList.forEach(node => {

    });
}

buildTemplate 方法定义在 Compiler 类中,我们需要在 compile 方法中调用它:

// 2.利用指定的数据编译内存中的元素
this.buildTemplate(fragment);

然后我们在 buildTemplate 方法中完善我们的代码,这里我就先直接上完整的实现代码:

buildTemplate(fragment) {
    let nodeList = [...fragment.childNodes];

    // 1.遍历所有的节点
    nodeList.forEach(node => {
        // 2.需要判断当前遍历到的节点是一个元素还是一个文本
        if (this.vm.isElement(node)) {
            // 是一个元素
            this.buildElement(node);
        } else {
            // 不是一个元素
            this.buildText(node);
        }
    });
}

buildElement(node) {
    // 可以通过 node.attributes 获取到当前元素上所有的属性
    let attrs = [...node.attributes];

    // 1.遍历所有的属性
    attrs.forEach(attr => {
        let {name, value} = attr;
        if (name.startsWith('v-')) {
            console.log('是Vue的指令, 需要我们处理', name);
        }
    });
}

buildText(node) {
    // 可以通过 node.textContent 获取到当前文本节点的内容
    let content = node.textContent;

    // 编写一个正则表达式, 用来匹配 {{}}
    // 如下正则表达式的含义是: 匹配 {{}} 中间的内容
    // /: 正则表达式通常以斜杠 / 开始和结束,表示正则表达式的开始和结束。
    // \{ 和 \}: 这些是转义字符,用于匹配实际的花括号 { 和 }。花括号在正则表达式中具有特殊意义,因此需要使用反斜杠进行转义。
    // \{\{ 和 \}\}: 这是正则表达式的起始和结束部分,用于匹配双花括号 {{ 和 }}。
    // .+?: 这部分用于匹配双花括号内的任意字符,. 表示匹配任意字符,+ 表示匹配一个或多个前面的字符,? 表示非贪婪匹配,即尽可能匹配最短的内容。这样确保匹配到最近的结束双花括号 }}。
    // /g: g 是正则表达式的标志,表示全局匹配,即匹配字符串中的所有符合条件的部分。
    // /i: i 也是正则表达式的标志,表示不区分大小写匹配,这意味着 {{...}} 和 {{...}} 都会被匹配到。
    // 因此,这个正则表达式可以用于在字符串中找到并提取所有的 {{...}} 结构,不区分大小写,不贪婪匹配,且匹配所有出现的情况。
    let reg = /\{\{.+?\}\}/gi;
    if (reg.test(content)) {
        console.log('是一个文本节点, 需要我们处理', content);
    }
}

好了,我们来看一下效果,我们在浏览器中打开,然后打开控制台,可以看到如下的效果:

发现,只有 v-model 指令被处理, {{}} 没有被处理,如下图我框出了 <p>

也就是说我们循环节点的时候,只循环了一层,没有循环到 <p> 标签中的文本节点,所以我们需要修改一下 buildTemplate 方法, 让它支持递归,处理子元素(处理后代):

// 处理子元素(处理后代)
this.buildTemplate(node);

改造后,我们再来看一下效果,可以看到 {{}} 也被处理了:

好了,到这里我们就实现了查找指令和模板的功能,下一篇我们来继续完善一下我们的不完整的代码,一步一步来慢慢撕。

到此这篇关于vue查找指令和模板的文章就介绍到这了,更多相关vue查找指令和模板内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue3项目中给组件命名的方式详解

    Vue3项目中给组件命名的方式详解

    这篇文章主要介绍了两种在Vue3项目中给组件命名的方法:原生的export default方式和使用vite-plugin-vue-setup-extend插件的方式,通过代码介绍的非常详细,需要的朋友可以参考下
    2026-04-04
  • vue集成chart.js的实现方法

    vue集成chart.js的实现方法

    这篇文章主要介绍了vue集成chartjs的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Vue3 源码解读之 Teleport 组件使用示例

    Vue3 源码解读之 Teleport 组件使用示例

    这篇文章主要为大家介绍了Vue3 源码解读之 Teleport 组件使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • vue如何自定义地址设置@

    vue如何自定义地址设置@

    这篇文章主要介绍了vue如何自定义地址设置@,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Vue3+TS+Vant3+Pinia(H5端)配置教程详解

    Vue3+TS+Vant3+Pinia(H5端)配置教程详解

    这篇文章主要介绍了Vue3+TS+Vant3+Pinia(H5端)配置教程详解,需要的朋友可以参考下
    2023-01-01
  • Vue与compressor.js实现高效文件压缩的方法

    Vue与compressor.js实现高效文件压缩的方法

    本文将介绍基于 Vue 框架和 compressor.js 的上传时文件压缩实现方法,通过在上传过程中对文件进行压缩,减小文件大小,提升上传速度,为用户创造更快捷、高效的上传体验,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • el-select 点击按钮滚动到选择框顶部的实现代码

    el-select 点击按钮滚动到选择框顶部的实现代码

    本文通过实例代码给大家分享el-select 点击按钮滚动到选择框顶部效果,主要代码是在visibleChange在这个popper里面找到.el-select-dropdown__list,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • vue 使用原生组件上传图片的实例

    vue 使用原生组件上传图片的实例

    这篇文章主要介绍了vue 使用原生组件上传图片的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Vue3学习之表单的使用示例详解

    Vue3学习之表单的使用示例详解

    这篇文章主要为大家详细介绍了Vue3中表单的使用的相关知识,文中的示例代码讲解详细,对我们掌握Vue3有一定的帮助,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-12-12
  • Vue 使用 ElementUi el-upload 手动上传文件限制上传文件类型大小同名等进行限制

    Vue 使用 ElementUi el-upload 手动上传文件限制上传文件类型大小同名等进行限制

    个人在做文件上传功能的时候,踩过不少的坑,特在此记录下,本文介绍Vue使用 ElementUi el-upload 手动上传文件限制上传文件类型大小同名等进行限制问题,感兴趣的朋友一起看看吧
    2024-02-02

最新评论