Vue 生命周期

2018-08-14  本文已影响0人  hankchang

MVVM 的三大要素

响应式: vue 如何监听到 data 的每个属性变化?

什么是响应式

<div id="app">
  <p>{{name}}</p>
  <p>{{age}}</p>
</div>
var vm = new Vue({
  el: "#app",
  data: {
    name: "hank",
    age: "18"
  }
});
思考

Object.defineProperty

var obj = {};

(function(obj) {
  // 定义一个内部变量 , 外部无法访问
  var _name = "hank";

  // 使用 defindProperty 定义属性
  Object.defineProperty(obj, "name", {
    // 当 obj.name 获取的时候调取 get 方法
    get: function() {
      console.log("get", _name); // 监听
      return _name;
    },
    // 当 obj.name 设置的时候调取 set 方法
    set: function(newVal) {
      console.log("set", newVal); // 监听
      _name = newVal;
    }
  });
}(obj)

console.log(obj.name)
// console 先打印 => gethank
// console 然后打印 obj.name 的值 => hank

obj.name = 'chang'
// console 先打印 => setchang
// 然后 obj.name 的值才被更改为 chang

模拟

var vm = {};
var data = {
  name: "hank",
  age: 18
};

// 把遍历要用到的变量先声明, 让代码更直观.
var key;
for (key in data) {
  // 闭包的使用, 绑定 key 的值,
  (function(key) {
    Object.defineProperty(vm, key, {
      get: function() {
        console.log("get", data[key]); // 监听
        return data[key];
      },
      // 监听 在这里可以做操作 比如修改DOM的内容, 实现vue的效果
      set: function(newVal) {
        console.log("set", newVal);
        data[key] = newVal;
      }
    });
  })(key);
}

模板引擎: vue 的模板如何被解析, 指令如何处理

渲染: vue 的模板被渲染成 html, 以及渲染过程

vue 的整个实现流程

  1. 解析模板成 render 函数
  2. 响应式开始监听
  3. 首次渲染, 显示页面, 且绑定依赖
  4. data 属性变化, 触发 rerender

解析模板成 render 函数

响应式开始监听

首次渲染, 显示页面, 且绑定依赖

为什么监听 get

上一篇 下一篇

猜你喜欢

热点阅读