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对数据进行非深度监听的更多相关文章

  1. vue中的computed(计算属性)和watch(监听属性)的特点,以及深度监听

    //计算属性是根据data中已有的属性,计算得到一个新的属性, <div>全名:{{fullName}}</div> 创建计算属性通过computed关键字,它是一个对象 计算 ...

  2. vue2.0中watch总结:普通监听和深度监听

    watch:{} 是一个对象,一定要当成对象来用,可监听数据,是vue中数据发生变化进行处理的函数, 它有三个选项 第一个handler:其值是一个回调函数.即监听到变化时应该执行的函数.第二个是de ...

  3. vue中如何深度监听一个对象?

    大家都知道,Vue项目中对数据的监听,提供了一个很好的钩子watch,watch可以极其方便的监听我们常用数据类型值的变化,但通常当我们想监听一个对象中,某个属性值的变化时,很难达到我们预期的效果.那 ...

  4. Vue.js中 watch(深度监听)的最易懂的解释

    <div> <p>FullName: {{fullName}}</p> <p>FirstName: <input type="text& ...

  5. Vue.js中 watch的理解以及深度监听

    如代码: <div> <p>FullName: {{fullName}}</p> <p>FirstName: <input type=" ...

  6. vue中如何在子组件添加类似于watch属性监听父组件数据,数据变化时子组件做出相应的动作

    首先:我们需要在父组件中标签中定义一个 ref="parentObjVue" 其次:我们在子组件中,通过  var tmp=this.$refs.parentObjVue找到父组件 ...

  7. Oracle11g 创建数据库中问题处理(必须运行Netca以配置监听程序)

    这两天学习<OCP/OCA认证考试指南>,要创建新的数据库,因为此前我的电脑上已经被折腾了好久的Mysql 和oracle10g ,所以可能导致很多环境都变了,创建数据库的过程中出现了一些 ...

  8. es6的set和get实现数据双向绑定,监听变量变化。

    直接上代码吧,这个用法真的是效仿了.net的枚举. vue的数据双向绑定就是用这个实现的. 代码: html: <input type="text" id="inp ...

  9. android中SeekBar拖动进度条的使用及事件监听

    下面和大家分享一下android中SeekBar拖动进度条的使用,以及事件监听.拖动进度条的事件监听需要实现SeekBar.OnSeekBarChangeListener接口,调用SeekBar的se ...

  10. 一个类,有新增元素(add)和获取元素数量(size)方法。 启动两个线程。线程1向容器中新增数据。线程2监听容器元素数量,当容器元素数量为5时,线程2输出信息并终止

    方式一: /** * 两个线程要是可见的所以要加上votalile */public class Test_01 { public static void main(String[] args) { ...

随机推荐

  1. 带你了解AKG正反向算子注册+关联流程

    摘要:简要介绍一下akg正反向算子的注册和关联流程. 本文分享自华为云社区<AKG正反向算子注册+关联>,作者:木子_007 . 一.环境 硬件:eulerosv2r8.aarch64 m ...

  2. 一图解析MySQL执行查询全流程

    摘要:当我们希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的. 本文分享自华为云社区<mysql执行查询全流程解析>,作者:breakDraw ...

  3. Unity3D 导出的apk进行混淆加固、保护与优化原理(防止反编译)

    ​ Unity3D 导出的apk进行混淆加固.保护与优化原理(防止反编译) 目录 前言: 准备资料: 正文: 1:打包一个带有签名的apk 2:对包进行反编译 3:使用ipaguard来对程序进行加固 ...

  4. 一文读懂火山引擎A/B测试的实验类型(3)——多链接实验

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 一. 概述 多链接实验,也称为Split url实验,用户根据分流结果访问不同版本的url. 举个例子: 当您有两 ...

  5. Axure 公司年会抽奖器

    步骤一:拖拉摆放好相关控件 1.摆好相关相关背景,即一个心形和一行文字"一路同行,感谢同行" 2.一个中继器,中继器里面放有一个300X60的白底黑框矩形.一个"name ...

  6. 收到一封CTO来信,邀约面试机器学习工程师

    大家好,我是北海 很少登陆 Gmail,前天收验证码登了一下,发现居然收到一封某初创公司CTO的来信. 我在Github上看到了您的资料觉得很有意思,请问您是否考虑我们公司的全职工作机会呢?可供考虑的 ...

  7. JSP标准标签库(JSTL)个人使用指南

    前排提示,本篇仅涉及 JSTL 的配置和简要介绍 JSTL 的 Core 和 Functions 标签库中几个常用的标签.更加详细的内容,博主会贴相应超链接. 注意:本教程使用的 JSTL 1.2,如 ...

  8. ava进阶(39)--守护线程与定时器

    文档目录: 一.守护线程 二.定时器 ---------------------------------------分割线:正文------------------------------------ ...

  9. Redis 哨兵模式高可用

    本文为博主原创,未经允许不得转载: 目录: 1. 哨兵 Sentinel 介绍 2. 哨兵架构特点及工作原理 3. redis哨兵架构搭建步骤 4. 哨兵数据丢失 5. spring boot 整合  ...

  10. 问题--在C++使用strcpy等函数时发生C4996报错

    1.问题如下: C4996:'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To ...