vue源码解析之initMixin

Posted qq_27449993

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue源码解析之initMixin相关的知识,希望对你有一定的参考价值。

// src/core/vdom/vnode.js
export default class VNode 
  tag: string | void;
  data: VNodeData | void;
  children: ?Array<VNode>;
  text: string | void;
  elm: Node | void;
  ns: string | void;
  context: Component | void; // rendered in this component's scope
  key: string | number | void;
  componentOptions: VNodeComponentOptions | void;
  componentInstance: Component | void; // component instance
  parent: VNode | void; // component placeholder node

  // strictly internal
  raw: boolean; // contains raw html? (server only)
  isStatic: boolean; // hoisted static node
  isRootInsert: boolean; // necessary for enter transition check
  isComment: boolean; // empty comment placeholder?
  isCloned: boolean; // is a cloned node?
  isOnce: boolean; // is a v-once node?
  asyncFactory: Function | void; // async component factory function
  asyncMeta: Object | void;
  isAsyncPlaceholder: boolean;
  ssrContext: Object | void;
  fnContext: Component | void; // real context vm for functional nodes
  fnOptions: ?ComponentOptions; // for SSR caching
  fnScopeId: ?string; // functioanl scope id support

  constructor (
    tag?: string,
    data?: VNodeData,
    children?: ?Array<VNode>,
    text?: string,
    elm?: Node,
    context?: Component,
    componentOptions?: VNodeComponentOptions,
    asyncFactory?: Function
  ) 
    this.tag = tag // 当前节点标签名
    this.data = data // 当前节点数据(VNodeData类型)
    this.children = children // 当前节点子节点
    this.text = text // 当前节点文本
    this.elm = elm // 当前节点对应的真实DOM节点
    this.ns = undefined // 当前节点命名空间
    this.context = context // 当前节点上下文
    this.fnContext = undefined // 函数化组件上下文
    this.fnOptions = undefined // 函数化组件配置项
    this.fnScopeId = undefined // 函数化组件ScopeId
    this.key = data && data.key // 子节点key属性
    this.componentOptions = componentOptions // 组件配置项 
    this.componentInstance = undefined // 组件实例
    this.parent = undefined // 当前节点父节点
    this.raw = false // 是否为原生HTML或只是普通文本
    this.isStatic = false // 静态节点标志 keep-alive
    this.isRootInsert = true // 是否作为根节点插入
    this.isComment = false // 是否为注释节点
    this.isCloned = false // 是否为克隆节点
    this.isOnce = false // 是否为v-once节点
    this.asyncFactory = asyncFactory // 异步工厂方法 
    this.asyncMeta = undefined // 异步Meta
    this.isAsyncPlaceholder = false // 是否为异步占位
  

  // 容器实例向后兼容的别名
  get child (): Component | void 
    return this.componentInstance
  

在看VNode的时候小结以下几点:
* 所有对象的 context 选项都指向了 Vue 实例。
* elm 属性则指向了其相对应的真实 DOM 节点。
* DOM 中的文本内容被当做了一个只有 text 没有 tag 的节点。
* 像 class、id 等HTML属性都放在了 data 中

initLifecycle(vm);// 初始化组件数据,

      initEvents(vm);// vm._events表示的是父组件绑定在当前组件上的事件

      initRender(vm);//

      callHook(vm, 'beforeCreate');

      initInjections(vm); // resolve injections before data/props//初始化依赖

      initState(vm);//initState里面主要是对vue实例中的 props, methods, data, computed 和 watch 数据进行初始化。

      initProvide(vm); // resolve provide after data/props//将注入绑定再$options initProvide方法则是初始化provide的值,并赋值给_provided属性

      callHook(vm, 'created');

在初始化props的时候(initProps),会遍历props中的每个属性,然后进行类型验证,数据监测等(提供为props属性赋值就抛出警告的钩子函数)。

在初始化methods的时候(initMethods),主要是监测methods中的方法名是否合法。

在初始化data的时候(initData),会运行 observe 函数深度遍历数据中的每一个属性,进行数据劫持。

在初始化computed的时候(initComputed),会监测数据是否已经存在data或props上,如果存在则抛出警告,否则调用defineComputed函数,监听数据,为组件中的属性绑定getter及setter。如果computed中属性的值是一个函数,则默认为属性的getter函数。此外属性的值还可以是一个对象,他只有三个有效字段set、get和cache,分别表示属性的setter、getter和是否启用缓存,其中get是必须的,cache默认为true。
 

以上是关于vue源码解析之initMixin的主要内容,如果未能解决你的问题,请参考以下文章

Vue源码解析八

Vue源码翻译之渲染逻辑链

vue源码第一章~

vue-loader 源码解析系列之 整体分析

vue源码为什么vue是一个方法而不是一个calss类

Vue3源码解析之createApp方法