IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Vue2响应式原理 -> 正文阅读

[JavaScript知识库]Vue2响应式原理

Vue2实现响应式核心就是Object.defineProperty数据劫持,针对数组重写了数组方法
在Vue2源码中实现响应式考虑到更多情况,以下所写了V2实现响应式的核心逻辑

const data = {
  name: 'wft',
  age: 18,
  info: {
    test: '哈哈哈'
  },
  list: [1, 2, 3, 4, 5]
}

const oldArrProto = Array.prototype;
const newArrProto = Object.create(oldArrProto);
['push', 'pop', 'shift', 'unshift', 'splice'].forEach(methodName => {
  newArrProto[methodName] = function () {  // 1. 更新视图; 2. 执行原来的方法
    oldArrProto[methodName].call(this, ...arguments)
    console.log('更新视图操作----->>>')
  }
})

observer(data)

function observer(target) {
  if (typeof target !== 'object' || target === null) {
    return target
  }

  if (target.constructor === Array) {  //  如果是数组的话, 就把原型对象修改成重写之后的(主要是为了能够进行更新视图操作)
    target.__proto__ = newArrProto
  }

  for (let key in target) {
    defineReactive(target, key, target[key])
  }
}

function defineReactive(target, key, value) {
  if (typeof value === 'object') {  // 多层嵌套递归
    observer(value)
  }
  Object.defineProperty(target, key, {
    get() {
      return value
    },
    set(newValue) {
      if (typeof newValue === 'object') {
        observer(newValue)
      }
      if (newValue !== value) {
        value = newValue
        console.log('更新视图操作----->>>')
      }
    }
  })
}

// data.name = '哈哈哈'
// data.info.test = '1111'
// data.name = {
//   name1: 'name1',
//   name2: 'name2'
// }

// data.name.name1 = '修改name1'
data.list.push(555)

上面有用到Object.create()?,这个方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__,是为了重写数组上的方法

当我们在data中定义了数据之后,vue2就会自动把它加入到响应式系统中(有对象就深层递归),而且Object.defineProperty能力有限,不能察觉到对象的属性新增(v2中我们使用Vue.set解决),也不能察觉到对象的属性删除(v2中我们使用Vue.delete解决),这些也都是Vue2中的缺点,性能损耗较大

但是Vue3中就很好的避免上述Vue2中的问题,v3是通过proxy代理来实现数据的响应式,并且是当我们真正用到的时候才会将其加入到响应式,并且支持属性的新增和删除

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:09:15  更:2022-05-05 11:10:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:21:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码