Vue3中shallowReactive和shallowRef对数据进行非深度监听
1.Vue3 中 ref 和 reactive 都是深度监听
默认情况下,
无论是通过 ref 还是 reactive 都是深度监听。
深度监听存在的问题:
如果数据量比较大,非常消耗性能。
有些时候我们并不需要对数据进行深度监听。
这个时候就没有必要使用ref和reactive
2.说明 ref 对数据进行深度监听
<template>
<div>
<div>
<li>{{state}}</li>
<button @click="func1">按钮</button>
</div>
</div>
</template>
<script>
import {ref} from 'vue'
export default {
name: 'App',
setup(){
let state=ref({
a:'a',
b:{
b1:"b1",
c:{
c1:"c1",
d1:{
e1:"e1",
f1:{
f1:"f1"
}
}
}
}
})
function func1(){
state.value.b.c.d1.f1.f1="f1f1f1f1"
}
return {state,func1}
},
}
</script>
通过上面的代码,我们发现无论写多少层数据;
数据层级有多深,ref始终会对数据进行深度监听。
这显然不是我们需要的。
我们迫切需要对数据进行非深度监听。
这个时候,我们的shallowReactive和shallowRef就出场了。
3.使用 shallowReactive 非深度监听
前面我们说道:
默认情况下,无论是通过 ref 还是 reactive 都是深度监听。
所以Vue3为我们提供了,shallowReactive进行非深度监听。
shallowReactive只会包装第一层的数据
默认情况它只能够监听数据的第一层。
如果想更改多层的数据,
你必须先更改第一层的数据。
然后在去更改其他层的数据。
这样视图上的数据才会发生变化。
<template>
<div>
<div>
<div>{{state}}</div>
<button @click="func1">按钮</button>
</div>
</div>
</template>
<script>
import {shallowReactive} from 'vue'
export default {
name: 'App',
setup(){
let state=shallowReactive({
a:'a',
b:{
b1:"b1",
c:{
c1:"c1",
d1:{
e1:"e1",
f1:{
f1:"f1"
}
}
}
}
})
function func1(){
console.log( state );//只有第一层
console.log( state.b.b1 )
console.log(state.b.c )
console.log( state.b.c.d1 )
console.log( state.b.c.d1.f1 );
// 直接更改其他层的数据,会失败的哈
// state.b.c.d1.f1.f1="f1f1f1f1"
// 先更改第一层,然后在更改其他层就会成功
state.a="啊啊啊"
state.b.c.d1.f1.f1="f1f1f1f1"
}
return {state,func1}
},
}
</script>
4.使用 shallowRef 进行非深度监听
注意点:如果是通过shallowRef创建的数据。
那么Vue监听的是.value 变化。
并不是第一层的数据的变化。
因此如果要更改shallowRef创建的数据。
应该xxx.value={}
<template>
<div>
<div>
<div>{{state}}</div>
<button @click="func1">按钮</button>
</div>
</div>
</template>
<script>
import {shallowRef} from 'vue'
export default {
name: 'App',
setup(){
let state=shallowRef({
a:'a',
b:{
b1:"b1",
c:{
c1:"c1",
d1:{
e1:"e1",
f1:{
f1:"f1"
}
}
}
}
})
function func1(){
// 通过 state.value的方式直接去更改
state.value={
a:'我是a',
b:{
b1:"我是b1",
c:{
c1:"我是c1",
d1:{
e1:"我是e1",
f1:{
f1:"f1"
}
}
}
}
}
}
return {state,func1}
},
}
</script>
5.triggerRef更改shallowRef创建的数据
triggerRef 可以直接去更改
shallowRef创建数据的某一层。
需要我们注意的是:
vue3中值提供了triggerRef这个方法,
但是并没有提供triggerReactive的方法。
也就是说triggerRef 【不可以】去更改
shallowReactive创建的数据
<template>
<div>
<div>
<div>{{state}}</div>
<button @click="func1">按钮</button>
</div>
</div>
</template>
<script>
import {shallowRef,triggerRef} from 'vue'
export default {
name: 'App',
setup(){
let state=shallowRef({
a:'a',
b:{
b1:"b1",
c:{
c1:"c1",
d1:{
e1:"e1",
f1:{
f1:"f1"
}
}
}
}
})
function func1(){
// 直接更改你需要修改某一层的数据
state.value.b.c.d1.f1="我是f1";
triggerRef(state)
}
return {state,func1}
},
}
</script>
通过上面的几个例子
我们知道一般情况下。我们使用ref和reactive即可。
只有在监听的数据量比较大的时候。
才使用shallowReactive和shallowRef。
Vue3中shallowReactive和shallowRef对数据进行非深度监听的更多相关文章
- vue中的computed(计算属性)和watch(监听属性)的特点,以及深度监听
//计算属性是根据data中已有的属性,计算得到一个新的属性, <div>全名:{{fullName}}</div> 创建计算属性通过computed关键字,它是一个对象 计算 ...
- vue2.0中watch总结:普通监听和深度监听
watch:{} 是一个对象,一定要当成对象来用,可监听数据,是vue中数据发生变化进行处理的函数, 它有三个选项 第一个handler:其值是一个回调函数.即监听到变化时应该执行的函数.第二个是de ...
- vue中如何深度监听一个对象?
大家都知道,Vue项目中对数据的监听,提供了一个很好的钩子watch,watch可以极其方便的监听我们常用数据类型值的变化,但通常当我们想监听一个对象中,某个属性值的变化时,很难达到我们预期的效果.那 ...
- Vue.js中 watch(深度监听)的最易懂的解释
<div> <p>FullName: {{fullName}}</p> <p>FirstName: <input type="text& ...
- Vue.js中 watch的理解以及深度监听
如代码: <div> <p>FullName: {{fullName}}</p> <p>FirstName: <input type=" ...
- vue中如何在子组件添加类似于watch属性监听父组件数据,数据变化时子组件做出相应的动作
首先:我们需要在父组件中标签中定义一个 ref="parentObjVue" 其次:我们在子组件中,通过 var tmp=this.$refs.parentObjVue找到父组件 ...
- Oracle11g 创建数据库中问题处理(必须运行Netca以配置监听程序)
这两天学习<OCP/OCA认证考试指南>,要创建新的数据库,因为此前我的电脑上已经被折腾了好久的Mysql 和oracle10g ,所以可能导致很多环境都变了,创建数据库的过程中出现了一些 ...
- es6的set和get实现数据双向绑定,监听变量变化。
直接上代码吧,这个用法真的是效仿了.net的枚举. vue的数据双向绑定就是用这个实现的. 代码: html: <input type="text" id="inp ...
- android中SeekBar拖动进度条的使用及事件监听
下面和大家分享一下android中SeekBar拖动进度条的使用,以及事件监听.拖动进度条的事件监听需要实现SeekBar.OnSeekBarChangeListener接口,调用SeekBar的se ...
- 一个类,有新增元素(add)和获取元素数量(size)方法。 启动两个线程。线程1向容器中新增数据。线程2监听容器元素数量,当容器元素数量为5时,线程2输出信息并终止
方式一: /** * 两个线程要是可见的所以要加上votalile */public class Test_01 { public static void main(String[] args) { ...
随机推荐
- OGC标准WMTS服务概念与地图商的瓦片编号流派-web地图切片加载
还不知道地图栅格化切片等相关GIS原理的,推荐阅读<webGIS底图栅格化与实时数据合成处理原理,地图API设计,xyz加载> OGC概念 OGC全称--开放地理空间信息联盟(Open G ...
- web自动化测试(1):再谈UI发展史与UI、功能自动化测试
前言(废话) 行文前,安利下文章:<图形界面操作系统发展史--计算机界面发展历史回顾>.<再谈MV*(MVVM MVP MVC)模式的设计原理-封装与解耦> 1973年4月,X ...
- iOS应用上架详细图文教程
App Store作为苹果官方的应用商店,审核严格周期长一直让用户头疼不已,很多app都"死"在了审核这一关,那我们就要放弃iOS用户了吗?当然不是!本期我们从iOS app上 ...
- 十分钟读懂火山引擎 DataLeap 数据治理实践
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 日前,火山引擎数智平台 VeDI 直播活动「超话数据」在线举办,来自火山引擎 DataLeap 数据产品专家从数据 ...
- Vue2--入门学习
看了慕课网的教学视频,觉得挺不错的,在此做个随堂记录,有兴趣的可以去看视频 vue版本:2.5 文档链接:https://v2.cn.vuejs.org/v2/guide/installation.h ...
- Go--时间日期相关
1 获取当天零点的时间戳 //当天0点的时间戳 //获取当前时间 t := time.Now() nowTime := time.Date(t.Year(), t.Month(), t.Day(), ...
- [译]为什么你应该关注 Docker
注:该文原文为 Why You Should Care About Docker ,由 CHRIS DAWSON 编写. 当我在 Dockercon 上陶醉于那些令人激动地议题时,我想到了一个问题:我 ...
- 如何绕过某讯手游保护系统并从内存中获取Unity3D引擎的Dll文件
某讯的手游保护系统用的都是一套,在其官宣的手游加固功能中有一项宣传是对比较热门的Unity3d引擎的手游保护方案,其中对Dll文件的保护介绍如下, "Dll加固混淆针对Unity游戏,对 ...
- 二、redis主从环境搭建
系列导航 一.redis单例安装(linux) 二.redis主从环境搭建 三.redis集群搭建 四.redis增加密码验证 五.java操作redis 环境:centos7需要的安装包: redi ...
- docker 原理之 namespace (上)
1. namespace 资源隔离 namespace 是内核实现的一种资源隔离技术,docker 使用 namespace 实现了资源隔离. Liunx 内核提供 6 种 namespace 隔离的 ...