最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2023年10月16日 09:11:24   作者:BNTang  
這篇文章主要介紹了vue查找指令和模板,基本思路是需要判斷當(dāng)前遍歷到的節(jié)點(diǎn)是一個(gè)元素還是一個(gè)文本,隨著思路的展開我們就來實(shí)現(xiàn)這個(gè)功能,需要的朋友可以參考下

本文要實(shí)現(xiàn)的是查找指令和模板。

大致的思路是這樣的:

  • 遍歷所有的節(jié)點(diǎn)
  • 需要判斷當(dāng)前遍歷到的節(jié)點(diǎn)是一個(gè)元素還是一個(gè)文本
  • 如果是一個(gè)元素, 我們需要判斷有沒有v-model屬性
  • 如果是一個(gè)文本, 我們需要判斷有沒有{{}}的內(nèi)容

那么隨著思路的展開,接下來我們就來實(shí)現(xiàn)這個(gè)功能。

首先我們編寫一個(gè) buildTemplate 方法,主要功能是利用指定的數(shù)據(jù)編譯內(nèi)存中的元素:

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

    // 1.遍歷所有的節(jié)點(diǎn)
    nodeList.forEach(node => {

    });
}

buildTemplate 方法定義在 Compiler 類中,我們需要在 compile 方法中調(diào)用它:

// 2.利用指定的數(shù)據(jù)編譯內(nèi)存中的元素
this.buildTemplate(fragment);

然后我們在 buildTemplate 方法中完善我們的代碼,這里我就先直接上完整的實(shí)現(xiàn)代碼:

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

    // 1.遍歷所有的節(jié)點(diǎn)
    nodeList.forEach(node => {
        // 2.需要判斷當(dāng)前遍歷到的節(jié)點(diǎn)是一個(gè)元素還是一個(gè)文本
        if (this.vm.isElement(node)) {
            // 是一個(gè)元素
            this.buildElement(node);
        } else {
            // 不是一個(gè)元素
            this.buildText(node);
        }
    });
}

