返回顶部
首页 > 资讯 > 精选 >vue parseHTML函数拿到返回值后怎么处理
  • 352
分享到

vue parseHTML函数拿到返回值后怎么处理

2023-07-02 17:07:59 352人浏览 八月长安
摘要

今天小编给大家分享一下Vue parsehtml函数拿到返回值后怎么处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下

今天小编给大家分享一下Vue parsehtml函数拿到返回值后怎么处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

引言

parseHTML 函数源码解析

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

在上个章节中知道startTagMatch 就是获取parseStartTag函数的返回值。并只有在成功匹配到开始标签的情况下parseStartTag 才会返回解析结果(一个对象),否则返回undefined。

假设有如下html(template)字符串

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

parseStartTag函数返回值

则parseStartTag函数的返回值如下:

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语句块中的代码将会被执行,此时会将解析结果作为参数传递给 handleStartTag 函数,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函数用来处理开始标签的解析结果,所以它接收parseStartTag函数的返回值作为参数。handleStartTag函数的一开始定义两个常量:tagName 以及 unarySlash:

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

根据上章节的内容就能理解,tagName 存储解析开始标签的标签名,unarySlash 可以根据他的值判断是解析的开始标签是否为一元标签。

接着是一个if语句块,if语句的判断条件是if (expectHTML),前面说过expectHTML 是parser选项,是一个布尔值,如果为真则该 if 语句块的代码将被执行。但是现在我们暂时不看这段代码,因为这段代码包含 parseEndTag 函数的调用,所以待我们讲解完 parseEndTag 函数之后,再回头来说这段代码。

在往下定义了三个变量:

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

变量 unary 是一个布尔值,当它为真时代表着标签是一元标签,否则是二元标签。

他们通过isUnaryTag来判断,其原理通过传递的标签名判断是否有跟预设标准HTML中规定的那些一元标签一致。

l 和 attrs ,其中常量 l 的值存储着 match.attrs 数组的长度,而 attrs 常量则是一个与match.attrs数组长度相等的数组。

这两个常量将被用于接下来的for循环中:

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)};}

具体看一下循环体的代码,首先定义 args 常量,它的值就是每个属性的解析结果,即match.attrs 数组中的元素对象。

变量 value 中就保存着最终的属性值,如果第4、5、6 项都没有获取到属性值,那么属性值将被设置为一个空字符串:''。

属性值获取到了之后,就可以拼装最终的 attrs 数组。

attrs 数组的每个元素对象只包含两个元素,即属性名 name 和属性值 value ,对于属性名直接从 args[1] 中即可获取,但我们发现属性值却没有直接使用前面获取到的 value ,而是将传value 递给了decodeAttr 函数,并使用该函数的返回值作为最终的属性值。

decodeAttr 函数的作用是对属性值中所包含的 html 实体进行解码,将其转换为实体对应的字符。关于 shouldDecodeNewlinesForHref 与 shouldDecodeNewlines 可回顾章节

Vue编译器源码分析compileToFunctions作用

接下来是:

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

这个if条件是当开始标签是非一元标签时才会执行,其目的是: 如果开始标签是非一元标签,则将该开始标签的信息入栈,即push到stack数组中,并将lastTag的值设置为该标签名。

在讲解 parseHTML 函数开头定义的变量和常量的过程中,我们讲解过 stack 常量以及lastTage 变量,其目的是将来判断是否缺少闭合标签,并且现在大家应该知道为什么 lastTag 所存储的标签名字始终保存着 stack 栈顶的元素了。

调用parser钩子函数

最后一段代码调用parser钩子函数的:

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

如果 parser 选项中包含 options.start 函数,则调用之,并将开始标签的名字 tagName ,格式化后的属性数组 attrs ,是否为一元标签 unary ,以及开始标签在原 html 中的开始和结束位置match.start 和 match.end 作为参数传递。

以上就是“vue parseHTML函数拿到返回值后怎么处理”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: vue parseHTML函数拿到返回值后怎么处理

