vue查找指令和模板思路詳解
本文要實現(xiàn)的是查找指令和模板。
大致的思路是這樣的:
- 遍歷所有的節(jié)點
- 需要判斷當前遍歷到的節(jié)點是一個元素還是一個文本
- 如果是一個元素, 我們需要判斷有沒有v-model屬性
- 如果是一個文本, 我們需要判斷有沒有{{}}的內(nèi)容
那么隨著思路的展開,接下來我們就來實現(xiàn)這個功能。
首先我們編寫一個 buildTemplate 方法,主要功能是利用指定的數(shù)據(jù)編譯內(nèi)存中的元素:
buildTemplate(fragment) {
let nodeList = [...fragment.childNodes];
// 1.遍歷所有的節(jié)點
nodeList.forEach(node => {
});
}
buildTemplate 方法定義在 Compiler 類中,我們需要在 compile 方法中調(diào)用它:

// 2.利用指定的數(shù)據(jù)編譯內(nèi)存中的元素 this.buildTemplate(fragment);
然后我們在 buildTemplate 方法中完善我們的代碼,這里我就先直接上完整的實現(xiàn)代碼:
buildTemplate(fragment) {
let nodeList = [...fragment.childNodes];
// 1.遍歷所有的節(jié)點
nodeList.forEach(node => {
// 2.需要判斷當前遍歷到的節(jié)點是一個元素還是一個文本
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 獲取到當前文本節(jié)點的內(nèi)容
let content = node.textContent;
// 編寫一個正則表達式, 用來匹配 {{}}
// 如下正則表達式的含義是: 匹配 {{}} 中間的內(nèi)容
// /: 正則表達式通常以斜杠 / 開始和結束,表示正則表達式的開始和結束。
// \{ 和 \}: 這些是轉(zhuǎn)義字符,用于匹配實際的花括號 { 和 }?;ɡㄌ栐谡齽t表達式中具有特殊意義,因此需要使用反斜杠進行轉(zhuǎn)義。
// \{\{ 和 \}\}: 這是正則表達式的起始和結束部分,用于匹配雙花括號 {{ 和 }}。
// .+?: 這部分用于匹配雙花括號內(nèi)的任意字符,. 表示匹配任意字符,+ 表示匹配一個或多個前面的字符,? 表示非貪婪匹配,即盡可能匹配最短的內(nèi)容。這樣確保匹配到最近的結束雙花括號 }}。
// /g: g 是正則表達式的標志,表示全局匹配,即匹配字符串中的所有符合條件的部分。
// /i: i 也是正則表達式的標志,表示不區(qū)分大小寫匹配,這意味著 {{...}} 和 {{...}} 都會被匹配到。
// 因此,這個正則表達式可以用于在字符串中找到并提取所有的 {{...}} 結構,不區(qū)分大小寫,不貪婪匹配,且匹配所有出現(xiàn)的情況。
let reg = /\{\{.+?\}\}/gi;
if (reg.test(content)) {
console.log('是一個文本節(jié)點, 需要我們處理', content);
}
}
好了,我們來看一下效果,我們在瀏覽器中打開,然后打開控制臺,可以看到如下的效果:

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

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

// 處理子元素(處理后代) this.buildTemplate(node);
改造后,我們再來看一下效果,可以看到 {{}} 也被處理了:

好了,到這里我們就實現(xiàn)了查找指令和模板的功能,下一篇我們來繼續(xù)完善一下我們的不完整的代碼,一步一步來慢慢撕。
到此這篇關于vue查找指令和模板的文章就介紹到這了,更多相關vue查找指令和模板內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Vue3+TS+Vant3+Pinia(H5端)配置教程詳解
這篇文章主要介紹了Vue3+TS+Vant3+Pinia(H5端)配置教程詳解,需要的朋友可以參考下2023-01-01
Vue與compressor.js實現(xiàn)高效文件壓縮的方法
本文將介紹基于 Vue 框架和 compressor.js 的上傳時文件壓縮實現(xiàn)方法,通過在上傳過程中對文件進行壓縮,減小文件大小,提升上傳速度,為用戶創(chuàng)造更快捷、高效的上傳體驗,感興趣的朋友跟隨小編一起看看吧2024-03-03
el-select 點擊按鈕滾動到選擇框頂部的實現(xiàn)代碼
本文通過實例代碼給大家分享el-select 點擊按鈕滾動到選擇框頂部效果,主要代碼是在visibleChange在這個popper里面找到.el-select-dropdown__list,感興趣的朋友跟隨小編一起看看吧2024-05-05
Vue?使用?ElementUi?el-upload?手動上傳文件限制上傳文件類型大小同名等進行限制
個人在做文件上傳功能的時候,踩過不少的坑,特在此記錄下,本文介紹Vue使用?ElementUi?el-upload?手動上傳文件限制上傳文件類型大小同名等進行限制問題,感興趣的朋友一起看看吧2024-02-02

