Vue响应式原理基本理解实现[通俗易懂]

Vue响应式原理基本理解实现[通俗易懂]Vue响应式原理基本实现:注意:不要认为数据发生改变,界面跟着更新,是理所当然的.我们需要弄懂两个问题:1.修改Vue实例数据,vue内部是如何监听数据的改变?2.当数据发生改变,Vue是如何知道要通知那些界面发生刷新?问题一解决:根据Object.defineProperty来监听对象属性的改变Object.defineProperty基本使用#1.先创建一…

大家好,又见面了,我是你们的朋友全栈君。

注意: 不要认为数据发生改变,界面跟着更新, 是理所当然的.

我们需要弄懂两个问题:

1. 修改Vue实例数据,vue内部是如何监听数据的改变
2. 当数据发生改变,Vue是如何知道要通知那些界面发生刷新

问题一解决:

根据 Object.defineProperty来监听对象属性的改变

Object.defineProperty 基本使用

# 1.先创建一个Obj属性
# 相当于给 new Vue() 中的data设置属性
const obj = { 
   
	name: 'Vistuous',
	message: 'Hello Vue.Js'
}

# 2.循环Obje
Object.keys[obj].forEach(key => { 
   
	let value = obj[key]
	# 监听值的改变
	Object.defineProperty(obj, key, { 
   
		set(newValue) { 
   
			console.log(key + '发生了变化' )
			value = newValue
			# 通知订阅者 -> 看第二个解决
			dep.notify()
		},
		# 谁使用了, 就会进入 get
		get() { 
   
			console.log(key + '对应的值: ' + value)
			return value
		}
	})
})

结果:
结果
我们会发现修改name值或者使用name值的时候, Object.defineProperty 会监听到, 那么第一个问题 修改Vue实例数据,vue内部是如何监听数据的改变? 已经解决了。
那么问题来了,Vue是如何知道要通知那些界面发生刷新? 也就是说:Vue是如何知道谁在使用?如何告诉它需要更新? 回到第二个问题。

第二个问题解决

使用发布者订阅者模式 来完成通知发生刷新

## 创建订阅者
class Watcher { 
   
  constructor(name) { 
   
    this.name = name
  }
  update() { 
   
    console.log(this.name + '发生了update')
  }
}

# 创建发布者
class Dep { 
   
	# 储存订阅者
	constructor() { 
   
		this.subs[] 
	}
	# 添加订阅者信息
	addSubs(watcher) { 
   
		this.subs.push(watcher)
	},
	# 循环所有订阅者, 通知他们需要更新
	notify() { 
   
	   	this.subs.forEach(item => { 
   
	    	item.update()
	    })
	}
}

# 使用
# 创建发布者
const dep = new Dep()
# 创建订阅者
const watcher1 = new Watcher('index')
const watcher2 = new Watcher('profile')
# 将订阅者传给发布者
dep.addSubs(watcher1)
dep.addSubs(watcher2)
// 通知订阅者
dep.notify()

合并使用结果打印:
在这里插入图片描述
会发现每当修改一个数据的时候,发布者模式会通知所有订阅者来进行更新。
Vue响应式图解
在这里插入图片描述
图片素材来源coderwhy老师 coderwhy老师简书

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137899.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • php 下载文件的头信息 Determine Content Type

    php 下载文件的头信息 Determine Content Type

    2021年10月14日
    50
  • 【踩坑向】虚拟机桥接模式连不上网怎么办?

    【踩坑向】虚拟机桥接模式连不上网怎么办?关于虚拟机创建和网络连接的一些细节。

    2022年6月1日
    58
  • java语言_java好学吗?java是不是最难学的语言?

    java语言_java好学吗?java是不是最难学的语言?java好学吗?java是不是最难学的语言?对于一些刚接触java的朋友来说,可能会有这样的疑问,下面就来一起了解下吧。1、java好学吗?  从某些方面来说,java比较容易学,如果是大学毕业,大学计算机专业里大多开设了java基础课程,或者学过一点编程,学起java来也会轻松不少。即使是零基础也不用担心,java可以零基础授课,入门比较简单,难的是学深入,这不是一件容易的事。学习java…

    2022年7月7日
    23
  • RAII_ras raf

    RAII_ras rafhttp://baike.baidu.com/link?url=DUGlzCMqyZ2aInTkdpGWqW0f53fL-LWLu9nD3rGoJClIUb8rssh8oCALOhad7MDAWkqEhdfUzPU72jvQeDx5KK目录1RAII简介2RAII的分类3RAII实际应用4RAII与STL容器1RAII简介RAII[1]

    2022年10月23日
    0
  • 西门子scl语言运算符_西门子烤箱怎么设置语言中文

    西门子scl语言运算符_西门子烤箱怎么设置语言中文软硬件平台软件是博图TIAv15,硬件是西门子300系列PLC简介使用scl语言编写一个FC子程序,对模拟量进行处理,对模拟数据进行转换。详细介绍添加新块,添加一个FC块,语言选择scl添加变量,输入型变量5个,一个运算后输出变量,3个中间变量,用于计算,存放中间计算结果,IF#in<=#i_minTHEN//判断输入值是否低于模拟量设定下限值#out:=#r_min;//输出直接为浮点数设定值下限END_IF;IF#in&gt

    2022年9月28日
    0
  • python保留小数位的两种方法总结[通俗易懂]

    python保留小数位的两种方法总结[通俗易懂]题目背景:方法一:format函数format有不同用法,代码如下,前者使用了占位符{},使用占位符可以同时输出多个,后者一次只能输出一个importmathres=math.sqrt(a**2+b**2)#使用占位符print(‘{:.3f}’.format(res))#可以同时输出多个print(‘{:.3f}\n{:.2f}’.format(res,res))#不使用占位符只能输出一个print(format(res,’.3f’))运行结果:方法二:’%

    2022年8月12日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号