04-new Vue做了啥

这里打算介绍一下new Vue时,Vue做了啥,其实就是说一下_init方法的调用。

Vue方法里面只有一行代码this._init(options);

这个_init到底做了什么?让我们看看吧(core/instance/init.js)。

  • 每个实例给一个全局的_uid
  • _isVue赋值true
  • 顶重要的一步计算当前实例的$options,后续的所以操作基本都是根据它去做的
  • _renderProxy赋值
  • _self赋值
  • initLifecycle
  • initEvents
  • initRender
  • 触发beforeCreate事件
  • initInjections
  • initState
  • initProvide
  • 触发created
  • 根据情况看是否需要挂载,这个不在这篇文章里说了,内容太多了

计算实例的$options

使用了mergeOptions这个函数,具体详情可以参考这篇文章

initLifecycle

core/instance/lifecycle.js
这个函数基本没有什么实质性的东西,就是给当前实例初始化一些属性

  • $parent 父组件实例,必须是非abstract的
  • $root 跟组件实例
  • $children 子组件实例数组
  • $refs 那个啥哈
  • _watch 当前组件实例的渲染watcher
  • _inactive keep-alive用到的吧
  • _directInactive keep-alive用到的吧
  • _isMounted 是否已挂在
  • _isDestroyed 是否已销毁
  • _isBeingDestroyed 是否正在销毁

我一直对它的名字initLifecycle表示理解不了,生命周期给我的暗示就是一个实例的生命周期,应该是beforeCreate created等事件呀

initEvents

instance/core/events.js

这个函数也不复杂,_events私有字段的创建,同时还调用了updateComponentListeners,这个我还不知道干啥的

initRender

instance/core/render.js

看名字就知道跟渲染有关的咯。

  • 计算了$slots这个属性
  • 给当前实例添加了$createElement方法,用来创建虚拟dom的
  • a t t r s 和 attrs和 attrslisteners响应式功能的添加,defineReactive这个函数我还不了解详情,以后再回来完善吧

initInjections

计算注入

initState

初始化状态,这个状态包括的东西好多呀

  • o p t i o n s 中 的 p r o p s 属 性 落 地 到 当 前 实 例 的 p r o p s 上 , 响 应 式 的 方 式 。 我 们 要 知 道 options中的props属性落地到当前实例的_props上,响应式的方式。我们要知道 optionspropspropsprops这个属性是一个getter,它其实是返回的_props
  • 把$options中的methods属性里的所有函数都落地到实例上,这个过程中做了bind,上下文锁到了当前实例上
  • 调用data方法获取_data,然后开启响应式
  • computed 给每个$options.computed里的计算属性创建一个Watcher实例,并且调用defineComputed,这个函数本文下面介绍吧
    我觉得我需要把响应式的实现单拉出来一篇文章
  • watch

initProvide

计算_provide属性

defineComputed详细介绍

本文还会继续完善的:)

有用请点赞,嘻嘻:)

你可能感兴趣的:(Vue源码)