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

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日

悬赏问题

  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法