You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js中通过Prop数组将自定义事件传递回子组件的问题

我瞅了下你的代码,问题出在两个地方——根组件更新数据的逻辑不对,还有子组件没响应prop的变化。咱们一步步来修复:

1. 修正根组件的更新逻辑

你在根组件的upDateTime方法里写了this.currentDT = update,但根组件的data里根本没有currentDT这个变量!你的时间数据存在barData[0].currentDT里,得更新这个值才行:

// 根组件的methods部分
methods: {
  upDateTime: function (update){
    // 直接更新barData数组对象里的currentDT字段
    this.barData[0].currentDT = update;
  }
}

2. 让子组件响应prop的变化

子组件的currentTime是在data里初始化的,但data只会在组件创建时赋值一次,之后barData变化了,currentTime不会自动同步。这里有两种简单的解决办法:

办法一:用计算属性替代data变量

直接把currentTime改成计算属性,它会自动依赖barData的变化同步更新:

// 子组件的script部分,删掉data里的currentTime,换成computed
export default {
  props: { barData: Array },
  data() {
    return {
      callNow: this.barData[0].callNow,
    }
  },
  computed: {
    currentTime() {
      return this.barData[0].currentDT;
    }
  },
  // 原有的methods保留
  methods: {
    update: function () {
      const today = new Date();
      const date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
      const time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
      const dateTime = date + ' ' + time;
      this.$emit('newDateTime', dateTime)
    }
  },
}

办法二:监听barData的变化手动更新

如果一定要用data里的变量,可以添加一个深度监听器:

// 子组件的script部分
export default {
  props: { barData: Array },
  data() {
    return {
      callNow: this.barData[0].callNow,
      currentTime: this.barData[0].currentDT,
    }
  },
  watch: {
    barData: {
      deep: true, // 因为是嵌套的数组对象,需要开启深度监听
      handler(newVal) {
        this.currentTime = newVal[0].currentDT;
        this.callNow = newVal[0].callNow; // 如果callNow后续也需要更新的话
      }
    }
  },
  // 原有的methods保留
  methods: { /* ... */ }
}

另外提个小细节:你子组件的template里多了一个多余的</div>,记得删掉,避免DOM结构异常。

这样改完之后,点击按钮触发自定义事件,根组件更新barData,子组件就能同步显示最新的时间啦!

内容的提问来源于stack exchange,提问作者timv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:52:45