【问题标题】:Vue component gets prop only if data attributes not setVue 组件仅在未设置数据属性时才获取道具
【发布时间】:2022-01-15 17:50:46
【问题描述】:

我需要帮助。我是 Vue3 的业余爱好者,不明白为什么会发生这种情况:

如果我在父组件中设置:

props: [ 'code' ],    
data() {
    return {
        asset: {
            id: '',
            brand: '',
            group: {
                name: '',
                area: ''
            }
        }
    }
},
created() {
    axios.get('/api/myUrl/' + this.code, {})
        .then(response => {
            if (response.status === 200) {
                this.asset = response.data;
            }
        })
        .catch(error => {
                console.log(error);
        })
}

然后,在我的组件<asset-insurance :asset_id="asset.id"></asset-insurance> 中,asset_id 属性为空

但是,如果我设置:

props: [ 'code' ],
data() {
    return {
        asset: []
    }
},
created() {
    axios.get('/api/myUrl/' + this.code, {})
        .then(response => {
            if (response.status === 200) {
                this.asset = response.data;
            }
        })
        .catch(error => {
            console.log(error);
        })
}

然后,asset_id prop<asset-insurance> 组件中获得了正确的 asset.id 值,但我在有关资产的主要组件中收到了一些警告和错误属性 group.name 未设置(但它在模板中正确呈现)。

可能我做错了什么,但我找不到问题出在哪里。有什么帮助吗?

编辑:

我只是通过 console.logging 来检查子组件 AssetInsurance 中的 prop

<script>
export default {
    name: "AssetInsurance",
    props: [
        'asset_id'
    ],
    created() {
        console.log(this.asset_id)
    }
}
</script>

asset_id 只是一个整数,并且在父数据asset.id 中被正确分配,因为我也在父模板中渲染它。

【问题讨论】:

  • 您发布的代码没有解释问题。如果数据是您所期望的,它应该可以工作。不知道您如何确定道具不正确。最简单的方法是只输出asset.id 值,不需要子组件。请提供stackoverflow.com/help/mcve 进行复制。 Stackblitz 等的工作演示可能有助于更快地获得答案。但是将asset定义为数组然后赋值对象是错误的。
  • @EstusFlask,谢谢,但很抱歉我不知道如何使用 Stackblitz。我已经编辑了我的问题,以澄清在 api 调用中正确分配了asset.id,并且子组件中的直接console.log 显示当我用属性定义资产时没有传递prop,但是当它传递正确时将资产声明为数组。 :(
  • 我发布了解释。您不会在 created 钩子中获得道具值,因为它不存在。我猜你只是在使用asset 数组时破坏了组件(这是错误的原因),所以当asset.id 可用时第二次重新安装子组件,而在正常情况下不应该。当登录对象时也要注意这一点(这里不是这种情况)stackoverflow.com/questions/23392111/console-log-async-or-sync

标签: vue.js vuejs3


【解决方案1】:

asset 定义为数组并用普通对象重新分配它是不正确的。这可能会影响响应性,并且还会阻止读取 group 中的嵌套键。

问题被误诊。 asset_id 值已更新,但不是在预期的时间。组件实例创建时prop值不可用,检查created中的prop值是不正确的,特别是因为它是异步设置的。

为了在控制台中输出最新的asset_id 值,应该使用观察者,这就是它们的用途。否则asset_id 可以按原样在模板中使用。

【讨论】:

  • 好的,现在我明白问题出在哪里了,但遗憾的是我不知道如何解决它。在创建或安装的钩子中正确调用 api 的正确方法是什么?正如你所指出的,我已经在计算的'''asset_id_watcher(){return this.asset_id}'''中创建了一个观察者,但是'''console.log(this.assed_id_watcher)'''在created或mounted中不起作用要么。
  • 我所说的“观察者”是指专门的观察​​者,而不是计算出来的vuejs.org/v2/guide/computed.html#Watchers。如果createdmounted 中的值尚不存在,您实际上无法获得该值。您可能有 XY 问题。如果您在组件初始化时需要asset_id,则在数据可用之前不应渲染它。这通常用 v-if 解决
  • 顺便说一句,我什至不知道手表的属性。我一直在阅读,现在我明白了如何在组件中无法使用 v-if 时解决这个问题。 :)
【解决方案2】:

好的,我想我找到了正确的方法,至少在我的情况下。

Prop 在组件中不可用,因为它是在创建组件之后生成的,正如@EstusFlask 所指出的那样。

解决这个问题的简单方法是仅在 prop 可用时安装组件:

<asset-insurance v-if="asset.id" :asset_id="asset.id"></asset-insurance>

这样,组件运行没有问题,我可以按我应该的方式声明对象。 :)

谢谢你,埃斯图斯。

【讨论】:

  • 通常你可以只定义初始 asset: null 并执行 v-if="asset" 而不复制资产对象的整个结构,这取决于它在组件的其余部分中的使用方式
猜你喜欢
  • 2021-11-04
  • 1970-01-01
  • 2017-09-01
  • 2015-11-02
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
相关资源
最近更新 更多