iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >VUE响应式原理的实现详解
  • 707
分享到

VUE响应式原理的实现详解

2024-04-02 19:04:59 707人浏览 独家记忆
摘要

目录总结前言 相信Vue学习者都会发现,vue使用起来上手非常方便,例如双向绑定机制,让我们实现视图、数据层的快速同步,但双向绑定机制实现的核心数据响应的原理是怎么样的呢,接下来让我

前言

相信Vue学习者都会发现,vue使用起来上手非常方便,例如双向绑定机制,让我们实现视图、数据层的快速同步,但双向绑定机制实现的核心数据响应的原理是怎么样的呢,接下来让我们开始介绍:

function observer(value) {

	//给所有传入进来的data 设置一个__ob__对象 一旦value有__ob__ 说明该value已经做了响应式处理
	Object.defineProperty(value, '__ob__', {
		value: this, //当前实例 也就是new observer
		enumerable: false, //不可枚举  即不可for in
		writable: true, // 可用赋值运算符改写__ob__
		configurable: true //可改写可删除
	})

	//这里是判断是对象 数组的话需要改造数组原型上的方法
	if (Object.prototype.toString.call(value) === "[object Array]") {
		//数组的话需要改造数组原型上的方法 下面会讲解arrayMethods
		value.__proto__ = arrayMethods;
		//对数组进行响应式处理
		observeArray(value);
	} else {
		//如果是对象 遍历对象属性进行响应式处理
		iterate(value)
	}


}

// 遍历对象属性进行响应式处理
function iterate(data) {
	const keys = Object.keys(data);
	keys.forEach((key) => {
		defineReactive(data, key, data[key])
	})
}

//响应式处理 这里是核心
function defineReactive(data, key, value){
	//递归对象 这里是因为对象里面仍可能嵌套对象
	observe(value)

	//写道这里 Object.defineProperty 我们主角出场了
 	// 这里实现了读写都能捕捉到,响应式的底层原理
	Object.defineProperty(data, key, {
		get() { 
			console.log('我被成功访问啦!');
			return value
		},
		set(newValue) { 
			if (newValue === value) return
			console.log("我被变更啦")
			value = newValue
		}
	})
}

function  observeArray(data) { 
	data.forEach(item => { 
		observe(item)
	})
}

function observe(value) {
    // 如果传进来的是对象或者数组,则进行响应式处理
    if (Object.prototype.toString.call(value) === '[object Object]' || Object.prototype.toString.call(value) === "[object Array]") {
        return new Observer(value)
    }
}

上面代码简单的实现了vue2.0中响应式的原理,相信注释也非常的清晰,总结一下三个主要的方法:

名称作用
observer观察者对象,对数组、对象进行响应式处理
defineReactive拦截对象中的key中的set、get方法
observe响应式处理的入口

从上面的大致实现方法中,我们不难看出几个问题:

1.使用defineProperty,我们无法实现对象删除的监听、以及新增对象属性的时候,set方法没有被调用,下图是实验结果

3.

在这里插入图片描述

2.数组修改只能通过改写的方法,无法通过arr[index] = xxx 进行修改,也无法通过length属性进行修改,下图是输出结果:

在这里插入图片描述

解决方案

针对上面的问题,vue提出了自己的解决方案:

$set(obj, key, value),原理相信大家不难猜出,通过hack的方式,对象的处理方法是重新为对象赋值,而数组是通过splice来转换为响应式

function set (target, key, val) {
  //isValidArrayIndex 用来检测是否合法索引
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    target.length = Math.max(target.length, key);
    target.splice(key, 1, val);
    return val
  }
  if (key in target && !(key in Object.prototype)) {
    target[key] = val;
    return val
  }
  //... 
  defineReactive$$1(ob.value, key, val);
  ob.dep.notify();
  return val
}

数组的特殊处理

相信大家还发现,数组做了特殊处理,上面的代码也写到没有使用遍历使用defineProperty去监听数据,修改数组原型上的部分方法,来实现修改数组触发响应式,也就是上面代码的arrayMethods,我们接着来看这个的具体实现思路:

const arrayProto = Array.prototype
export const arrayMethods = Object.create(arrayProto)

const methodsToPatch = [
	'push',
	'pop',
	'shift',
	'unshift',
	'splice',
	'sort',
	'reverse'
]


methodsToPatch.forEach(method =>{
	// 缓存原来的方法
	def(arrayMethods, method)
})

function def(obj, key) {
	Object.defineProperties(obj, key, {
		enumerable: true,
		configurable: true,
		value: function (...args) {

			//获取数组原生方法
			let original = arrayProto[key];

			//改变this指向 
			const result = original.apply(this, args)

			console.log('我被更新了');
			
			//result就是上文的arrayMethods
			return result;
		}
	})
}

这里大概分为三个思路

1.获取数组原型上的方法

2.使用defineProperties对数组原型上的方法进行劫持

3.把需要被改造的 Array 原型方法指向改造后原型。

这样做的好处

没有直接修改 Array.prototype,而是直接把 arrayMenthods 赋值给 value 的 proto 。因为这样不会污染全局的Array, arrayMenthods 只对 data中的Array 生效。

题外话

关于数组为什么不使用defineProperties进行劫持,网上大部分说法都是觉得开销太大,因为在我们业务场景中一般的对象不会有太多属性,但列表中几千、上万条数据确是很正常,这一点也可以讲通。

总结

感谢你的阅读,在vue3.0中使用proxy进行数据劫持后,都说解决了2.0存在的问题以及提升了效率,后面我也会完善3.0响应式的实现原理。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!   

--结束END--

本文标题: VUE响应式原理的实现详解

