Vue3使用defineprops丢失响应式的解决方法

今天写代码的时候,父组件传给子组件的数据,然后修改数据去调取后端的接口,结果数据一直对不上,然后发现终端中打印的

点击进入发现尤大大发的文章[Core Team RFC] Reactive Props Destructure · vuejs/rfcs · Discussion #502 · GitHub

比如我们平时写代码父传子是这样的

const props = defineProps<{ id: string }>()

但是在别的地方写需要props.id来使用id传来的值,有些人觉得这样不太优雅,于是这样写

const { id } = defineProps<{ id: string }>()

这就是问题的所在,这样会使id丢失响应式

如果非要使用结构式,可以这样玩

const props = defineProps<{ id: string }>()
const { id } = toRef(props)

或者

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

const { count } = defineProps(['count'])

watchEffect(() => {
  // referencing a destructured binding in tracking contexts
  // registers it as a dependency.
  // this will log every time the count prop changes from parent
  console.log(count)
})
</script>

<template>{{ foo }}</template>
根据您提供的引用内容,当您将`defineExpose`暴露的语法注释掉后,出现了报错信息"Cannot read properties of undefined (reading '__vccOpts') "。此错误可能是由于在使用`defineProps`时出现问题。`defineProps`是Vue 3中用于定义父组件传递给子组件的属性的方法。在使用`defineProps`时,需要确保您正确地导入和使用Vue的`defineProps`函数,并且在组件的`props`选项中定义属性。请检查您的代码,确保正确使用了`defineProps`并定义了正确的属性。 另外,根据引用的信息,Vue 3.2版本之后,您还可以使用语法糖来简化`setup`中使用`defineExpose`的方式。只需在`script`标签上添加`setup`属性,并在其中直接定义和暴露您需要访问的函数或数据即可,无需使用`defineExpose`函数进行暴露。请根据您所使用Vue版本和语法规范进行相应的调整。 综上所述,要解决vue3使用`defineProps`报错的问题,请确保正确导入和使用`defineProps`函数,并在组件的`props`选项中定义属性。如果您使用的是Vue 3.2版本及以上,您还可以尝试使用语法糖来简化`setup`中对函数或数据的使用和暴露。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vue3报错:‘defineProps‘ is not defined,‘defineExpose‘ is not defined。](https://blog.csdn.net/weixin_56728548/article/details/125366388)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [vue2 + webpack5相适配的 能成功打包的 package.json 文件](https://download.csdn.net/download/weixin_43405300/88252148)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值