前言
Vue三要素:
- 响应式: 监听数据变化,实现方法为双向绑定
- 模板引擎:解析模板
- 渲染:将监听到的数据变化和解析后的HTML进行渲染
数据初始化
Vue的实例化过程,此处的构造函数传入的参数为一个对象,就是熟悉的options
new Vue({
el: "#app",
router,
store,
render: (h) => h(App),
});
接下来使用 initMixin()方法将 _init() 方法挂在 Vue原型 供实例调用
import {
initState } from "./state";
export function initMixin(Vue) {
Vue.prototype._init = function (options) {
const vm = this; //此处this为调用_init()方法的实例对象
// 而this.$options就是用户new Vue的时候传入的属性
vm.$options = options;
// 初始化状态
initState(vm);
};
}
此处初始化状态一个比较重要的点 比如在data里面可以直接使用prop的值 因为prop初始化的顺序早于data
初始化的顺序依次是 prop>methods>data>computed>watch
其次还有数据代理 代理将data代理到vue实例上
// src/state.js
import {
observe } from "./observer/index.js";
export function initState(vm) {
// 获取传入的数据对象
const opts = vm.$options;
if (opts.props) {
initProps(vm);
}
if (opts.methods) {
initMethod(vm);
}
if (opts.data) {
// 初始化data
initData(vm);
}
if (opts.computed) {
initComputed(vm);
}
if (opts.watch) {
initWatch(vm);
}
}
// 初始化data数据
function initData(vm) {
let data = vm.$options.data; // 实例的_data属性就是传入的data
// vue组件data推荐使用函数 防止数据在组件之间共享
data = vm._data = typeof data === "function" ? data.call(vm) : data || {
};
// 把data数据代理到vm 也就是Vue实例上面 我们可以使用this.a来访问this._data.a
for (let key in data) {
proxy(vm, `_data`