摘要:原文地址項目地址實現了解析器的功能,使用狀態機正則表達式等來對表達式文本指令等進行解析在這里引用了,實現了一個雙向鏈表,它會保存最近使用過的對象,在數量超出限制的情況下會拋棄最近沒有使用的對象,思想基于,參考自用于解析指令
src/parsers
原文地址
項目地址
parsers 實現了解析器的功能,使用狀態機、正則表達式等來對表達式、html、文本、指令等進行解析
src/parsers/directive.js在這里引用了 cache,cache 實現了一個雙向鏈表,它會保存最近使用過的對象,在數量超出限制的情況下會拋棄最近沒有使用的對象,思想基于 Least Recently Used, 參考自:https://github.com/rsms/js-lru
directive 用于解析指令:
import { toNumber, stripQuotes } from "../util/index" import Cache from "../cache" const cache = new Cache(1000) const filterTokenRE = /[^s""]+|"[^"]*"|"[^"]*"/g const reservedArgRE = /^in$|^-?d+/ /** * Parser state */ var str, dir var c, i, l, lastFilterIndex var inSingle, inDouble, curly, square, paren ... /** * Parse a directive value and extract the expression * and its filters into a descriptor. * * Example: * * "a + 1 | uppercase" will yield: * { * expression: "a + 1", * filters: [ * { name: "uppercase", args: null } * ] * } * * @param {String} str * @return {Object} */ export function parseDirective (s) { var hit = cache.get(s) if (hit) { return hit } // reset parser state str = s inSingle = inDouble = false curly = square = paren = 0 lastFilterIndex = 0 dir = {} for (i = 0, l = str.length; i < l; i++) { c = str.charCodeAt(i) if (inSingle) { // check single quote if (c === 0x27) inSingle = !inSingle } else if (inDouble) { // check double quote if (c === 0x22) inDouble = !inDouble } else if ( c === 0x7C && // pipe str.charCodeAt(i + 1) !== 0x7C && str.charCodeAt(i - 1) !== 0x7C ) { if (dir.expression == null) { // first filter, end of expression lastFilterIndex = i + 1 dir.expression = str.slice(0, i).trim() } else { // already has filter pushFilter() } } else { switch (c) { case 0x22: inDouble = true; break // " case 0x27: inSingle = true; break // " case 0x28: paren++; break // ( case 0x29: paren--; break // ) case 0x5B: square++; break // [ case 0x5D: square--; break // ] case 0x7B: curly++; break // { case 0x7D: curly--; break // } } } } if (dir.expression == null) { dir.expression = str.slice(0, i).trim() } else if (lastFilterIndex !== 0) { pushFilter() } cache.put(s, dir) return dir }
由于指令可能同時包含表達式和過濾器,如果兩者同時存在會以 | 符號分隔開
循環遍歷字符找出對應的表達式和過濾器
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88353.html
摘要:所以整個的核心,就是如何實現這三樣東西以上摘自囧克斯博客的一篇文章從版本開始這個時候的項目結構如下源碼在里面,為打包編譯的代碼,為打包后代碼放置的位置,為測試代碼目錄。節點類型摘自資源另一位作者關于源碼解析 本項目的源碼學習筆記是基于 Vue 1.0.9 版本的也就是最早的 tag 版本,之所以選擇這個版本,是因為這個是最原始沒有太多功能拓展的版本,有利于更好的看到 Vue 最開始的骨...
摘要:中的每個對象會一份實際的對象的數據放在外面,改變這些數據并不會反應到實際的對象上,如果我們希望真的改變對象的數據,有一個隱藏屬性可以做到就是例子很多情況下你寫了一個指令很可能會依賴或者需要解析另外一個指令,比如,然而中的指令并沒有這方面的 __vue__ $els中的每個對象會copy一份實際的Vue對象(vm)的數據放在外面,改變這些數據并不會反應到實際的Vue對象上,如果我們希望真...
摘要:實現了一個簡單的訂閱觀察者類,這個類被用于在數據修改時通知各個以觸發對應的更新,從而實現數據的響應,這個會在后續的數據響應化里提到。 observer 實現了一個簡單的訂閱觀察者類,這個類被用于在數據修改時通知各個 watcher 以觸發對應的更新,從而實現數據的響應,這個會在后續的數據響應化里提到。 原文地址項目地址 src/observer src/observer/dep.js ...
摘要:整體概覽源碼最終是向外部拋出一個的構造函數,見源碼在源碼最開始,通過方法見源碼向構造函數添加全局方法,如等,主要初始化一些全局使用的方法變量和配置實例化當使用時,最基本使用方式如下此時,會調用構造函數實例化一個對象,而在構造函數中只有這句代 整體概覽 Vue源碼最終是向外部拋出一個Vue的構造函數,見源碼: function Vue (options) { this._init(o...
摘要:學習內容,基本語法和概念,打包工具,實戰操作參考文獻官網官方資料庫全家桶全家桶文檔概念前端框架借助可以實現手機開發前端框架是一套構造用戶界面的框架,只關于視圖層前端的主要工作室跟用戶界面打交道,中的,實現界面效果框架是為了提高開發 學習內容 1,Vue基本語法和概念 2, 打包工具 Webpack , Gulp3,實戰操作 參考文獻:官網: https://cn.vuejs.org...
閱讀 3319·2021-11-23 09:51
閱讀 2436·2021-11-09 09:46
閱讀 1476·2019-08-30 15:54
閱讀 3121·2019-08-30 14:22
閱讀 2909·2019-08-29 12:40
閱讀 1629·2019-08-26 10:33
閱讀 1774·2019-08-23 17:09
閱讀 1553·2019-08-23 16:11