消息总线
类似于vue-bus和vue-happy-bus。
使用:
发送事件并传递消息:
uni.$emit('update', { msg: '页面更新' })
监听事件并获取消息(通常在页面的onLoad或created中):
created() {uni.$on('update',function(data){console.log('监听到事件来自 update ,携带参数 msg 为:' + data.msg);})},
移出事件监听(通常在页面的onUnload或destroyed中):
onUnload() {uni.$off('login')},
如果只想要监听一次,可以使用uni.$once
uni.$once('update',function(data){console.log('监听到事件来自 update ,携带参数 msg 为:' + data.msg);})
一次性的事件,直接使用uni.$once监听,不需要移除。
如果页面没有打开,将不能 注册监听事件uni.$on和uni.$once。
参考:
页面返回时传值
假如从B页面返回A页面,小程序中的写法是:
var pages = getCurrentPages();var prevPage = pages[pages.length - 2]; //上一个页面prevPage.setData({mdata: 1})
经过测试,在uniapp中使用B页面使用setData设置A页面参数无法实现(应该是被更改为常量属性了)。
方法一:调用前一个页面的生命周期
A页面的生命周期:
onHide: ƒ ()onLoad: ƒ ()onReady: ƒ ()onResize: ƒ ()onRouteEnd: ƒ ()onShow: ƒ ()onUnload: ƒ ()
B页面传递:
let object={sx1:"参数1",sx2:"参数2",}prevPage.onShow(object);uni.navigateBack();
A页面接收参数:
onShow(object){if(!!object){this.object = objectconsole.log(object)}}
方法二:调用前一个页面的方法
B页面传递:
let object= {sx1:"参数1",sx2:"参数2",}prevPage.$vm.setData(object); // 重点$vmuni.navigateBack();
A页面接收参数:
export default {methods: {setData(object){if(!!object){this.object = objectconsole.log(object)}}}}
参考资料:uni.navigateBack()返回时传递参数,最简单的办法!
方法三:修改前一个页面的数据
可以直接通过$vm修改上一个页面的数据:
let pages = getCurrentPages() // 获取路由栈let prevPage = pages[pages.length - 2] // 上一页面prevPage.$vm.from = 'index'uni.navigateBack()