本文链接: https://www.lsjlt.com/news/144160.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • VUE响应式原理的实现详解
    目录总结前言 相信vue学习者都会发现,vue使用起来上手非常方便,例如双向绑定机制,让我们实现视图、数据层的快速同步,但双向绑定机制实现的核心数据响应的原理是怎么样的呢,接下来让我...
    99+
    2022-11-13
  • 详解VUE响应式原理
    目录1、响应式原理基础2、核心对象:Dep与Watcher3、收集依赖与更新依赖3.1 收集依赖3.2 更新依赖4、源码调试4.1 测试的页面代码1、对象说明2、Dep与Watche...
    99+
    2022-11-12
  • 详解vue3 响应式的实现原理
    目录核心设计思想Vue.js 2.x 响应式Vue.js 3.x 响应式依赖收集:get 函数派发通知:set 函数总结源码参考核心设计思想 除了组件化,Vue.js 另一个核心设计...
    99+
    2022-11-13
  • Vue响应式系统的原理详解
    目录vue响应式系统的基本原理1.回顾一下Object.defineProperty的用法2.实战1:使用 Object.defineProperty 对 person的age属性 ...
    99+
    2022-11-12
  • Vue响应式原理的示例详解
    Vue 最独特的特性之一,是非侵入式的响应系统。数据模型仅仅是普通的 JavaScript 对象。而当你修改它们时,视图会进行更新。聊到 Vue 响应式实现原理,众多开发者都知道实现...
    99+
    2022-11-13
  • 一文详解Vue中响应式原理
    废话不多说,直接进入正题,响应式在日常开发中的应用是很常见的,这里举个简单的例子:let a=3 let b=a*10 console.log(b)//30 a=4 console.log(b)//40这时候我们想让b=4*10,这样显然是...
    99+
    2023-05-14
    前端 Vue.js 设计模式
  • 深入理解Vue响应式原理及其实现方式
    目录Vue的响应式Vue2的响应式原理Vue3的响应式原理深入理解响应式1.数据初始化2.对象的数据劫持Vue的响应式 用过Vue这个框架的人应该都知道,数据驱动是Vue框架的核心,...
    99+
    2023-05-19
    Vue响应式原理 Vue响应式原理实现
  • 详解vue数据响应式原理之数组
    目录src/core/observer/index.jssrc/core/observer/array.js arrayMethods总结src/core/observer/inde...
    99+
    2022-11-13
  • 详解Vue响应式的部分实现
    目录什么是响应式Vue2与Vue3响应式之间的区别使用Object.defineProperty监听对象使用Object.defineProperty监听对象使用ES6的Proxy实...
    99+
    2022-12-08
    Vue响应式实现 Vue响应式
  • Vue响应式原理与虚拟DOM实现步骤详细讲解
    目录一、什么是响应式系统二、实现原理三、虚拟DOM实现四、总结一、什么是响应式系统 在Vue中,我们可以使用data属性来定义组件的数据。这些数据可以在模板中使用,并且当这些数据发生...
    99+
    2023-05-13
    Vue响应式原理 Vue虚拟DOM
  • vue中v-model和响应式的实现原理解析
    目录v-model响应式实现v-model 首先要了解v-model就是vue帮我们封装的语法糖,真正实现靠的还是:v-bind:绑定响应式数据 触发 input 事件 并传递数据 ...
    99+
    2022-11-13
  • Vue响应式原理模拟实现原理探究
    目录前置知识数据驱动数据响应式的核心原理Vue 2.xVue 3.x发布订阅和观察者模式发布/订阅模式观察者模式Vue响应式原理模拟实现VueObserver对data中的属性进行监...
    99+
    2022-11-13
  • 详解Vue3的响应式原理解析
    目录Vue2响应式原理回顾Vue3响应式原理剖析嵌套对象响应式避免重复代理总结 Vue2响应式原理回顾 // 1.对象响应化:遍历每个key,定义getter、setter //...
    99+
    2022-11-12
  • Vue中响应式系统实现原理图文讲解
    目录框架组件结构源码解析在哪里绑定vue实例与watcher实例vue实例中的data响应式初始化对Object的变化监测框架 每个组件实例都会对应一个watcher实例,在组件渲...
    99+
    2023-03-20
    Vue响应式系统 Vue响应式原理
  • 一文详解Vue3响应式原理
    目录回顾 vue2.x 的响应式vue3的响应式回顾 vue2.x 的响应式 实现原理: 对象类型:通过object.defineProperty()对属性的读取、修改进行拦截(数据...
    99+
    2022-11-13
  • Vue 3中响应式的实现原理是什么
    本篇文章给大家分享的是有关Vue 3中响应式的实现原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 实现响应式响应基本类型变量首先...
    99+
    2022-10-19
  • 图解Vue 响应式流程及原理
    目录阅读本文能够帮助你什么?一、组件化流程1. 整个new Vue阶段做了什么?2. 普通dom元素如何渲染到页面?3. 组件如何渲染到页面?4. Vue组件化简化流程二、响应式流程...
    99+
    2022-11-13
  • 一文详解Vue2/Vue3的响应式原理
    this.$delete(this.student, 'name');// 删除student对象属性name this.$set(this.student, 'age', '21');// ...
    99+
    2023-05-14
    Vue.js
  • Vue3 Reactive响应式原理逻辑详解
    目录前言一、怎么实现变量变化二、怎么实现变量变化三、将多个dep存储在Map中四、将多个object的depsMap继续存储起来五、核心六、源码解析(TypeScript)前言 本篇...
    99+
    2022-11-13
  • Vue中响应式系统实现原理是什么
    本篇内容介绍了“Vue中响应式系统实现原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!框架每个组件实例都会对应一个watcher实例...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作