【Vue】理解Vue源码系列(五)

我们了解了Vue首次加载过程,之前的分析是建立在有template的基础上的,例如

var app = new Vue({
   
    template:"<div>hello</div>",
    el: '#app',
})

但更多情况我们是传入一个组件来完成Vue的初始化,例如

var demo = {
   
    name: 'demo',
    template: '<div>hello</div>',
}
var app = new Vue({
   
    template:"<div>hello</div>",
    el: '#app',
    render: h => h(demo)
})

接下来我们需要去了解组件的渲染过程。

实例化Vue函数,先执行_init函数,再执行$mount方法,在compiler阶段,因为我们传入了render函数,直接拿这个手写的render函数来使用。再接着是在mountComponent阶段执行_render私有方法,在这之前的过程和我们传入template差不多,在_render中有一段关键代码判断传入的tag是否为字符串,因此我们传入组件就到了另一个逻辑中。

if (typeof tag === 'string') {
   
    let Ctor
    ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag)
    if (config.isReservedTag(tag)) {
   
      // platform built-in elements
      if (process.env.NODE_ENV !== 'production' && isDef(data) && isDef(data.nativeOn)) {
   
        warn(
          `The .native modifier for v-on is only valid on components but it was used on <${
     tag}>.`,
          context
        )
      }
      vnode = new VNode(
        config.parsePlatformTagName(tag), data, children,
        undefined, undefined, context
      )
    } else if ((!data || !data.pre) && isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {
   
      // component
      vnode = createComponent(Ctor, data, context, children, tag)
    } else {
   
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值