Vue3获取响应式数据、监听数据变化、判断和转换(reactiveApi)

获取响应式数据

API传入返回备注
reactiveplain-object对象代理深度代理对象中的所有成员
readonlyplain-object or proxy对象代理只能读取代理对象中的成员,不可修改
refany{ value: … }对value的访问是响应式的,如果传入的值是一个对象,则会通过reactive代理,如果已经是代理,则直接使用代理
computedfunction{ value: … }读取value值时,会根据情况决定是否要运行函数

应用

  • 如果想让一个对象变为响应式数据,使用reactive或者ref
  • 如果想让一个对象只读,使用readonly
  • 如果想让一个非对象数据变为响应式,使用ref
  • 如果想根据一个响应式数据得到另一个响应式数据,使用computed

注意点

const state = reactive({a:1}) // 数据源,不暴露
const imState = readonly(state) // 暴露出一个不可更改的对象
const setValue = (val) => {
	state.a = val // 设置
}
return {
	imState,
	setValue
}
  • 导出一个用户不可随意更改的对象,仅能通过作者提供的方法更改
  • cumputed传入的函数不会直接调用,当用到函数内部的响应式数据时,会在使用这个响应式数据之前调用,且具有缓存,当数据不变时函数不会重复执行
  • 使用…解构reactive或者readonly,或者使用 { a } = state这种格式得到的数据不具有响应式 解决办法:使用toRefs

监听数据变化

watchEffect

const watch = watchEffect(()=> {
	// 该函数会立即执行,记录响应式数据,当其变化时,会放入微队列执行
})
// 返回一个函数,调用这个函数会停止监听
watch(); // 停止监听

watch

// 监听单个数据的变化
const state = reactive({a: 1})
watch(
	()=> state.a,
	(newValue, oldValue)=> {
		// ... 微队列调用
	},
	options // 配置参数对象 如immediate
)
const count = ref(0)
watch(
	count,
	(newValue, oldValue)=> {
		// ...
	},
	options // 配置参数对象 如immediate
)
// 监听多个数据的变化
watch(
	[()=> state.a, count],
	([newValue1, newValue2], [oldValue1, oldValue2])=> {
		// ...
	},
	options
)

应用

除了以下场景,其余都建议使用watchEffect

  • 不希望回调函数一开始就执行
  • 数据改变时,需要参考旧值
  • 需要监控一些回调函数中不会用到的数据

判断

  • isProxy 是否由reactive或者readonly创建
  • isReactive 是否由reactive创建
  • isReadonly 是否是有readonly创建
  • isRef 是否是一个ref对象

转换

unref

等同于 isRef(val) ? val.value : val
使用: const a = unref(b)

toRef

得到一个响应式对象某个属性的ref格式

const state = reactive({a: 1})
const aRef = toRef(state, 'a')
aRef.value++
console.log(state.a) // 2
state.a++
console.log(aRef.value) // 3

toRefs

const state = reactive({a: 1, b: 2})
const stateRefs = toRefs(state)
/*
stateRefs: not a proxy
{
	a: {value: ...},
	b: {value: ...}
}
*/
应用
setup() {
	const state = reactive({a: 1, b: 2})
	return {
		...state // a,b不再是响应式
	}
}
setup() {
	const state = reactive({a: 1, b: 2})
	return {
		...toRefs(state) // a,b是响应式
	}
}
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue 2 和 Vue 3 在数据响应式原理上有一些区别。以下是它们之间的主要区别: 1. Reactivity API响应式 API): - Vue 2:Vue 2 使用 Object.defineProperty() 来追踪属性的变化,并通过 getter 和 setter 来劫持属性的访问和修改,从而实现数据响应式。 - Vue 3:Vue 3 引入了一个新的响应式系统,使用 Proxy 对象来实现数据响应式。Proxy 可以拦截对象上的各种操作,包括属性的读取、设置、删除等。 2. 引入了 Proxy 对象: - Vue 2:Vue 2 中没有使用 Proxy 对象。 - Vue 3:Vue 3 使用 Proxy 对象来代替 Vue 2 中的 Object.defineProperty()。Proxy 具有更强大和灵活的功能,可以捕获更多类型的操作,并且可以直接监听整个对象或数组,而不需要遍历每个属性。 3. 响应式侦听(Reactivity Tracking): - Vue 2:Vue 2 使用递归遍历来追踪数据变化,这意味着在大型对象或数组上可能会有性能问题。 - Vue 3:Vue 3 使用了基于依赖图的跟踪机制,只追踪实际使用的属性,而不是整个对象。这样可以提高性能并减少不必要的侦听。 4. 静态树优化(Static Tree Optimization): - Vue 2:Vue 2 中的虚拟 DOM 对比算法是基于深度优先遍历的,无法识别静态子树,导致在重新渲染时可能会重复创建和销毁组件。 - Vue 3:Vue 3 引入了静态树优化,通过标记和提升静态节点,可以跳过对它们的对比和渲染过程,从而提高性能。 总的来说,Vue 3 在数据响应式上采用了 Proxy 对象和基于依赖图的跟踪机制,提供了更强大和高效的响应式系统,并引入了一些优化技术来提高性能。这些改进使得 Vue 3 在处理大型应用程序和复杂数据结构时更加高效和灵活。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

合法的咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值