buildElement(node) {
    // 可以通過 node.attributes 獲取到當(dāng)前元素上所有的屬性
    let attrs = [...node.attributes];

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

buildText(node) {
    // 可以通過 node.textContent 獲取到當(dāng)前文本節(jié)點(diǎn)的內(nèi)容
    let content = node.textContent;

    // 編寫一個(gè)正則表達(dá)式, 用來匹配 {{}}
    // 如下正則表達(dá)式的含義是: 匹配 {{}} 中間的內(nèi)容
    // /: 正則表達(dá)式通常以斜杠 / 開始和結(jié)束,表示正則表達(dá)式的開始和結(jié)束。
    // \{ 和 \}: 這些是轉(zhuǎn)義字符,用于匹配實(shí)際的花括號 { 和 }?;ɡㄌ栐谡齽t表達(dá)式中具有特殊意義,因此需要使用反斜杠進(jìn)行轉(zhuǎn)義。
    // \{\{ 和 \}\}: 這是正則表達(dá)式的起始和結(jié)束部分,用于匹配雙花括號 {{ 和 }}。
    // .+?: 這部分用于匹配雙花括號內(nèi)的任意字符,. 表示匹配任意字符,+ 表示匹配一個(gè)或多個(gè)前面的字符,? 表示非貪婪匹配,即盡可能匹配最短的內(nèi)容。這樣確保匹配到最近的結(jié)束雙花括號 }}。
    // /g: g 是正則表達(dá)式的標(biāo)志,表示全局匹配,即匹配字符串中的所有符合條件的部分。
    // /i: i 也是正則表達(dá)式的標(biāo)志,表示不區(qū)分大小寫匹配,這意味著 {{...}} 和 {{...}} 都會被匹配到。
    // 因此,這個(gè)正則表達(dá)式可以用于在字符串中找到并提取所有的 {{...}} 結(jié)構(gòu),不區(qū)分大小寫,不貪婪匹配,且匹配所有出現(xiàn)的情況。
    let reg = /\{\{.+?\}\}/gi;
    if (reg.test(content)) {
        console.log('是一個(gè)文本節(jié)點(diǎn), 需要我們處理', content);
    }
}

好了,我們來看一下效果,我們在瀏覽器中打開,然后打開控制臺,可以看到如下的效果:

發(fā)現(xiàn),只有 v-model 指令被處理, {{}} 沒有被處理,如下圖我框出了 <p>

也就是說我們循環(huán)節(jié)點(diǎn)的時(shí)候,只循環(huán)了一層,沒有循環(huán)到 <p> 標(biāo)簽中的文本節(jié)點(diǎn),所以我們需要修改一下 buildTemplate 方法, 讓它支持遞歸,處理子元素(處理后代):

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

改造后,我們再來看一下效果,可以看到 {{}} 也被處理了:

好了,到這里我們就實(shí)現(xiàn)了查找指令和模板的功能,下一篇我們來繼續(xù)完善一下我們的不完整的代碼,一步一步來慢慢撕。

到此這篇關(guān)于vue查找指令和模板的文章就介紹到這了,更多相關(guān)vue查找指令和模板內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue3項(xiàng)目中給組件命名的方式詳解

    Vue3項(xiàng)目中給組件命名的方式詳解

    這篇文章主要介紹了兩種在Vue3項(xiàng)目中給組件命名的方法:原生的export default方式和使用vite-plugin-vue-setup-extend插件的方式,通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-04-04
  • vue集成chart.js的實(shí)現(xiàn)方法

    vue集成chart.js的實(shí)現(xiàn)方法

    這篇文章主要介紹了vue集成chartjs的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Vue3?源碼解讀之?Teleport?組件使用示例

    Vue3?源碼解讀之?Teleport?組件使用示例

    這篇文章主要為大家介紹了Vue3?源碼解讀之?Teleport?組件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • vue如何自定義地址設(shè)置@

    vue如何自定義地址設(shè)置@

    這篇文章主要介紹了vue如何自定義地址設(shè)置@,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Vue3+TS+Vant3+Pinia(H5端)配置教程詳解

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

    這篇文章主要介紹了Vue3+TS+Vant3+Pinia(H5端)配置教程詳解,需要的朋友可以參考下
    2023-01-01
  • Vue與compressor.js實(shí)現(xiàn)高效文件壓縮的方法

    Vue與compressor.js實(shí)現(xiàn)高效文件壓縮的方法

    本文將介紹基于 Vue 框架和 compressor.js 的上傳時(shí)文件壓縮實(shí)現(xiàn)方法,通過在上傳過程中對文件進(jìn)行壓縮,減小文件大小,提升上傳速度,為用戶創(chuàng)造更快捷、高效的上傳體驗(yàn),感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • el-select 點(diǎn)擊按鈕滾動到選擇框頂部的實(shí)現(xiàn)代碼

    el-select 點(diǎn)擊按鈕滾動到選擇框頂部的實(shí)現(xiàn)代碼

    本文通過實(shí)例代碼給大家分享el-select 點(diǎn)擊按鈕滾動到選擇框頂部效果,主要代碼是在visibleChange在這個(gè)popper里面找到.el-select-dropdown__list,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • vue 使用原生組件上傳圖片的實(shí)例

    vue 使用原生組件上傳圖片的實(shí)例

    這篇文章主要介紹了vue 使用原生組件上傳圖片的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Vue3學(xué)習(xí)之表單的使用示例詳解

    Vue3學(xué)習(xí)之表單的使用示例詳解

    這篇文章主要為大家詳細(xì)介紹了Vue3中表單的使用的相關(guān)知識,文中的示例代碼講解詳細(xì),對我們掌握Vue3有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-12-12
  • Vue?使用?ElementUi?el-upload?手動上傳文件限制上傳文件類型大小同名等進(jìn)行限制

    Vue?使用?ElementUi?el-upload?手動上傳文件限制上傳文件類型大小同名等進(jìn)行限制

    個(gè)人在做文件上傳功能的時(shí)候,踩過不少的坑,特在此記錄下,本文介紹Vue使用?ElementUi?el-upload?手動上傳文件限制上傳文件類型大小同名等進(jìn)行限制問題,感興趣的朋友一起看看吧
    2024-02-02

最新評論

谷城县| 随州市| 马关县| 磐石市| 前郭尔| 喀喇| 星子县| 乐平市| 马公市| 图们市| 三明市| 航空| 凤城市| 牡丹江市| 玉门市| 泰和县| 贺兰县| 美姑县| 石狮市| 黎平县| 池州市| 息烽县| 凭祥市| 焦作市| 廉江市| 吉首市| 巴马| 民权县| 汕尾市| 化州市| 衡山县| 乡城县| 山东省| 广平县| 岑巩县| 古田县| 霍城县| 佛坪县| 赣州市| 铁岭县| 景谷|