写点什么

vue 响应式原理简述

作者:达摩
  • 2022 年 5 月 24 日
  • 本文字数:874 字

    阅读完需:约 3 分钟

vue响应式原理简述

什么是数据驱动

  • 数据响应式、双向绑定、数据驱动

  • 数据响应式

数据模型仅仅是普通的 JavaScript 对象,而当我们修改数据时,视图会进行更新,避免了繁琐的 DOM 操作,提高开发效率

  • 双向绑定

数据改变时,视图改变;视图改变,数据也随之变化

我们可以使用 v-model 在表单上闯将双向数据绑定

  • 数据驱动时 vue 最独特的特性之一

开发过程中,只需要关注数据本身,不需要关心数据如何渲染收到视图;

数据响应的核心原理

Vue2.x

Object.defineProperty es5 新增方法,无法兼容 ie8 一下版本

极简模拟:

 // 模拟 Vue 中的 data 选项    let data = {      msg: 'damo'    }
// 模拟 Vue 的实例 let vm = {}
// 数据劫持,当访问或者设置 vm 中的成员的时候,做一些干预操作 Object.defineProperty(vm, 'msg', { // 可枚举(可遍历) enumerable: true, // 可配置(可以通过delete 删除,可以通过defineProperty 重新定义) configurable: true, // 当获取值的时候执行 get() { return data.msg }, // 当设置值的时候执行 set(newValue) { if (newValue === data.msg) { return } data.msg = newValue // 数据更改,更新 DOM 的值 // ...... } })
data.msg = 'damo-1'
复制代码

注:如果有一个对象多个属性需要转换 getter/setter,就需要循环处理;

Vue3.x

Proxy: 直接监听对象,而非属性;ES6 新增,IE 不支持,性能由浏览器优化;

极简模拟

// 模拟 Vue 中的 data 选项    let data = {      msg: 'damo',      sum: 2    }
// 模拟 Vue 的实例 let vm = new Proxy(data, { // 执行代理行为的函数 // 当访问 vm 的成员执行 get(target, key) { return target[key] }, // 当设置 vm 的成员会执行 set(target, key, newValue) { if (target[key] === newValue) return target[key] = newValue // 数据更改,更新 DOM 的值 // ...... } })
vm.msg = 'damo-1'
复制代码


发布于: 刚刚阅读数: 3
用户头像

达摩

关注

还未添加个人签名 2019.12.04 加入

还未添加个人简介

评论

发布
暂无评论
vue响应式原理简述_Vue_达摩_InfoQ写作社区