Vue.js 子组件未更新

Posted

技术标签:

【中文标题】Vue.js 子组件未更新【英文标题】:Vue.js child component not updated 【发布时间】:2019-10-05 23:05:42 【问题描述】:

我有 3 个 vue.js 嵌套组件:主、父、子。

父组件加载基本数据,子组件是一个简单的倒计时小部件,只需要配置一个数据。

如果我使用静态数据(IE 截止日期 ='2019-12-12')设置父脚本,则子显示小部件运行良好,但如果我使用动态数据,则会产生错误。

我正在使用 computed 将数据传递给子组件,如果我使用警报对其进行调试,我会看到 2 个警报:undefined,然后是正确的日期。

问题是第一个计算数据(undefined)使小部件崩溃,那么如何使用更新(加载)的数据创建子组件?

父模板

<template>
   <div>
    <flip-countdown :deadline=deadline></flip-countdown>
   </div>
</template>

父脚本需要修复

export default 
    components: FlipCountdown,

    props: ['event'],

    computed: 

        deadline: function () 
            if (typeof(this.event.date)!="undefined") 
                //alert(this.event.date)
                return this.event.date;
             else 
                return "2019-05-21 00:00:00";
            
        ,
    ,

子模板有效

<template>
  <div>
      <flip-countdown :deadline="deadline"></flip-countdown>
  </div>
</template>

【问题讨论】:

您的父模板和子模板看起来完全一样,只是您忘记了deadline=deadline 中的双引号(应该是deadline="deadline")。另外,为了防止deadline 出错时出错,您可以将v-if="deadline" 添加到您的&lt;flip-countdown&gt; 谢谢,指令 v-if="deadline" 这是一个很好的修复。我使用了两个非常相似的组件来在一个地方拥有一个完整的组件。顺便说一句,我会更改名称以避免错误。使用指令 v-if 我将删除所有计算值。感谢您的建议。 【参考方案1】:

在挂载的生命周期钩子触发之前,您的父组件将 deadline 传递给其子组件。您的子组件将其deadline 设置为未定义的初始值。

您应该将deadline 设为子组件中的计算属性:

computed: 
  internalDeadline() 
    return this.deadline; // comming from props
  

然后你可以在孩子中使用internalDeadline


或者,您可以等到定义 deadline 后再渲染子组件:

<flip-countdown v-if="deadline !== undefined" :deadline="deadline"></flip-countdown>

【讨论】:

谢谢!我也有同样的问题将计算值移动到孩子。所以我更喜欢使用 v-if 指令。更少的代码。感谢您的帮助!

以上是关于Vue.js 子组件未更新的主要内容,如果未能解决你的问题,请参考以下文章

数据未从 Vue.js 中的子组件发送到父组件

如何使用 Vue.js 在父组件中更新子组件中的数据?

Vue js 子组件中未定义的道具。但仅在其脚本中

如何在 Vue JS 中将更新的值从父组件发送到子组件?

Vue.js 更新的属性不会在子组件上更改

通过 Laravel 中的 websocket 收到通知后,Vue.js 组件未更新