Vue3中shallowReactive和shallowRef对数据进行非深度监听

简介: 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>


73d8ce6a7f224d6facf6f1901b9e0cb7_tplv-k3u1fbpfcp-watermark.gif


通过上面的代码,我们发现无论写多少层数据;


数据层级有多深,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>

47cf04d8970e44629cc6cde2ff4d40da_tplv-k3u1fbpfcp-watermark.gif


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>

6cfb54de4b654d2dbb7497c7ad529293_tplv-k3u1fbpfcp-watermark.gif


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>

9a58fd40d6344631ab70154470f1644c_tplv-k3u1fbpfcp-watermark.gif


通过上面的几个例子


我们知道一般情况下。我们使用ref和reactive即可。


只有在监听的数据量比较大的时候。


才使用shallowReactive和shallowRef。

相关文章
|
10天前
|
JSON JavaScript 前端开发
在Vue3项目中,Vite起到的作用及其可以做的事情
Vite是Vue 3项目的关键快速开发服务器和高效的热模块替换(HMR)。它的亮点包括:使用ES模块实现快速启动和动态加载,模块级别HMR提升开发效率,Rollup打包优化生产构建。此外,Vite还支持插件系统、自定义配置、静态资源处理和现代JS特性。通过`npm create vite`可快速搭建Vue项目,配置文件`vite.config.js`可定制行为,`.env`文件管理环境变量。Vite优化了开发与构建流程,提高开发者效率并保证构建性能。
|
6天前
|
JavaScript 前端开发 API
什么是响应式❓Vue2/Vue3中响应式的原理
什么是响应式❓Vue2/Vue3中响应式的原理
18 2
|
6天前
|
资源调度 JavaScript 前端开发
vite+vue3+ts从0到1搭建企业级项目(2)
vite+vue3+ts从0到1搭建企业级项目
20 1
|
6天前
|
开发工具 git
vite+vue3+ts从0到1搭建企业级项目(4)
vite+vue3+ts从0到1搭建企业级项目
23 0
|
6天前
|
存储 JavaScript API
vite+vue3+ts从0到1搭建企业级项目(3)
vite+vue3+ts从0到1搭建企业级项目
19 0
|
6天前
|
资源调度 JavaScript 测试技术
vite+vue3+ts从0到1搭建企业级项目(1)
vite+vue3+ts从0到1搭建企业级项目
36 0
|
6天前
|
缓存 监控 JavaScript
Vue.js中的计算属性 computed 与监听属性 watch深入探索
Vue.js中的计算属性 computed 与监听属性 watch深入探索
27 0
|
6天前
|
JavaScript 前端开发 编译器
跨越时代的框架对决:深度剖析Vue 2与Vue 3核心差异
跨越时代的框架对决:深度剖析Vue 2与Vue 3核心差异
15 0
|
1月前
|
JavaScript API
【vue实战项目】通用管理系统:api封装、404页
【vue实战项目】通用管理系统:api封装、404页
46 3
|
1月前
|
人工智能 JavaScript 前端开发
毕设项目-基于Springboot和Vue实现蛋糕商城系统(三)
毕设项目-基于Springboot和Vue实现蛋糕商城系统