vue3笔记5 响应式API

浅响应式

shallowReactive 只创建第一层数据的响应式
适用于对象结构深,但只需处理最外层属性变化的场景

shallowRef 不处理对象类型的响应式,传对象时不会自动调用reactive
适用于逻辑中不修改对象属性,而替换整个对象的场景

只读

readonly 把响应式数据(ref/reactive)包装为只读的响应式数据
shallowReadonly 浅只读
适用于不希望数据被修改的场景,例如传递响应式数据时,不希望其他组件修改数据

将响应式对象转换为普通对象

toRaw 将reactive对象转换为普通对象
适用于读取响应式对象的数据进行操作,而不希望引起页面更新
markRaw 将普通对象标记为原始数据,防止被转换为响应式数据
适用于防止第三方类库被设置为响应式,或提高渲染不可变的大数据列表性能debounce

自定义ref

可以自行控制建立依赖跟踪触发更新通知
例如以下防抖函数实现,更新ref值后延迟一定时间才真正更新引用的值,并触发界面更新

<template>
	<input v-model="text" />
</template>
<script>
setup() {
	function useDebouncedRef(value, delay = 200) {
	  let timeout
	  return customRef((track, trigger) => {
	    return {
	      // 从自定义ref中取数了,调用track()触发依赖跟踪,并把value返回
	      get() {
	        // 取数时,通知取数方跟踪此数据变化,建立依赖关系
	        // 不写这个,取数方无法将此ref关联为依赖对象,不会在value更新时重新读取数据处理	        
	        track() 
	        return value
	      },
	      // 向自定义ref设置值,更新value值,并调用更新提醒触发器trigger
	      set(newValue) {
	        clearTimeout(timeout)
	        timeout = setTimeout(() => {
	          value = newValue
	          trigger() // 通知重新解析模板更新界面
	        }, delay)
	      }
	    }
	  })
	}
	return {
		text: useDebouncedRef('hello')
	}
}
</script>

判断响应式数据

isRef
isReactive
isReadonly
isProxy 检查对象是否是由reactive或readonly创建的Proxy对象

posted on 2022-04-11 22:37  路过君  阅读(14)  评论(0编辑  收藏  举报

导航