vue源碼2

? ? ? ? vue之mustache庫的機理其實是將模板字符串轉化為tokens 然后再將 tokens 轉化為 dom字符串,如下圖

?對于一般的將模板字符串轉化為dom字符串,這樣不能實現復雜的功能

let data = {name:'小王',age:18
}
let templateStr = `<h1>我叫{{name}},我今年{{age}}歲<h1>
`
templateStr = templateStr.trim()let htmlStr = templateStr.replace(/\{{(\w+)}}/g,function(match,$1,index){//第一個參數為他尋找的部分,第二個為捕獲的東西,第三個所在的位置,第四個為該字符串return data[$1] })
console.log(htmlStr) //我叫小王,我今年18歲

?將模板字符串轉化為tokens

前面已經知道了musache的工作原理為 將模板字符串轉化為tokens,然后再將tokens轉化為BOM字符串所以此小節的任務為:

class Scanner {constructor (templateStr ){//將模板字符串寫到實例身上this.templateStr = templateStr//指針this.pos = 0//尾巴,剛開始為字符串本身this.tail = templateStr}//讓指針跳過目標,進而掃描后面的內容scan(target){this.pos += target.lengththis.tail = this.templateStr.substring(this.pos)}//掃描字符串,直到掃描到目標,返回目標之前的字符串scanUtil(target) {let recordPosValue = this.pos//如果該字符串的地一個元素即該目標的索引不為0時,說明指針還需要往右走while(this.tail.indexOf(target)!=0&&this.pos<this.templateStr.length){this.pos++;//尾巴變為pos后面的部分this.tail = this.templateStr.substring(this.pos)}return this.templateStr.substring(recordPosValue,this.pos)}
}
export default function becomeEasyToken (templateStr){let token = []//實例化一個掃描器,針對模板字符串工作let scanner = new Scanner(templateStr)while(scanner.pos<templateStr.length){let word;word = scanner.scanUtil('{{');if(word !=''){token.push(["text",word])}scanner.scan('{{')word = scanner.scanUtil("}}")if(word !=''){if(word[0] == "#"){token.push(["#",word.substring(1)])}else if(word[0]=="/"){token.push(['/',word.substring(1)])}else{token.push(["name",word])}}scanner.scan("}}")}return token
}

以上代碼沒有處理 "#" 的循環功能?,所以還必須添加一個函數,并對該返回值稍加修改

import foldToken  from "./foldToken";
export default function becomeEasyToken (templateStr){let token = []//實例化一個掃描器,針對模板字符串工作let scanner = new Scanner(templateStr)while(scanner.pos<templateStr.length){let word;word = scanner.scanUtil('{{');if(word !=''){token.push(["text",word])}scanner.scan('{{')word = scanner.scanUtil("}}")if(word !=''){if(word[0] == "#"){token.push(["#",word.substring(1)])}else if(word[0]=="/"){token.push(['/',word.substring(1)])}else{token.push(["name",word])}}scanner.scan("}}")}return foldToken(token)
}
export default function foldToken(tokens) {//結果數組let nestedTokens = []//棧結構,存放小tokenslet section = [];//與nestedTokens指向的是同一數組,該數組為一級數組let collentor = nestedTokensfor (const item of tokens) {switch (item[0]) {case "#"://進棧section.push(item)collentor.push(item)//創建新一級的數組collentor = item[2] = [] break;case "/"://出棧section.pop(item)//如果都出完了,則回到一級數組,還沒出完則回到其上一級collentor =  section.length>0?section[section.length-1][2]:nestedTokensbreak;default://僅負責給各級數組添加 "text" 元素collentor.push(item)}}return nestedTokens;
}

效果展示:

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15625.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15625.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15625.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

centos7 服務開機自啟動 - systemctl -以禪道為例

在服務器上安裝的各種中間件&#xff0c;一般都需要配置成開機自啟動。但是有些中間件的安裝過程中并沒有提供相關配置開機自啟動的說明文檔。本文總結一下Centos7通過systemctl enble配置服務自啟動的方法。一、Centos7通過systemctl enble配置服務自啟動 在Centos7后&#x…

GraphSAGE

GraphSAGE 節點采樣&#xff1a;聚合&#xff08;Aggregation&#xff09;&#xff1a;更新&#xff08;update&#xff09;&#xff1a;例子&#xff1a;總結&#xff1a; 啥是GraphSAGE呢&#xff1f; 是一種用于圖嵌入的無監督學習方法。 通過采樣和聚合鄰居節點的信息來生成…

【一步一步了解Java系列】:Java中的方法對標C語言中的函數

看到這句話的時候證明&#xff1a;此刻你我都在努力~ 加油陌生人~ 個人主頁&#xff1a;Gu Gu Study 專欄&#xff1a;一步一步了解Java 喜歡的一句話&#xff1a; 常常會回顧努力的自己&#xff0c;所以要為自己的努力留下足跡。 _ 如果喜歡能否點個贊支持一下&#xff0c;謝謝…

Xfce4桌面背景和桌面圖標消失問題解決@FreeBSD

問題&#xff1a;Xfce4桌面背景和桌面圖標消失 以前碰到過好幾次桌面背景和桌面圖標消失&#xff0c;整個桌面除了上面一條和下面中間的工具條&#xff0c;其它地方全是黑色的問題&#xff0c;但是這次重啟之后也沒有修復&#xff0c;整個桌面烏黑一片&#xff0c;啥都沒有&am…

認知V2X的技術列一個學習大綱

為了深入學習和理解V2X&#xff08;Vehicle to Everything&#xff09;技術&#xff0c;以下是一個學習大綱的概述&#xff0c;結合了參考文章中的相關數字和信息&#xff1a; 一、V2X技術基礎 V2X概述 定義&#xff1a;V2X是車用無線通信技術&#xff0c;將車輛與一切事物相連…

WebService相關內容

WebService中的wsdl什么意思? WSDL(Web Services Description Language)Web服務描述語言及其功能、操作、參數和返回值的XML格式的語言。它在Java和其他編程語言中都可以使用,用于定義Web服務的接口以及如何與這些服務進行交互。 WSDL的作用 WSDL的主要作用是提供一種標準…

idea上傳git命令

git init git remote add origin git add . git commit -m "標題" git push -u origin master

Qt 模型視圖詳細介紹

一.文件系統模型&#xff08;QFileSystemModel&#xff09; 1.定義 QFileSystemModel 是 Qt 框架中的一個類&#xff0c;它提供了一個用于管理文件系統結構的模型。它可以用于顯示文件系統的目錄結構&#xff0c;以及在視圖中顯示文件和文件夾的詳細信息。 這個模型將文件系統…

15分鐘Element-UI快速入門

Element-UI 是一個基于 Vue.js 2.0 的桌面端組件庫&#xff0c;它提供了豐富的、可復用的組件&#xff0c;幫助開發者快速構建出美觀且功能強大的網頁應用。以下是一個 Element-UI 的快速入門指南&#xff1a; 1. 安裝 Element-UI 首先&#xff0c;你需要在你的 Vue.js 項目中…

各種測試方法,黑盒測試、白盒測試,靜態測試,動態測試

1.測試方法 軟件測試方法的分類有很多種&#xff0c;以測試過程中程序執行狀態為依據可分為靜態測試 (Static Testing,ST) 和動態測試 (Dynamic Testing,DT); 以具體實現算法細節和系統內部結構的相 關情況為根據可分黑盒測試、白盒測試和灰盒測試3類&#xff1b;從程序執行的方…

Python編程之調試魔法與列表逆轉之謎

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、調試魔法&#xff1a;揭開Python編程的神秘面紗 代碼調試實例 二、列表逆轉之謎&#…

實驗一:通過路由器實現內外網互聯

通過路由器實現內外網互聯 一、實驗拓撲 相關配置詳見下圖&#xff0c;內網區域為AR2以內設備&#xff0c;外網區域以AR1和PC1代替進行實驗測試。 二、實驗要求 通過路由器實現內外網互聯&#xff1a; 1.各內網PC可自動獲取ip地址&#xff1b; 2.各內網PC可ping通外網PC&…

SCSS 基本使用詳解

一、引言 SCSS 是 Sass&#xff08;Syntactically Awesome Stylesheets&#xff09;的其中一種語法&#xff0c;是一種預處理器腳本語言&#xff0c;能夠擴展 CSS 的功能&#xff0c;使其更加強大和高效。SCSS 保留了 CSS 的原有語法&#xff0c;同時增加了變量、嵌套規則、混…

藍海卓越計費管理系統 agent_setstate.php SQL注入漏洞復現

0x01 產品簡介 藍海卓越計費管理系統是一套以實現網絡運營為基礎,增強全局安全為中心,提高管理效率為目的的網絡安全運營管理系統,提供“高安全、可運營、易管理”的運營管理體驗,基于標準的RADIUS協議開發,它不僅支持PPPOE和WEB認證計費,還支持802.1X接入控制技術,與其…

WordPress外貿網站建設的成功要素與技術點

WordPress作為一款強大的建站平臺&#xff0c;為外貿企業提供了豐富的功能和靈活的定制選項。在這篇文章中&#xff0c;我們將揭示一些成功建站的秘笈&#xff0c;涵蓋了WordPress外貿網站建設中的關鍵要素和技術點&#xff0c;幫助您打造一個引領行業的成功網站。 1. 選擇合適…

【java深入學習第3章】利用 Spring Boot 和 Screw 快速生成數據庫設計文檔

免費多模型AI網站,支持豆包、GPT-4o、谷歌Gemini等AI模型&#xff0c;無限制使用&#xff0c;快去白嫖&#x1f449;海鯨AI&#x1f525;&#x1f525;&#x1f525; 在開發過程中&#xff0c;數據庫設計文檔是非常重要的&#xff0c;它可以幫助開發者理解數據庫結構&#xff0…

Kubernetes部署dashboard

Kubernetes部署dashboard Kubernetes集群安裝 鯤鵬arm64架構下安裝KubeSphere linux安裝部署k8s(kubernetes)和解決遇到的坑 dashboard部署 $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashbo…

STM32學習和實踐筆記(30):窗口看門狗(WWDG)實驗

1.WWDG介紹 1.1 WWDG簡介 上一章我們已經介紹了IWDG&#xff0c;知道它的工作原理就是一個12位遞減計數器不斷遞減計數&#xff0c;當減到0之前還未進行喂狗的話&#xff0c;產生一個MCU復位。 窗口看門狗WWDG其實和獨立看門狗類似&#xff0c;它是一個7位遞減計數器不斷的往…

Vue3在Element UI 表格中自定義時間格式化顯示

Vue3在Element UI 表格中自定義時間格式化顯示 一、前言1、準備工作2、實現步驟1. 引入 Element UI 組件2. 自定義時間格式化函數3. 格式化日期邏輯 3、完整示例4、結論 一、前言 在開發 Web 應用程序時&#xff0c;常常需要在表格中展示時間數據。Element UI 是一個流行的 Vu…

【Python】 如何在Python中創建GUID UUID

基本原理 GUID&#xff08;全局唯一標識符&#xff09;和UUID&#xff08;通用唯一標識符&#xff09;都是用來在分布式系統中唯一標識信息的。在Python中&#xff0c;我們可以使用內置的uuid模塊來生成這些唯一標識符。 UUID有幾種不同的版本&#xff0c;每種版本都有其特定…