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

Vue 2源碼解析HTMLParserOptions.start函數(shù)方法

 更新時(shí)間:2022年08月15日 14:46:38   作者:MiyueFE  
這篇文章主要為大家介紹了Vue 2源碼解析HTMLParserOptions.start函數(shù)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

HTMLParserOptions.start()

用來解析標(biāo)簽的開始部分(匹配到標(biāo)簽開始部分時(shí)調(diào)用),主要區(qū)分標(biāo)簽類型、解析標(biāo)簽指令配置與動(dòng)態(tài)綁定參數(shù)等等。

let root
let currentParent
function start(tag, attrs, unary, start, end) {
  const ns = (currentParent && currentParent.ns) || platformGetTagNamespace(tag)
  if (isIE && ns === 'svg') attrs = guardIESVGBug(attrs)
  let element: ASTElement = createASTElement(tag, attrs, currentParent)
  if (ns) element.ns = ns
  if (__DEV__) {
    if (options.outputSourceRange) {
      element.start = start
      element.end = end
      element.rawAttrsMap = element.attrsList.reduce((cumulated, attr) ={
        cumulated[attr.name] = attr
        return cumulated
      }, {})
    }
    attrs.forEach(attr =invalidAttributeRE.test(attr.name) && warn(''))
  }
  if (isForbiddenTag(element) && !isServerRendering()) {
    element.forbidden = true
    __DEV__ && warn('')
  }
  for (let i = 0; i < preTransforms.length; i++) {
    element = preTransforms[i](element, options) || element
  }
  if (!inVPre) {
    processPre(element)
    if (element.pre) inVPre = true
  }
  if (platformIsPreTag(element.tag)) inPre = true
  if (inVPre) processRawAttrs(element)
  else if (!element.processed) {
    processFor(element)
    processIf(element)
    processOnce(element)
  }
  if (!root) {
    root = element
    if (__DEV__) checkRootConstraints(root)
  }
  if (!unary) {
    currentParent = element
    stack.push(element)
  } else {
    closeElement(element)
  }
},

start 函數(shù)在解析完標(biāo)簽的開始部分后被調(diào)用,接收的五個(gè)參數(shù)分別是:標(biāo)簽名 tag,標(biāo)簽的屬性數(shù)組 attrs,是否自閉合 unary,起點(diǎn)位置 start,結(jié)束位置 end

  • 進(jìn)入函數(shù)之后,首先會(huì)驗(yàn)證 當(dāng)前元素的父元素的標(biāo)簽命名空間(svg,math或者undefined),如果是 svg 元素,還會(huì)對(duì)解析出來的 attrs 對(duì)象進(jìn)行處理,去掉 svg 標(biāo)簽定義屬性(xmlns 之類的屬性)
  • 調(diào)用 createASTElement(tag, attrs, currentParent) 方法創(chuàng)建當(dāng)前元素對(duì)應(yīng)的 AST 對(duì)象 element。此時(shí)結(jié)構(gòu)如下:
{
  type: 1,
  tag: tag,
  attrsList: attrs,
  attrsMap: makeAttrsMap(attrs),
  rawAttrsMap: {},
  parent: currentParent,
  children: []
}
  • 在開發(fā)環(huán)境下,還會(huì)將節(jié)點(diǎn)在字符串中的位置與節(jié)點(diǎn)原有的屬性進(jìn)行記錄,并且 校驗(yàn)屬性名 是否合法(禁止空格,引號(hào),尖括號(hào),反斜杠和等號(hào))
  • 校驗(yàn)標(biāo)簽合法性,如果是 style,script 之類的標(biāo)簽會(huì)被標(biāo)記為“被禁止”(element.forbidden = true
  • 遍歷 preTransforms 數(shù)組配置的處理函數(shù),分別處理當(dāng)前節(jié)點(diǎn)的 ast 結(jié)果,并重新更新節(jié)點(diǎn)的 ast 對(duì)象(這里只處理 input)

處理后的 input ast element

這里處理后的 input ast element,會(huì)比基礎(chǔ)的 ast element 要多一些屬性:

{
attrs: [],
attrsList: [],
attrsMap: { 'v-model': 'xxx' },
chidlren: [],
derectives: [{ isDynamicArg: false, modifiers: undefined, name: 'model', rawName: 'model', value: 'xxx' }],
events: {
 input: { dynamic: undefined, value: "if($event.target.composing)return;xxx=$event.target.value" }
},
hasBindings: true,
parent: currentParent,
plain: false,
props: [{ dynamic: undefined, name: 'value', value: '(xxx)' }],
rawAttrsMap: {},
static: false
}

雖然上面也省略了幾個(gè)屬性和部分屬性值,但是重點(diǎn)屬性都在里面。在 preTransforms 過程中,實(shí)際上是通過 preTransformNode() 函數(shù)處理 input 標(biāo)簽,并且該標(biāo)簽具有 v-model 配置,沒有 v-model 時(shí)直接退出。

之后會(huì)判斷該元素是否有動(dòng)態(tài)綁定類型,如果是 動(dòng)態(tài)綁定的元素類型,則會(huì)增加一個(gè) ifConditions 配置,內(nèi)部會(huì)填充 checkbox, radio 和 其他 input 類型的標(biāo)簽,用來根據(jù)不同的情況顯示不同的展示形式(個(gè)人理解這里為什么只有三種,是因?yàn)?checkbox 和 radio 與其他的 input 輸入框差別比較大,而且需要 label 標(biāo)簽配合)

  • 判斷元素有沒有設(shè)置 v-pre 指令或者是一個(gè) pre 標(biāo)簽,重新設(shè)置 inVPre, inPre 的狀態(tài)
  • 如果此時(shí) inVPre === true,則直接跳過這個(gè)節(jié)點(diǎn)內(nèi)部的編譯;否則會(huì)依次判斷 v-for,v-if 和 v-once 配置并進(jìn)行編譯

