你知道为什么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 相同的效果呢

相关推荐
Hilaku4 分钟前
Vue 和 React 真正的差距,不在语法,而在团队犯错成本
前端·javascript·程序员
研☆香15 分钟前
为什么变量声明在赋值前也能使用?—— 深入理解 JavaScript 变量提升与作用域
开发语言·前端·javascript
Liora_Yvonne32 分钟前
目录结构到底怎么设计?别再把 components 和 utils 当垃圾桶了
前端
柯克七七1 小时前
我把 bug 修得太干净了,测试组以为这个模块本来就没问题
前端·javascript·typescript
Null1551 小时前
浏览器唤起桌面端应用(终极篇)
前端·javascript
Quz1 小时前
QML Label 完整用法与 Text 组件选型
前端·qt
妙码生花1 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(三十四):后台初始化请求实现
前端·javascript·go
天若有情6731 小时前
前端性能优化:从“按下预加载”到“AI级智能预判系统”
前端·性能优化·js·active·hover·首屏加载
Csvn2 小时前
📦 CSS Container Queries 实战踩坑:5 个让你怀疑人生的隐藏陷阱
前端
大家的林语冰2 小时前
👍 Rust 为 Node 插上翅膀,反超 Bun 和 pnpm,一体化工具我也有!
前端·javascript·node.js