国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

vueparseHTML函數(shù)拿到返回值后的處理源碼解析

3403771864 / 415人閱讀

  承繼上篇內(nèi)容:下面是parseHTML 函數(shù)源碼解析

  var startTagMatch = parseStartTag();
  if (startTagMatch) {
  handleStartTag(startTagMatch);
  if (shouldIgnoreFirstNewline(startTagMatch.tagName, html)) {
  advance(1);
  }
  continue
  }

  在之前這篇文章中寫(xiě)明startTagMatch 就用來(lái)獲取parseStartTag函數(shù)的返回值。并只有在成功匹配到開(kāi)始標(biāo)簽的情況下parseStartTag 才會(huì)返回解析結(jié)果(一個(gè)對(duì)象),否則返回undefined。

  假設(shè)有如下html(template)字符串:

  <div id="box" v-if="watings"></div>

  parseStartTag函數(shù)返回值

  則parseStartTag函數(shù)的返回值如下:

  match = {
  tagName: 'div',
  attrs: [
  [
  'id="box"',
  'id',
  '=',
  'box',
  undefined,
  undefined
  ],
  [
  ' v-if="watings"',
  'v-if',
  '=',
  'watings',
  undefined,
  undefined
  ]
  ],
  start: index,
  unarySlash: undefined,
  end: index
  }

  handleStartTag源碼

  如果匹配成功,if語(yǔ)句代碼被執(zhí)行,得出的結(jié)果作為參數(shù)傳遞給 handleStartTag 函數(shù),handleStartTag源碼如下:

  function handleStartTag(match) {
  var tagName = match.tagName;
  var unarySlash = match.unarySlash;
  if (expectHTML) {
  if (lastTag === 'p' &amp;&amp; isNonPhrasingTag(tagName)) {
  parseEndTag(lastTag);
  }
  if (canBeLeftOpenTag$$1(tagName) &amp;&amp; lastTag === tagName) {
  parseEndTag(tagName);
  }
  }
  var unary = isUnaryTag$$1(tagName) || !!unarySlash;
  var l = match.attrs.length;
  var attrs = new Array(l);
  for (var i = 0; i &lt; l; i++) {
  var args = match.attrs[i];
  var value = args[3] || args[4] || args[5] || '';
  var shouldDecodeNewlines = tagName === 'a' &amp;&amp; args[1] === 'href' ?
  options.shouldDecodeNewlinesForHref :
  options.shouldDecodeNewlines;
  attrs[i] = {
  name: args[1],
  value: decodeAttr(value, shouldDecodeNewlines)
  };
  }
  if (!unary) {
  stack.push({
  tag: tagName,
  lowerCasedTag: tagName.toLowerCase(),
  attrs: attrs
  });
  lastTag = tagName;
  }
  if (options.start) {
  options.start(tagName, attrs, unary, match.start, match.end);
  }
  }

  tagName 及unarySlash

  handleStartTag函數(shù)的作用就是處理標(biāo)簽的解析結(jié)果,所以它接收parseStartTag函數(shù)的返回值作為參數(shù)。handleStartTag函數(shù)的一開(kāi)始定義兩個(gè)常量:tagName 以及 unarySlash:

  var tagName = match.tagName;
  var unarySlash = match.unarySlash;

  通過(guò)對(duì)于上章節(jié)內(nèi)容解析,tagName 存儲(chǔ)解析開(kāi)始標(biāo)簽的標(biāo)簽名,unarySlash 是判斷開(kāi)始標(biāo)簽是否為一元標(biāo)簽。

  接著是一個(gè)if語(yǔ)句塊,if語(yǔ)句的判斷條件是if (expectHTML),前面說(shuō)過(guò)expectHTML 是parser選項(xiàng),是一個(gè)布爾值,如果為真則該 if 語(yǔ)句塊的代碼將被執(zhí)行。但是現(xiàn)在我們暫時(shí)不看這段代碼,因?yàn)檫@段代碼包含 parseEndTag 函數(shù)的調(diào)用,所以待我們講解完 parseEndTag 函數(shù)之后,再回頭來(lái)說(shuō)這段代碼。

  在往下定義了三個(gè)變量:

  var unary = isUnaryTag$$1(tagName) || !!unarySlash;
  var l = match.attrs.length;
  var attrs = new Array(l);

  變量 unary 是一個(gè)布爾值,當(dāng)它為真時(shí)代表著標(biāo)簽是一元標(biāo)簽,否則是二元標(biāo)簽。

  他們通過(guò)isUnaryTag來(lái)判斷,其原理通過(guò)傳遞的標(biāo)簽名判斷是否有跟預(yù)設(shè)標(biāo)準(zhǔn)HTML中規(guī)定的那些一元標(biāo)簽一致。

  l 和 attrs ,其中常量 l 的值存儲(chǔ)著 match.attrs 數(shù)組的長(zhǎng)度,而 attrs 常量則是一個(gè)與match.attrs數(shù)組長(zhǎng)度相等的數(shù)組。

  這兩個(gè)常量將被用于接下來(lái)的for循環(huán)中:

  for (var i = 0; i < l; i++) {
  var args = match.attrs[i];
  var value = args[3] || args[4] || args[5] || '';
  var shouldDecodeNewlines = tagName === 'a' && args[1] === 'href' ?
  options.shouldDecodeNewlinesForHref :
  options.shouldDecodeNewlines;
  attrs[i] = {
  name: args[1],
  value: decodeAttr(value, shouldDecodeNewlines)
  };
  }

  具體看一下循環(huán)體的代碼,首先定義 args 常量,它的值就是每個(gè)屬性的解析結(jié)果,即match.attrs 數(shù)組中的元素對(duì)象。

  變量 value 中就保存著最終的屬性值,如果第4、5、6 項(xiàng)都沒(méi)有獲取到屬性值,那么屬性值將被設(shè)置為一個(gè)空字符串:''。

  屬性值獲取到了之后,就可以拼裝最終的 attrs 數(shù)組。

  attrs 數(shù)組的每個(gè)元素對(duì)象只包含兩個(gè)元素,即屬性名 name 和屬性值 value ,對(duì)于屬性名直接從 args[1] 中即可獲取,但我們發(fā)現(xiàn)屬性值卻沒(méi)有直接使用前面獲取到的 value ,而是將傳value 遞給了decodeAttr 函數(shù),并使用該函數(shù)的返回值作為最終的屬性值。

  decodeAttr 函數(shù)的作用是對(duì)屬性值中所包含的 html 實(shí)體進(jìn)行解碼,將其轉(zhuǎn)換為實(shí)體對(duì)應(yīng)的字符。關(guān)于 shouldDecodeNewlinesForHref 與 shouldDecodeNewlines 可回顧章節(jié)

  接下來(lái)是:

  if (!unary) {
  stack.push({
  tag: tagName,
  lowerCasedTag: tagName.toLowerCase(),
  attrs: attrs
  });
  lastTag = tagName;
  }

  這個(gè)if條件是當(dāng)開(kāi)始標(biāo)簽是非一元標(biāo)簽時(shí)才會(huì)執(zhí)行,其目的是: 如果開(kāi)始標(biāo)簽是非一元標(biāo)簽,則將該開(kāi)始標(biāo)簽的信息入棧,即push到stack數(shù)組中,并將lastTag的值設(shè)置為該標(biāo)簽名。

  在講解 parseHTML 函數(shù)開(kāi)頭定義的變量和常量的過(guò)程中,我們講解過(guò) stack 常量以及l(fā)astTage 變量,其目的是將來(lái)判斷是否缺少閉合標(biāo)簽,并且現(xiàn)在大家應(yīng)該知道為什么 lastTag 所存儲(chǔ)的標(biāo)簽名字始終保存著 stack 棧頂?shù)脑亓恕?/p>

  調(diào)用parser鉤子函數(shù)

  最后一段代碼調(diào)用parser鉤子函數(shù)的:

  if (options.start) {
  options.start(tagName, attrs, unary, match.start, match.end);
  }

  當(dāng) parser 選項(xiàng)中包含 options.start 函數(shù),表示調(diào)用,同時(shí)將開(kāi)始標(biāo)簽的名字命名為tagName ,當(dāng)格式化后的屬性數(shù)組為 attrs。那是不是一元標(biāo)簽 unary ,且開(kāi)始標(biāo)簽的開(kāi)始和技術(shù)位置是在原 html 中match.start 和 match.end 作為參數(shù)傳遞。