這里會(huì)先判斷 for 循環(huán)再判斷 if 條件,所以才有 for 的優(yōu)先級(jí)高于 if。

如果存在 v-for,會(huì)在 ast 對(duì)象中添加 forforProcessed 屬性,并解析條件;如果內(nèi)部有文本節(jié)點(diǎn)要顯示循環(huán)的值,則會(huì)在標(biāo)簽最末級(jí)創(chuàng)建一個(gè)文本節(jié)點(diǎn)并綁定顯示條件

如果存在 v-if,會(huì)在 ast 對(duì)象中添加 ififProcessed 屬性,并添加一個(gè) ifConditions 屬性,存放不同條件下的 ast 節(jié)點(diǎn)對(duì)象和渲染條件

如果有 v-once,一樣會(huì)在 ast 對(duì)象中添加 onceonceProcessed,并且會(huì)標(biāo)記 staticProcessed

  • 上面的過程執(zhí)行完之后,如果此時(shí)外部的 root 是 undefined,則會(huì)將當(dāng)前的節(jié)點(diǎn)作為根元素賦值給 root,并調(diào)用 checkRootConstraints 檢查根節(jié)點(diǎn)
  • 如果當(dāng)前節(jié)點(diǎn)是一個(gè)自閉合標(biāo)簽,則直接調(diào)用 closeElement 結(jié)束該節(jié)點(diǎn);不然則將該節(jié)點(diǎn)賦值給 currentParent 并插入 stack 解析棧,以供子節(jié)點(diǎn)的解析

