Vue2.0源码思维导图-------------Vue 初始化

本文详细解读Vue构造函数中的_init方法,涉及实例唯一标识、状态设置、选项合并、生命周期钩子和组件渲染等核心环节。通过源码分析,揭示Vue实例初始化的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一节看完《Vue源码思维导图-------------Vue 构造函数、原型、静态属性和方法》,这节将会以new Vue()为入口,大体看下 this._init()要做的事情。

function Vue (options) {
  if (process.env.NODE_ENV !== 'production' &&
    !(this instanceof Vue)
  ) {
    warn('Vue is a constructor and should be called with the `new` keyword')
  }
  this._init(options)
}

initMixin(Vue)
stateMixin(Vue)
eventsMixin(Vue)
lifecycleMixin(Vue)
renderMixin(Vue)

export default Vue

下边解开_init的面纱

export function initMixin (Vue: Class<Component>) {
  Vue.prototype._init = function (options?: Object) {
    const vm: Component = this
    // a uid
    vm._uid = uid++

    let startTag, endTag
    /* istanbul ignore if */
    if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
      startTag = `vue-perf-start:${vm._uid}`
      endTag = `vue-perf-end:${vm._uid}`
      mark(startTag)
    }

    // a flag to avoid this being observed
    vm._isVue = true
    // merge options
    if (options && options._isComponent) {
      // optimize internal component instantiation
      // since dynamic options merging is pretty slow, and none of the
      // internal component options needs special treatment.
      initInternalComponent(vm, options)
    } else {
      vm.$options = mergeOptions(
        resolveConstructorOptions(vm.constructor),
        options || {},
        vm
      )
    }
    /* istanbul ignore else */
    if (process.env.NODE_ENV !== 'production') {
      initProxy(vm)
    } else {
      vm._renderProxy = vm
    }
    // expose real self
    vm._self = vm
    initLifecycle(vm)
    initEvents(vm)
    initRender(vm)
    callHook(vm, 'beforeCreate')
    initInjections(vm) // resolve injections before data/props
    initState(vm)
    initProvide(vm) // resolve provide after data/props
    callHook(vm, 'created')

    /* istanbul ignore if */
    if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
      vm._name = formatComponentName(vm, false)
      mark(endTag)
      measure(`vue ${vm._name} init`, startTag, endTag)
    }

    if (vm.$options.el) {
      vm.$mount(vm.$options.el)
    }
  }
}

总结思维导图如下:
在这里插入图片描述

// Vue.prototype._init
vm._uid = uid++     // 每个Vue实例都拥有一个唯一的 id
vm._isVue = true    // 这个表示用于避免Vue实例对象被观测(observed)
vm.$options         // 当前 Vue 实例的初始化选项,注意:这是经过 mergeOptions() 后的
vm._renderProxy = vm    // 渲染函数作用域代理
vm._self = vm       // 实例本身

// initLifecycle(vm)    src/core/instance/lifecycle.js **************************************************
vm.$parent = parent
vm.$root = parent ? parent.$root : vm

vm.$children = []
vm.$refs = {}

vm._watcher = null
vm._inactive = null
vm._directInactive = false
vm._isMounted = false
vm._isDestroyed = false
vm._isBeingDestroyed = false

// initEvents(vm)   src/core/instance/events.js **************************************************
vm._events = Object.create(null)
vm._hasHookEvent = false

// initRender(vm)   src/core/instance/render.js **************************************************
vm._vnode = null // the root of the child tree
vm._staticTrees = null // v-once cached trees

vm.$vnode
vm.$slots
vm.$scopedSlots

vm._c
vm.$createElement

vm.$attrs
vm.$listeners

// initState(vm)   src/core/instance/state.js **************************************************
vm._watchers = []
vm._data

代码参考:
https://github.com/vuejs/vue/tree/dev/src/core/instance

### 如何引入并使用 `simple-mind-map` 的 API 文档与使用方法 #### 1. 安装依赖 在项目中使用 `simple-mind-map`,需要先通过 npm 或 yarn 安装该库。运行以下命令以完成安装: ```bash npm install simple-mind-map ``` #### 2. 引入库并初始化 以下是引入 `simple-mind-map` 并创建一个基本实例的代码示例[^1]: ```javascript import MindMap from "simple-mind-map"; const mindMap = new MindMap({ el: document.getElementById('mindMapContainer'), // 指定容器元素 data: { // 初始数据结构 "data": { "text": "根节点" }, "children": [] } }); ``` 上述代码中,`el` 参数指定了思维导图渲染的目标 DOM 元素,而 `data` 参数定义了思维导图的初始结构。 #### 3. 添加节点 可以通过 `addNode` 方法动态添加子节点。以下是一个示例[^3]: ```javascript mindMap.addNode({ text: 'Root Node', // 节点文本 children: [ // 子节点数组 { text: 'Child Node 1' }, { text: 'Child Node 2' } ] }); ``` #### 4. 常用 API 方法 `simple-mind-map` 提供了一些常用的方法来操作思维导图,例如: - **`addNode(data)`**: 动态添加节点。 - **`updateNode(id, newData)`**: 更新指定节点的数据。 - **`deleteNode(id)`**: 删除指定节点。 - **`exportData()`**: 导出当前思维导图的数据结构。 - **`importData(data)`**: 导入新的数据结构以更新思维导图。 这些方法的具体使用方式可以参考官方文档或源码注释[^2]。 #### 5. Vue3 集成示例 如果需要在 Vue3 项目中集成 `simple-mind-map`,可以按照以下步骤进行[^4]: ```vue <template> <div id="mindMapContainer"></div> </template> <script> import MindMap from "simple-mind-map"; export default { mounted() { const mindMap = new MindMap({ el: document.getElementById("mindMapContainer"), data: { data: { text: "根节点", }, children: [], }, }); mindMap.addNode({ text: "子节点", children: [{ text: "孙子节点" }], }); }, }; </script> <style> #mindMapContainer { width: 100%; height: 600px; } </style> ``` #### 6. 注意事项 - 确保目标容器(如 `#mindMapContainer`)具有明确的宽高,否则思维导图可能无法正确渲染[^3]。 - 如果某些参数未生效,请检查是否正确配置了版本兼容性或是否存在拼写错误[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值