当前位置: 首页 > 知识库问答 >
问题:

前端 - vue3 props 是对象的情况如何变为响应式?

何昆
2023-10-31

如题,定义一个组件,设置 props 如下:

interface Props {  decorateConfig: {    'src'?: string  },  width?: number,  height?: number}
const props = withDefaults(defineProps<Props>(), {  decorateConfig: () => {    return {      src: ''    }  }})

当我直接定义

const src = props.decorateConfig.src

的时候,会提示这样会失去响应性

Getting a value from the `props` in root scope of `<script setup>` will cause the value to lose reactivity.

所以想问下,如何可以将这样的定义,转为响应性

共有2个答案

卢开济
2023-10-31

render function 外部访问 props 的值,还想保留响应式的话,需要用 computed 来处理

const src = computed(() => props.decorateConfig.src)
白芷阳
2023-10-31

在 Vue 3 中,要在组件中保持属性的响应性,你应该使用 reactive 函数来创建响应式对象。这样,当你的属性发生变化时,Vue 就会更新组件的渲染。

你可以像下面这样来修改你的代码:

import { reactive } from 'vue'interface Props {  decorateConfig: {    src?: string  },  width?: number,  height?: number}const props = withDefaults(defineProps<Props>(), {  decorateConfig: () => {    return {      src: ''    }  }})// 创建一个响应式对象,包含所有属性const instance = reactive(props)// 现在你可以通过 `instance.decorateConfig.src` 来访问属性,并且它们是响应式的const callImg = instance.decorateConfig.src

在上面的代码中,我们首先导入了 reactive 函数,然后使用它来创建一个新的响应式对象 instance,该对象包含了所有的属性。然后我们可以通过这个响应式对象来访问所有的属性,并且这些属性都是响应式的。这意味着当这些属性的值发生变化时,Vue 会自动更新组件的渲染。

 类似资料:
  • 已知有一个对象,key和value对应 怎么用ts来定义这样的数组?

  • 问题内容: 我想使用Express.js将Jade模板的局部视图呈现给变量。 通常,您直接将局部视图呈现给响应对象: 但是,由于我在Socket.io服务器事件中,因此没有“响应”对象。 有没有一种优雅的方法可以在 不 使用响应对象的 情况下 将Jade部分视图呈现给变量? 问题答案: 您可以手动编译Jade模板。

  • 问题内容: 如何在Java中查看Object是否是不使用反射的数组?而且如何在不使用反射的情况下遍历所有项目? 我使用Google GWT,所以我不允许使用反射:( 我很想在不使用反射的情况下实现以下方法: 顺便说一句:我也不想使用JavaScript,这样我就可以在非GWT环境中使用它。 问题答案: 您可以使用 这适用于对象和原始类型数组。 对于toString,请看一下。您必须检查数组类型并调

  • 我正在做一个课程项目飞行雷达模拟器。 情况是,当两架飞机危险地接近时,两架飞机的图像都发生了变化,而当它们处于安全距离时,它们又发生了变化。 问题是,大多数时候,只有一个图像被改成红色,我不知道问题出在哪里。

  • 不确定这是更新还是什么,但目前我有两个F4实例在标准环境(java app)上运行。现在,我在过去12小时内没有做过一个请求,但我的前端实例使用率今天是64.02小时!!我认为只有当请求完成时,使用量才会增加。有什么变化吗?我仍然是一年免费的(我还有大约90天) 我的配置文件的内容:

  • 我试图使用两个div并排响应设计。左div包含一个随页面大小变化的图像。右div包含一个不会改变的菜单。当页面达到一定大小(太小)时,菜单应该在图像下方并停留在中间)。 但它也需要垂直对齐在左边的div的中间。 应在较大屏幕上垂直居中: 目前,它可以在较小的屏幕上正常工作: 这是我的HTML: 这是我的CSS: 我尝试了所有方法,但是所有其他常规对齐方法都打破了其他方法。