vue3何时失去响应性

情况一:当对象属性里面的值在template进行计算时

根据vue文档,当我们设置

<template>
  <button @click="increment">
    {{ object.foo + 1 }}
  </button>
</template>
<script setup>
import { ref } from 'vue'

const object = { foo: ref(1) }

function increment() {
  object.foo.value++
}
</script>

得到的结果是

 点击后会发现,数据改变了,但是视图不会变

文档中所说:

请注意,仅当 ref 是模板渲染上下文的顶层属性时才适用自动“解包”。 例如, foo 是顶层属性,但 object.foo 不是

意思大概是,把一个对象比喻成树,只有树顶端的值才会被解包。这个树就是ref

文档中也说明了解决方法

解决方法一

将foo进行解构就可以了,把foo作为顶层属性

<template>
  <button @click="increment">
     {{ foo + 1 }} 
  </button>
</template>

<script setup>
import { ref } from 'vue'

const object = { foo: ref(1) }

const { foo } = object

function increment() {
    object.foo.value++
}
</script>

 解决方法二

由文档的原理可以明白,只要我们吧object作为ref的顶层属性,也可以实现

<template>
  <!-- <router-view /> -->
  <button @click="increment">
    {{ obj.foo + 1 }}
  </button>
</template>

<script setup>
import { ref } from 'vue'

const obj = ref({
  foo: 0
})

function increment() {
  obj.value.foo++
}
</script>

情况二:方法二中如果进行结构会不会失去响应性呢?

        

<template>
  <!-- <router-view /> -->
  <button @click="increment">
    {{ foo }}
  </button>
</template>

<script setup>
import { ref } from 'vue'

const obj = ref({
  foo: 0
})
let { foo } = obj.value
foo++
function increment() {
  foo++
  console.log(foo)
}
</script>

结果确实会失去响应性

而且vue插件中foo的值不会再监听到变化,但打印的时候会改变

打印时

vue插件看到的

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值