董路飞
董路飞
  • 发布:2023-07-02 15:44
  • 更新:2025-04-22 19:33
  • 阅读:4392

uni.$emit() 和uni.$on() 怎么没反应,失效了还是我写的不对?

分类:uni-app

我在 A 页面代码:

<script setup>  
    const toB= (url) => {  
        if (url) {  
                        uni.$emit('dataChanged',{msg:'页面更新'})  
            uni.navigateTo({  
                 url: `../h5/h5`,  
                complete: (e) => {  
                    console.log("跳转 B 页: ", e)  
                }  
            })  
        } else {  
                    //      ...  
        }  
    }  
</script>

B 页面代码:

<script setup>  
    import { onLoad } from "@dcloudio/uni-app"  

    // 页面生命周期  
    onLoad((e) => {  
               // console.log("【这里正常输出】:")  
        uni.$on("dataChanged", function (data) {  
            console.log("【这里不触发】:" + data)  
        })  

    })  

</script>
2023-07-02 15:44 负责人:无 分享
已邀请:

最佳回复

DCloud_UNI_OttoJi

DCloud_UNI_OttoJi - 日常回复 uni-app/x 问题,如果艾特我没看到,请主动私信

这里我补充了 demo 演示了 pages/index -> pages/about 页面跳转过程中发送信息的处理方案。https://gitcode.net/xiurensha5731/uni-app-questions/-/blob/q/api-emit/src/pages/index/index.vue 如有问题请开新帖艾特我沟通


index

<template>  
  <div>  
    <div>index page</div>  

    <button @tap="go">Go to About</button>  
    <!-- <navigator url="/pages/about/index">  
    </navigator> -->  
  </div>  
</template>  
<script lang="ts" setup>  
import { onLoad, onUnload } from "@dcloudio/uni-app";  

// 这里演示,从 index 跳转到 about 时候,传递信息  
const go = () => {  
  uni.navigateTo({  
    url: "/pages/about/index?msg=hello",  
  });  
};  

onLoad(() => {  
  // 思路是先发注册监听、再发送信息。此时 page2  
  // 跳转后之后才会激活页面,才会收到 on 事件  
  uni.$on("page2Ready", function (data) {  
    console.log("page1 收到 page2 发过来的信息", data);  
    uni.$emit("update", { msg: "页面更新" });  
  });  
});  

onUnload(() => {  
  uni.$off("page2Ready");  
});  
</script>  

<style></style>

和 about

<template>  
  <div>about page</div>  
  <div>  
    收到的信息:  
    {{ message }}  
  </div>  
</template>  
<script lang="ts" setup>  
import { onLoad, onUnload } from "@dcloudio/uni-app";  
import { ref } from "vue";  

// 思路是先发注册监听、再告诉上一个页面准备好了  

const message = ref("");  

onLoad(() => {  
  uni.$on("update", function (data) {  
    console.log("page2 监听到事件来自 update ,携带参数 msg 为:" + data.msg);  
    message.value = data.msg;  
  });  
  uni.$emit("page2Ready", { msg: "page2 准备好了,你发送吧" });  
});  
onUnload(() => {  
  uni.$off("update");  
});  
</script>  
banro

banro

uni.$emit('dataChanged',{msg:'页面更新'}) 放在 complete 里试试

  • 董路飞 (作者)

    后面试过,又出现别的问题。

    uni.$emit 放在 navigateTo 的 complete 里。第一次A跳B,在B页面也不触发,但是此时B页面返回A页面,再跳B页面就触发1次,再返回A页面跳B页面就触发2次,次数以此类推(我已经在生命周期函数onUnload 或 onHide里用 uni.$off移除监听了还是一样 )

    2023-07-02 16:28

百年蜜蜂

百年蜜蜂 - 牛马程序猿

根据官方文档 https://uniapp.dcloud.net.cn/api/window/communication.html
底部最后一行说明:

注意 uni.$on 定义完成后才能接收到 uni.$emit 传递的数据

故,要先定义$on才能再调用$emit!

对于要从A跳转到B页面,且需要从A传参到B页面的需求,文章 https://blog.csdn.net/a666666000/article/details/126749486 给出了2个解决方案。

解决办法(1):嵌套写法
解决办法(2):用定时器延迟$emit的使用
附解决办法(3):使用 uni.getStorageSync

昭昭L

昭昭L - 开心就好

用页面跳转的events,uni.emit你这种场景不适用

要回复问题请先登录注册