风清云淡_A 2024-02-23 16:33 采纳率: 100%
浏览 9
已结题

vue3里的ref和shallowRef在同一个组件里面出现,ref的更新会影响到showllowRef

vue3里的ref和shallowRef在同一个组件里面出现,ref的更新会影响到showllowRef,,如下代码

<script setup>
import { ref, shallowRef, triggerRef } from 'vue'
const count = ref(0)
const obj = shallowRef({
  count:1
})

function addClickHandle(){
  count.value++
}
function addShallowClickHandle(){
  obj.value.count++
  // triggerRef(obj)
}
</script>

<template>
    <div>
        {{ count }}
    </div>
    <button @click="addClickHandle">add count</button>
    <hr>
    <div>
       {{ obj.count }}
    </div>
    <button @click="addShallowClickHandle">add count</button>
</template>

先点击addClickHandle事件,只会更新count这是正常的,
但是先点击addShallowClickHandle,视图不更新,再点击addClickHandle,导致obj.count更新了

如果要不互补影响,该怎么操作,难道二者就不能存在同一个sfc中了吗,框架这样设计是不是不合理了

  • 写回答

1条回答 默认 最新

  • GISer Liu 2024-02-23 16:34
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    问题描述:
    在Vue 3中,当在同一个组件中使用 refshallowRef 时,更新 ref 会影响到 shallowRef。具体代码如下:

    <script setup>
    import { ref, shallowRef, triggerRef } from 'vue'
    
    const count = ref(0)
    const obj = shallowRef({
      count: 1
    })
    
    function addClickHandle() {
      count.value++
    }
    
    function addShallowClickHandle() {
      obj.value.count++
      // triggerRef(obj)
    }
    </script>
    
    <template>
      <div>
        {{ count }}
      </div>
      <button @click="addClickHandle">add count</button>
      <hr>
      <div>
        {{ obj.count }}
      </div>
      <button @click="addShallowClickHandle">add count</button>
    </template>
    

    先点击 addClickHandle 事件,只会更新 count,这是正常的。但是如果先点击 addShallowClickHandle,视图不会更新,再点击 addClickHandle,导致 obj.count 更新了。

    解决思路与方案:
    为了避免 ref 的更新影响到 shallowRef,可以考虑使用 toRefshallowRef 转换成普通的 ref。修改代码如下:

    <script setup>
    import { ref, toRef } from 'vue'
    
    const count = ref(0)
    const obj = ref({
      count: 1
    })
    
    function addClickHandle() {
      count.value++
    }
    
    function addShallowClickHandle() {
      obj.value.count++
    }
    </script>
    
    <template>
      <div>
        {{ count }}
      </div>
      <button @click="addClickHandle">add count</button>
      <hr>
      <div>
        {{ obj.count }}
      </div>
      <button @click="addShallowClickHandle">add count</button>
    </template>
    

    这样做可以确保 obj 的更新不会影响到 count

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月5日
  • 已采纳回答 2月26日
  • 创建了问题 2月23日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