You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Vue Event Bus无法向组件传递数据问题排查求助

Vue Event Bus 数据传递失败排查与修复方案

嘿,我帮你梳理了代码里的几个关键问题,咱们一步步来解决:

1. 异步请求导致事件发送时机错误

你的app.js里,getPage方法中的axios.get是异步操作,但你把$emit写在了请求回调的外面——这时候请求还没完成,this.pageData还是初始的空数组,子组件自然拿不到有效数据!

修复方法:把$emit移到axios的then回调内部,确保数据更新后再发送事件,同时修正pageData的赋值逻辑(原来的写法会覆盖数组,导致只保留最后一条数据):

methods: {
  getPage: function(){
    var slug = this.$route.fullPath.replace(/\//g, "")
    axios.get(uptheme.pages_rest_url+'?slug='+ slug)
    .then( (response) => {
      console.log(response.data);
      // 先重置数据,避免多次路由切换残留旧数据
      this.pageData = [];
      this.feedImg = [];
      
      response.data.forEach( (item, i) => {
        this.pageData.push(item); // 用push而非直接赋值,保留所有返回数据
        if( item.embedded.gallery_images ){
          item.embedded.gallery_images.forEach( (img) => {
            this.feedImg.push(img);
          });
        }
      });
      
      // 数据更新完成后,再发送事件给子组件
      this.$eventHub.$emit('page_data', this.pageData);
      // 同时传递feedImg数据
      this.$eventHub.$emit('feed_img', this.feedImg);
    });
  },
}

2. 子组件的事件监听与数据处理问题

(1)未绑定this导致事件无法解绑

components.jsbeforeDestroy钩子中,你直接写了$eventHub.$off('page_data');,这里的$eventHub没有加this.,会找不到全局实例,无法正确解绑事件,可能造成内存泄漏。

修复

beforeDestroy() {
  this.$eventHub.$off('page_data');
  this.$eventHub.$off('feed_img'); // 同时解绑feedImg的监听
}

(2)数组赋值导致二维数组问题

子组件里用this.pageData.push(data);,但data本身就是一个数组(主实例的pageData是数组),这会让子组件的pageData变成[[item]]这种二维数组,导致v-for渲染异常。

修复:直接替换数组或者展开后push:

created() {
  this.$eventHub.$on('page_data', (data) => {
    console.log(data);
    // 直接替换数组,避免二维结构
    this.pageData = [...data];
  });
  // 新增feedImg的事件监听
  this.$eventHub.$on('feed_img', (imgData) => {
    this.feedImg = [...imgData];
  });
},

3. 额外优化建议

  • 全局事件总线可以单独创建,写法更清晰:
    // app.js开头
    window.$eventHub = new Vue();
    // 组件里直接用window.$eventHub或this.$eventHub都可
    
  • 可以在子组件的created钩子中打印console.log(this.$eventHub),确认全局实例是否正常挂载,排除实例不存在的问题。

验证步骤

  1. 按上述修改调整代码;
  2. 打开浏览器控制台,查看主实例中axios返回的response.data是否正确;
  3. 检查子组件监听事件打印的data是否和主实例的pageData一致;
  4. 确认模板中的v-for能正常渲染页面内容。

这样调整后,子组件应该就能正常接收并渲染数据了!

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

火山引擎 最新活动