uni-app 通过分享朋友的卡片进入小程序 主页面引入子组件 主页面通过uni.$emit传输的值 子组件通过uni.$on收不到

uni-app 通过分享朋友的卡片进入小程序 主页面引入子组件 主页面通过uni.$emit传输的值 子组件通过uni.$on收不到

类别 信息
产品分类 uniapp/小程序/微信
PC开发环境操作系统 Mac
操作系统版本号 14.4.1 (23E224)
HBuilderX类型 正式
HBuilderX版本号 3.99
第三方开发者工具版本号 1.06.2306020
基础库版本号 2.21.4
项目创建方式 HBuilderX

操作步骤:

  • 直播间内通过分享直播间给朋友,然后通过分享到的卡片进去直播间内,第一次进入OK,然后右上角关闭,再次进入就收不到了。

预期结果:

  • 通过子组件的uni.$on能接收到主页面的uni.$emit传输的值

实际结果:

  • 通过子组件的uni.$on监听不到到主页面的uni.$emit传输的值;但是正常从小程序入口进入直播间内,正常是可以监听到的,但是通过分享给朋友的这种卡片形式进入的直播间内就监听不到了。

bug描述:

  • A页面引入B组件,A页面通过uni.$emit 传输的对象, uni.$on收不到。

更多关于uni-app 通过分享朋友的卡片进入小程序 主页面引入子组件 主页面通过uni.$emit传输的值 子组件通过uni.$on收不到的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app 通过分享朋友的卡片进入小程序 主页面引入子组件 主页面通过uni.$emit传输的值 子组件通过uni.$on收不到的实战教程也可以访问 https://www.itying.com/category-93-b0.html


uni-app 中,通过 uni.$emituni.$on 进行跨页面或组件的通信时,可能会遇到子组件无法接收到主页面通过 uni.$emit 发送的消息的情况。以下是一些可能的原因及解决办法:

1. 事件监听时机问题

子组件需要在 uni.$emit 执行之前就已经注册了事件监听器。如果子组件的 uni.$onuni.$emit 之后才执行,那么它将无法接收到事件。

解决办法: 确保子组件在 uni.$emit 之前已经注册了事件监听器。可以在子组件的 createdmounted 生命周期钩子中注册事件监听器。

// 子组件
export default {
  created() {
    uni.$on('myEvent', (data) => {
      console.log('接收到数据:', data);
    });
  },
  beforeDestroy() {
    uni.$off('myEvent'); // 防止内存泄漏
  }
};

2. 事件名称不一致

uni.$emituni.$on 的事件名称必须完全一致,包括大小写。

解决办法: 确保 uni.$emituni.$on 使用的事件名称完全相同。

// 主页面
uni.$emit('myEvent', { message: 'Hello World' });

// 子组件
uni.$on('myEvent', (data) => {
  console.log('接收到数据:', data);
});

3. 子组件未正确挂载

如果子组件未正确挂载或被销毁,那么它可能无法接收到事件。

解决办法: 确保子组件在事件触发时已经挂载并且没有被销毁。

4. 作用域问题

uni.$emituni.$on 是全局事件,因此它们可以在任何页面或组件中使用。但如果子组件和主页面不在同一个页面或组件树中,可能会导致事件无法正常传递。

解决办法: 确保子组件和主页面在同一个页面或组件树中。

5. 生命周期问题

如果 uni.$emit 在子组件的生命周期钩子之前执行,子组件将无法接收到事件。

解决办法: 可以将 uni.$emit 放在 mountedonLoad 等生命周期钩子中,确保子组件已经挂载。

6. 事件未正确销毁

如果在组件销毁时没有正确移除事件监听器,可能会导致内存泄漏。

解决办法: 在子组件的 beforeDestroyonUnload 生命周期钩子中移除事件监听器。

// 子组件
export default {
  created() {
    uni.$on('myEvent', this.handleEvent);
  },
  beforeDestroy() {
    uni.$off('myEvent', this.handleEvent);
  },
  methods: {
    handleEvent(data) {
      console.log('接收到数据:', data);
    }
  }
};

7. 小程序分享卡片进入时的生命周期问题

如果通过分享卡片进入小程序,可能会遇到生命周期钩子执行顺序的问题,导致 uni.$on 未及时注册。

解决办法: 可以在 onLoadonShow 中注册事件监听器,确保在页面显示时已经注册。

// 子组件
export default {
  onShow() {
    uni.$on('myEvent', this.handleEvent);
  },
  onHide() {
    uni.$off('myEvent', this.handleEvent);
  },
  methods: {
    handleEvent(data) {
      console.log('接收到数据:', data);
    }
  }
};
回到顶部