你知道为什么ref不能与shallowRef一起使用吗

前言

在尝试Vue.js的官网文档案例中发现

运用 @click 事件改变ref以及shallowRef的时候发现会同时进行

过程复现

首先我们来举一个例子

vue 复制代码
<script setup lang="ts">
import {ref,shallowRef} from 'vue'

const msgRef = ref({mgs:'a'})

const mgsShallowRef = shallowRef({mgs:'b'})

cosnt change = () => {
    msgRef.value.msg = 'aaaaa' 
    mgsShallowRef.value.msg = 'bbbbb' 
    console.log(mgsShallowRef)
}
</script>

<template>
    <div>
        ref: {{msgRef}}
    </div>
    <div>
        shallowRef: {{mgsShallowRef}}
    </div>
    <button @click="change">改变</button>
</template>

点击按钮改变

按照 shallowRef 的概念中 他改变是属于浅层次的响应内容

虽然打印出来的 mgsShallowRef.value 改变了 在理想状态中页面是 shallowRef: {{mgsShallowRef}} 不会发生改变的

但是实际上发生的却是 页面中的 shallowRef: {{mgsShallowRef}} 变为了 bbbbb

解答

发生了这样子的情况 肯定是抱有疑惑的 这就去看了看ref的源码

发现他调用了triggerRef这个东西

于是去官网查看了一下

发现了他确实有改变的这个效果

想要复现这个问题 只需要简单的改变一下

vue 复制代码
<script setup lang="ts">
import {ref,shallowRef,triggerRef} from 'vue'

const msgRef = ref({mgs:'a'})

const mgsShallowRef = shallowRef({mgs:'b'})

cosnt change = () => {
    mgsShallowRef.value.msg = 'bbbbb' 
    triggerRef(mgsShallowRef)
    console.log(mgsShallowRef)
}
</script>

只是需要这样子调用一下 triggerRef(mgsShallowRef) 便能够复现上述的问题 造成视图的更新

所以说 triggerRef 这个会强制更新收集到的变化 所以造成了这样子的效果

探讨

想要增加一下防御型代码 shallowRef 加上triggerRef 是不是也可以做到 ref 相同的效果呢

相关推荐
Zhu758几秒前
开源项目-Sablewisp-轻量、现代的 Chrome 书签管理扩展(Manifest V3)
前端·chrome
wespaul1 分钟前
一条自然语言命令的 49 个节点:可视化编排与每段强校验
前端·数据库
OH_TPC2 分钟前
【鸿蒙优选三方库】@ohos/axios:前端转鸿蒙,网络层几乎不用改
前端·华为·harmonyos·鸿蒙
程序员大阳4 分钟前
副队长CSS教程(38)–transform 变换
前端·css·变换·transform
程序员Sunday13 分钟前
Vue 3 响应式原理是什么?Proxy、ref 和 reactive 有什么区别?
前端·javascript
mldong23 分钟前
一个 npm 包,九页审批中心:Vue3 项目接上工作流引擎
前端·javascript·vue.js
高级程序源8 小时前
django校园寻物通失物招领平台32261-计算机课程设计、毕业设计
vue.js·python·mysql·小程序·django·flask·课程设计
WeiXin_DZbishe9 小时前
基于springboot宠物领养系统-计算机毕设 附源码【课程设计】94217
vue.js·spring boot·python·django·php·课程设计
架构技术专栏9 小时前
Agent 工具调用:从工具声明到执行反馈
前端·人工智能·后端
别动我齐刘海10 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人