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


相关推荐

  • String如何截取字符串长度

    String如何截取字符串长度20应届生面试题:使用String引用类型的时候,用过哪些方法?比如如何截取一段给定字符串的长度?答:没回答上来!(没用过截取字符串)String引用类型中有一个叫做substring的方法,这个就是用来截取字符串的。Ctrl+鼠标左键点进了substring方法内,查看到了以下源码。//小白的理解://beginIndex是起始位置,endIndex是末端位置publicStringsubstring(intbeginIndex,intendIndex){

    2022年5月18日
    33
  • 初识.Net审计

    初识.Net审计前言对.net认知比较少,学习一下.net的一些简单审计。遇到.net源码能简单审审。基础概念文件类型ASPX.cs是页面后的代码,aspx负责显示,服务器端的动作就是在as

    2021年12月13日
    44
  • json学习初体验–第三者jar包实现bean、List、map创json格式

    json学习初体验–第三者jar包实现bean、List、map创json格式

    2022年1月13日
    56
  • 进程的用户态和内核态的概念理解以及切换方法_用户进程从用户态切换到内核态

    进程的用户态和内核态的概念理解以及切换方法_用户进程从用户态切换到内核态原文链接:https://www.cnblogs.com/viviwind/archive/2012/09/22/2698450.html内核态:当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。用户态:每个进程都有自己的内核栈。当进程在执行用…

    2025年11月30日
    5
  • SparkStreaming之foreachRDD

    SparkStreaming之foreachRDD首先我们来对官网的描述了解一下。DStream中的foreachRDD是一个非常强大函数,它允许你把数据发送给外部系统。因为输出操作实际上是允许外部系统消费转换后的数据,它们触发的实际操作是DStream转换。所以要掌握它,对它要有深入了解。下面有一些常用的错误需要理解。经常写数据到外部系统需要创建一个连接的object(eg:根据TCP协议连接到远程的服务器,我们连接外部数据库需要自己的句柄

    2022年6月15日
    44
  • 4-(基础入门篇)学会刷Wi-Fi模块固件(刷AT指令固件)「建议收藏」

    4-(基础入门篇)学会刷Wi-Fi模块固件(刷AT指令固件)

    2022年4月2日
    51

发表回复

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

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