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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • FFmpeg从入门到精通笔记之二

    FFmpeg从入门到精通笔记之二FFmpeg中常用的工具主要是ffmpeg、ffprobe、ffplay,它们分别用作多媒体的编解码工具、内容分析工具和播放器。ffmpeg常用命令ffmpeg的封装转换。ffmpeg的封装转换(转封装)功能包含在AVFormat模块中,通过libavformat库进行Mux和Demux操作.  *多媒体文件的格式有很多种,这些格式中的很多参数在Mux与Demux的操作参数中是公用的,…

    2022年6月26日
  • 同源和跨域详解_如何实现跨域

    同源和跨域详解_如何实现跨域同源同源策略的基本概念1995年,同源政策由Netscape公司引入浏览器。目前,所有浏览器都实行这个政策。同源策略:最初,它的含义是指,A网页设置的Cookie,B网页不能打开,除非这两个

    2022年8月2日
  • 十、模板方法模式—制作更多好喝的饮品! #和设计模式一起旅行#

    无规矩不成方圆!故事背景在安装了酷炫了碉堡了的灯之后,我饿设计模式MM经营的奶茶店生意更加火爆,有不同国家的顾客,那么为了满足更多消费者的口味,我们推出了中国龙井苹果茶和叶门摩卡牛奶咖啡。其中制作的过程:把水烧开将咖啡/茶叶放到杯子里用沸水冲泡加入牛奶/苹果汁下面用代码来表示茶和咖啡的制作过程!//龙井苹果茶制作public class LongJi…

    2022年2月27日
  • 解决keil注册机和编译错误的问题2020-12-28

    解决keil注册机和编译错误的问题2020-12-28https://72k.us/file804/10165491-428107594这个地址的注册机验证可以有效到2032年。当以前的代码可以编译通过,但是新安装的keil确有大量的编译错误的时候。这个时候可能的原因是配置上没有设置C99Mode。勾选C99Mode是解决这个问题的手段之一。…

    2022年5月2日
  • 运行jar包的命令_命令行打jar包

    运行jar包的命令_命令行打jar包使用cmd运行jar包使用命令行运行iar包使用windows运行jar包怎么在命令行工具中运行jar包呢?找到jar包的位置选中文件所在位置导航栏并输入cmd此时进入命令行工具输入Java-jarHelloWord.jar(注意空格)输入完Java-jar之后可以按tab键找到jar包名字enter…

    2022年10月4日
  • [MFC美化] MFC界面UI库总结

    [MFC美化] MFC界面UI库总结稍微说下自己用过的感受:1.SkinMagic动态库DLL使用,(有VC6版本的静态链接库,没能成功调用)。对控件:菜单和下拉框(下拉滚动条)有问题。不能自由设置颜色背景皮肤格式:.smf,可使

    2022年7月1日

发表回复

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

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