前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue响应式原理基本理解实现[通俗易懂]

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

作者头像
全栈程序员站长
发布2022-08-23 12:13:45
3640
发布2022-08-23 12:13:45
举报
文章被收录于专栏:全栈程序员必看

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

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

我们需要弄懂两个问题:

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

问题一解决:

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

Object.defineProperty 基本使用

代码语言:javascript
复制
# 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是如何知道谁在使用?如何告诉它需要更新? 回到第二个问题。

第二个问题解决

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

代码语言:javascript
复制
## 创建订阅者
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.cn/137899.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月5,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 我们需要弄懂两个问题:
  • 问题一解决:
  • Object.defineProperty 基本使用
  • 第二个问题解决
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档