Vue 辅助函数的作用

99d5c8c333bf7795e303a6bd9deaae31.png

什么?编译后的代码你竟然看不懂,不知道_v,_s是什么?本篇文章让我们逐个解释这些辅助函数的作用!

[_vm._v(\\\" \\\" + _vm._s(_vm.obj.a) + \\\" \\\" + _vm._s(_vm.obj.a) + \\\" \\\")]

vue-template-compiler是编译vue模板的包,传入模板返回AST抽象语法树。

const compiler = require('vue-template-compiler')


const val = compiler.compile('<span class="active" :total="count">666</span>')

输出结果如下:

const res = {
  ast: {
    type: 1,
    tag: 'span',
    attrsList: [ { name: 'total', value: 'count' } ],
    attrsMap: { class: 'active', ':total': 'count' },
    rawAttrsMap: {},
    parent: undefined,
    children: [ { type: 3, text: 666, static: true } ],
    plain: false,
    staticClass: '"active"',
    hasBindings: true,
    attrs: [ { name: 'total', value: 'count', dynamic: false } ],
    static: false,
    staticRoot: false
  },
  render: `with(this){return _c('span',{staticClass:"active",attrs:{"total":count}},[_v("666")])}`,
  staticRenderFns: [],
  errors: [],
  tips: []
}

可以看到对象中有 AST 属性和 render 函数,其实 AST 是为了生成 render 函数用的,编译的最后一步就是把优化后的 AST 树转换成可执行的代码。

with (this) {
  return _c(
    'span',
    { staticClass: "active", attrs: { "total": count } },
    [_v("666")]
  )
}

Vue中 _c 函数定义在 src/core/instance/render.js 中。

vm._c = (a, b, c, d) => createElement(vm, a, b, c, d, false)

顾名思义,_c 就是执行 createElement 去创建 VNode。

而 _l_v 等定义在 src/core/instance/render-helpers/index.js 中:

export function installRenderHelpers (target: any) {
  target._o = markOnce
  target._n = toNumber
  target._s = toString
  target._l = renderList
  target._t = renderSlot
  target._q = looseEqual
  target._i = looseIndexOf
  target._m = renderStatic
  target._f = resolveFilter
  target._k = checkKeyCodes
  target._b = bindObjectProps
  target._v = createTextVNode
  target._e = createEmptyVNode
  target._u = resolveScopedSlots
  target._g = bindObjectListeners
}

在 Vue.js 源码中的一个函数 installRenderHelpers,用于向目标对象(target)添加一系列渲染辅助函数。这些辅助函数在 Vue.js 的渲染过程中起着重要的作用,用于处理模板中的各种指令、表达式和特定的渲染逻辑。

让我们逐个解释这些辅助函数的作用:

1.target._o = markOncemarkOnce 用于标记一个节点只渲染一次,防止重复渲染。2.target._n = toNumbertoNumber 用于将一个值转换为数字类型。3.target._s = toStringtoString 用于将一个值转换为字符串类型。4.target._l = renderListrenderList 用于渲染一个数组或对象的列表。5.target._t = renderSlotrenderSlot 用于渲染插槽内容。6.target._q = looseEquallooseEqual 用于宽松相等比较两个值。7.target._i = looseIndexOflooseIndexOf 用于宽松相等比较并返回值在数组中的索引。8.target._m = renderStaticrenderStatic 用于渲染静态内容。9.target._f = resolveFilterresolveFilter 用于解析过滤器。10.target._k = checkKeyCodescheckKeyCodes 用于检查按键码。11.target._b = bindObjectPropsbindObjectProps 用于绑定对象属性。12.target._v = createTextVNodecreateTextVNode 用于创建文本节点。13.target._e = createEmptyVNodecreateEmptyVNode 用于创建空节点。14.target._u = resolveScopedSlotsresolveScopedSlots 用于解析作用域插槽。15.target._g = bindObjectListenersbindObjectListeners 用于绑定对象监听器。

这些辅助函数在 Vue.js 的渲染过程中发挥着重要作用,帮助处理模板中的各种渲染需求和逻辑。通过这些函数,Vue.js 能够实现模板的动态渲染、数据绑定、插槽处理和其他视图相关的功能。这些函数的存在使得 Vue.js 具有强大的渲染能力和灵活性,让开发者能够更轻松地构建交互丰富的前端应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值