本文链接: https://lsjlt.com/news/343493.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • vue parseHTML函数拿到返回值后怎么处理
    今天小编给大家分享一下vue parseHTML函数拿到返回值后怎么处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-07-02
  • vue parseHTML 函数拿到返回值后的处理源码解析
    目录引言parseStartTag函数返回值handleStartTag源码tagName 及unarySlash调用parser钩子函数引言 继上篇文章: parseHTML 函数...
    99+
    2024-04-02
  • python函数怎么返回多个返回值
    本篇内容主要讲解“python函数怎么返回多个返回值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python函数怎么返回多个返回值”吧!一般情况下,函数只有一个返回值,但Python也支持函数...
    99+
    2023-06-30
  • Golang函数的返回值处理技巧
    go 函数可以返回多个值,处理方式包括使用命名返回值、元组、结构体和错误处理。命名返回值允许为每个返回值指定名称,便于访问和操作。元组和结构体可用于存储和组织返回值,但需要手动提取和转换...
    99+
    2024-04-15
    函数 golang
  • golang函数多个返回值的处理
    go 语言函数支持返回多个值,通过逗号分隔类型声明。使用 x, y := myfunction() 获取返回值。例如,calculaterectangle 函数返回面积和周长,可通过 a...
    99+
    2024-04-22
    函数 golang 多返回值
  • C++ 函数如何处理多个返回值?
    c++++ 函数可通过三种方式返回多个值:使用结构体:创建结构体并作为返回值,使用点运算符访问结构体成员。使用元组:使用 std::tuple 创建元组,使用 std::get(tupl...
    99+
    2024-04-13
    函数 c++ 返回值处理
  • Golang 函数返回值如何处理错误?
    go 函数使用 error 类型表示错误。调用者可通过检查 error 的值来判断函数是否执行成功。错误处理方法有:使用 if 语句或 errchk 包的 check 函数。例如:使用 ...
    99+
    2024-04-14
    golang 错误处理 git
  • python find函数找不到返回值怎么解决
    如果find()函数在字符串中找不到匹配的子字符串,它将返回-1。要解决这个问题,你可以在使用find()函数之前先使用in关键字进...
    99+
    2023-10-18
    python
  • C++ 函数返回值的异常处理机制
    c++++ 函数的返回值在发生异常时未定义,需要通过 try-catch 块捕获异常并采取适当措施:仅在函数无法从错误中恢复时抛出异常。使用明确且有意义的异常类型。在函数文档中记录可能抛...
    99+
    2024-04-13
    函数返回值 异常 c++
  • java函数怎么返回多个值
    在Java中,函数只能返回一个值。但是我们可以通过多种方式来实现返回多个值的效果: 使用数组或者集合:我们可以将多个值存储在数组或...
    99+
    2024-03-11
    java
  • python怎么获取回调函数返回值
    在Python中,可以使用callback函数来获取回调函数的返回值。以下是一个示例: def callback_function(...
    99+
    2024-02-29
    python
  • ajax后台处理返回json值示例代码怎么写
    这篇文章将为大家详细讲解有关ajax后台处理返回json值示例代码怎么写,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。代码如下:public ActionF...
    99+
    2024-04-02
  • python怎么让函数没有返回值
    python中通过在函数中添加一个return语句,实现函数没有返回值,具体方法如下:例:定义一个func函数def func(x,y):num = x + yprint(func(1,2))输出结果为:3在函数中添加一个return语句d...
    99+
    2024-04-02
  • php中怎么从函数中返回值
    这篇文章主要讲解了“php中怎么从函数中返回值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php中怎么从函数中返回值”吧!在php中,可以利用return语句来从函数中返回值,可返回函数的...
    99+
    2023-06-20
  • python怎么从函数返回多个值
    小编给大家分享一下python怎么从函数返回多个值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!从函数返回多个值python函数可以返回多个值,而无需任何额外的需...
    99+
    2023-06-27
  • C++ 函数调用详解:返回值处理的艺术
    c++++ 函数调用中的返回值处理涉及:返回值类型:定义返回数据的类型,包括原始类型和引用类型。返回值语义:决定函数如何处理返回值,包括值传递(副本返回)和引用传递(返回引用)。实战案例...
    99+
    2024-05-03
    c++ 函数调用
  • vue parseHTML函数解析器遇到结束标签会怎么样
    今天小编给大家分享一下vue parseHTML函数解析器遇到结束标签会怎么样的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了...
    99+
    2023-07-02
  • Linux 中怎么使用Shell函数返回值
    这篇文章将为大家详细讲解有关Linux 中怎么使用Shell函数返回值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1) return 语句shell函数的返回值,可以和其他语言的返回值一样...
    99+
    2023-06-09
  • C语言函数怎么返回多个值
    这篇文章主要介绍“C语言函数怎么返回多个值”,在日常操作中,相信很多人在C语言函数怎么返回多个值问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言函数怎么返回多个值”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-07-05
  • Golang函数的函数参数和返回值的保密性处理方法
    随着Golang编程语言的不断发展,越来越多的开发者开始使用它来构建安全可靠的应用程序。而在开发Golang应用程序时,处理函数参数和返回值的保密性是一个极其重要的问题。本文将介绍Golang函数参数和返回值的保密性处理方法,以帮助开发者更...
    99+
    2023-05-16
    Golang 函数参数 返回值保密性
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作