文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/127766.html

相關(guān)文章

  • 【Vue原理】Filters - 源碼

    摘要:寫(xiě)文章不容易,點(diǎn)個(gè)贊唄兄弟專(zhuān)注源碼分享,文章分為白話版和源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于版本如果你覺(jué)得排版難看,請(qǐng)點(diǎn)擊下面鏈接或者拉到下面關(guān)注公眾號(hào)也可以吧原理源碼版嗨,又到周末啦,又可以睡 寫(xiě)文章不容易,點(diǎn)個(gè)贊唄兄弟專(zhuān)注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于...

    oujie 評(píng)論0 收藏0
  • 【Vue原理】Slot - 白話版

    摘要:寫(xiě)文章不容易,點(diǎn)個(gè)贊唄兄弟專(zhuān)注源碼分享,文章分為白話版和源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于版本如果你覺(jué)得排版難看,請(qǐng)點(diǎn)擊下面鏈接或者拉到下面關(guān)注公眾號(hào)也可以吧原理白話版插槽作為組件一個(gè)重要的部 寫(xiě)文章不容易,點(diǎn)個(gè)贊唄兄弟專(zhuān)注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于...

    chanthuang 評(píng)論0 收藏0
  • 【Filecoin源碼倉(cāng)庫(kù)全解析】第三章(上):存儲(chǔ)提供方(礦工)的配置操作

    摘要:我們會(huì)在后面的源碼倉(cāng)庫(kù)全解析第三章下存儲(chǔ)提供方礦工的配置操作章節(jié)重點(diǎn)介紹這個(gè)過(guò)程。參考文獻(xiàn)本章贊助品牌深圳牛鏈科技有限公司,是一家專(zhuān)注存儲(chǔ)類(lèi)礦機(jī)研發(fā)生產(chǎn)銷(xiāo)售托管為一體的高科技企業(yè)。感謝深圳牛鏈科技有限公司對(duì)嘉樂(lè)的原創(chuàng)內(nèi)容提供支持。 歡迎大家來(lái)到第三章,經(jīng)過(guò) 前章《【Filecoin源碼倉(cāng)庫(kù)全解析】第二章:如何創(chuàng)建賬戶(hù)錢(qián)包并獲取FIL Mock代幣的內(nèi)容閱讀后,我們應(yīng)該能順利在Filec...

    rose 評(píng)論0 收藏0
  • 深入理解react

    摘要:最近在看源碼,發(fā)覺(jué)以前對(duì)的理解實(shí)在浮淺,這里記錄了一些以前疏忽的點(diǎn)。和在里面,經(jīng)過(guò)的解析后,會(huì)變成執(zhí)行后的結(jié)果。原來(lái)對(duì)的理解就是類(lèi)似這種寫(xiě)法,現(xiàn)在看了實(shí)現(xiàn)之后才理解。 最近在看react源碼,發(fā)覺(jué)以前對(duì)react的理解實(shí)在浮淺,這里記錄了一些以前疏忽的點(diǎn)。 createElement和component 在react里面,經(jīng)過(guò)babel的解析后,jsx會(huì)變成createElement執(zhí)...

    CoderStudy 評(píng)論0 收藏0
  • 一個(gè)有味道的函數(shù)

    摘要:所以我們分析這個(gè)新需求的效果我們?cè)诤瘮?shù)執(zhí)行到一半時(shí),執(zhí)行了,的返回值為后續(xù)函數(shù)的執(zhí)行返回值。也就是說(shuō),我們?cè)谥刑幚恚苯诱{(diào)用隊(duì)列中的下一個(gè)函數(shù)即可然后監(jiān)聽(tīng)和回調(diào),即可在當(dāng)前函數(shù)中獲取到返回值拿到返回值后就可以執(zhí)行我們后續(xù)的代碼。 最近想到了一個(gè)自認(rèn)為很有意思的面試題如何實(shí)現(xiàn)一個(gè)compose函數(shù)。函數(shù)接收數(shù)個(gè)參數(shù),參數(shù)均為Function類(lèi)型,右側(cè)函數(shù)的執(zhí)行結(jié)果將作為左側(cè)函數(shù)執(zhí)行的參數(shù)...

    megatron 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<