以上就是Vue 2源碼解析HTMLParserOptions.start函數(shù)方法的詳細(xì)內(nèi)容,更多關(guān)于Vue HTMLParserOptions.start的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue實(shí)現(xiàn)全選和反選功能

    vue實(shí)現(xiàn)全選和反選功能

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)全選和反選功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • vue-quill-editor插入圖片路徑太長(zhǎng)問題解決方法

    vue-quill-editor插入圖片路徑太長(zhǎng)問題解決方法

    這篇文章主要介紹了vue-quill-editor插入圖片路徑太長(zhǎng)問題解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 在vue中實(shí)現(xiàn)清除echarts上次保留的數(shù)據(jù)(親測(cè)有效)

    在vue中實(shí)現(xiàn)清除echarts上次保留的數(shù)據(jù)(親測(cè)有效)

    這篇文章主要介紹了在vue中實(shí)現(xiàn)清除echarts上次保留的數(shù)據(jù)(親測(cè)有效),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • vue3響應(yīng)式轉(zhuǎn)換常用API操作示例代碼

    vue3響應(yīng)式轉(zhuǎn)換常用API操作示例代碼

    在Vue 3中,響應(yīng)式系統(tǒng)得到了顯著改善,包括使用Composition API時(shí)更加靈活的狀態(tài)管理,這篇文章主要介紹了vue3響應(yīng)式轉(zhuǎn)換常用API操作示例代碼,需要的朋友可以參考下
    2024-08-08
  • 詳解Vue3-pinia狀態(tài)管理

    詳解Vue3-pinia狀態(tài)管理

    這篇文章主要介紹了Vue3-pinia狀態(tài)管理,pinia是?vue3?新的狀態(tài)管理工具,簡(jiǎn)單來說相當(dāng)于之前?vuex,它去掉了?Mutations?但是也是支持?vue2?的,需要的朋友可以參考下
    2022-08-08
  • Vue?3.0如何配置TypeScript支持(推薦)

    Vue?3.0如何配置TypeScript支持(推薦)

    隨著應(yīng)用的增長(zhǎng),靜態(tài)類型系統(tǒng)可以幫助防止許多潛在的運(yùn)行時(shí)錯(cuò)誤,這就是為什么Vue 3是用TypeScript編寫的,本文給大家介紹Vue?3.0如何配置TypeScript支持,感興趣的朋友一起看看吧
    2023-12-12
  • vue項(xiàng)目中onscroll的坑及解決

    vue項(xiàng)目中onscroll的坑及解決

    這篇文章主要介紹了vue項(xiàng)目中onscroll的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 詳解用vue.js和laravel實(shí)現(xiàn)微信授權(quán)登陸

    詳解用vue.js和laravel實(shí)現(xiàn)微信授權(quán)登陸

    本篇文章主要介紹了詳解用vue.js和laravel實(shí)現(xiàn)微信授權(quán)登陸,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • Vue實(shí)現(xiàn)Dialog封裝

    Vue實(shí)現(xiàn)Dialog封裝

    在寫業(yè)務(wù)的時(shí)候很常見的一個(gè)場(chǎng)景就是需要在不同的頁面調(diào)用同一個(gè)表單,常用的交互就是把表單以彈窗的形式展示,本文主要介紹了Vue實(shí)現(xiàn)Dialog封裝,感興趣的可以了解一下
    2021-07-07
  • vue項(xiàng)目中的.env文件加載方式

    vue項(xiàng)目中的.env文件加載方式

    在Vue項(xiàng)目中,通過.env文件配置環(huán)境變量,支持不同環(huán)境下加載不同配置,Vite通過import.meta.env向應(yīng)用暴露環(huán)境變量,支持基本URL、開發(fā)環(huán)境和生產(chǎn)環(huán)境識(shí)別等,.env文件可設(shè)置環(huán)境優(yōu)先級(jí),修改后需重啟生效,TypeScript可通過增加文件獲取智能提示
    2024-10-10

最新評(píng)論

义乌市| 化隆| 商南县| 郴州市| 昌平区| 绍兴县| 临颍县| 天全县| 祁阳县| 遂昌县| 吴旗县| 图片| 林西县| 泊头市| 江川县| 永平县| 商都县| 新建县| 邵阳县| 皮山县| 蓬莱市| 盘锦市| 昆山市| 雷波县| 丘北县| 元江| 沿河| 偃师市| 淳化县| 札达县| 教育| 宜君县| 黄龙县| 上栗县| 获嘉县| 松溪县| 牙克石市| 门头沟区| 蒙山县| 内丘县| 黄梅县|