uniapp在不同页面间跳转时使用$emit和$on传值无效问题(记录坑)

这篇具有很好参考价值的文章主要介绍了uniapp在不同页面间跳转时使用$emit和$on传值无效问题(记录坑)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、需求是这样的:

uni.$emit和uni.$on的跨页传值,正在踩坑,uni-app,前端

现在需要点击首页循环出来的列表中其中一项,点击后我们要让他带着参数跳转到另外一个页面。因为列表中的数据都是用v-for循环出来的,所以点击每项传递的参数都是不同的。

1、用uni.navigateTo中的url拼接传参

此时假设我们用到的页面跳转方式是uni.navigateTo,如果要带参数跳转,那么可以在url的后面拼接上我们需要的参数就行,如下面代码段所示

//在首页传递参数
uni.navigateTo({
					url: `/subPackages/foodsafety/safetyTrainRules?id=${id}`,
					animationType: 'pop-in',
					animationDuration: 300
				});
//在跳转页面接收参数
onLoad(data){
            console.log(data)
            }

但是现在的传参仅限于比较短的参数,太长的参数用拼接的方法会传递失败,因为这种方法有长度限制。

所以假如现在我们需要传递一个很长的富文本参数就不能再使用上面的这个方法了,需要采取另外一个方法:

2、长参数或者对象等用uni.$emit()和uni.$on()传递参数

uni.$emit('data',data)
uni.$on('data',function(data){})

uni.$emit和uni.$on都是uniapp官方提供的api,可以用来跨页面、跨组件通讯

这次想记录也就是因为在这里碰到了坑!原本我以为只要按着这个顺序用下来就好了,在首页用$emit传参数,在跳转的页面用$on接收参数就行了,结果就是我天真了

  1. 首先碰到的第一个问题,是关于在uni.$on()中的回调函数的指向问题,如果这样写(在文中跳转的页面就是接收参数的页面)

    //跳转的页面中
    export default {
    		data() {
    			return {
    				content: ''
    }
    },
    onLoad(){
         uni.$on('data',function(data){ 
         console.log(this.content) //undefined
    })
    }
    }

    在控制台中会打印undefined,这是因为此时this的指向不对
    解决办法(1): 改成箭头函数以后就就能解决了

    //跳转的页面中
    export default {
    		data() {
    			return {
    				content: '1'
    }
    },
    onLoad(){
         uni.$on('data',(data)=>{ 
         console.log(this.content) //1
    })
    }
    }


    解决办法(2):
    既然知道是this指向问题,那就把我们需要的this给“请”进去就好了

    //跳转的页面中
    export default {
    		data() {
    			return {
    				content: '1'
    }
    },
    onLoad(){
    let that = this
         uni.$on('data',function(data){ 
         console.log(that.content) //1
    })
    }
    }
  2. 第二个问题就是$emit和$on定义顺序问题

     uni.$emit和uni.$on的跨页传值,正在踩坑,uni-app,前端

    在用$emit携带参数跨页面时,在跳转的页面里面发现第一次进入的时候并没有触发uni.$on(看控制台打印得知,第一次进入的时候不打印,回退到原来的页面后再次点击进入跳转页面打印),这就是因为uni.$on还没有定义完成,因此也就没有接收到$emit传递的数据(之前都没有打开过的页面怎么可能定义好啊喂!),下面提供两种解决方法

    第一次跳转不生效写法

    //首页
    uni.$emit('richtext', content)
    //跳转页面
    	uni.$on('richtext', (data) => {
    				console.log(data);		
    			})

        解决办法(1):嵌套写法

//在首页中

uni.$on('richtext1', function() {
					uni.$emit('richtext', content)

				})
//在要跳转入的页面中

uni.$on('richtext', (data) => {
				console.log(data);
			})
			uni.$emit('richtext1')

        解决办法(2):用定时器延迟$emit的使用文章来源地址https://www.toymoban.com/news/detail-632050.html

//首页
setTimeout(()=>{
					uni.$emit('richtext', content)
				},300)
//跳转页面
	uni.$on('richtext', (data) => {
				console.log(data);		
			})

总之有遇到这个问题的一般是用的navigateTo带参数去跳转页面,后面稍微查了一下有两个跳转是可以正常用$emit和$on去传值的,不会出这么多幺蛾子 1.uni.switchTab, 2.uni.navigateBack

上文这些方法都是自己有试过的,心得就是this指向还是得多加理解 最后就是一定要记得在离开页面后移除监听事件!!

//跳转的页面中
onUnload() {
			uni.$off('data')
		},

到了这里,关于uniapp在不同页面间跳转时使用$emit和$on传值无效问题(记录坑)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序页面跳转时URL获取不到参数

    原因: 在跳转的url参数中添加了包含特殊字符?的情况下 ,会出现参数丢失的情况 1.最近在小程序开发过程中,发现之前可用的某个功能字段展示为了undefined,后来查看参数发现 页面跳转时参数丢失了 导致的 此时获取到的参数都是正常的,在上线一段时间后,其它同学在 图

    2024年02月11日
    浏览(68)
  • Vue3 - 实现路由 “新开一页“ 进行页面跳转功能,Router 路由跳转时在新窗口打开页面(网站跳转页面时浏览器新开页签打开网页,支持在页面、纯 js/ts 文件中使用,详细示例代码教程)

    网上这方面教程很少,本文提供多种解决方案,适用于任何场景。 本文 实现了在 vue3 项目开发中,当页面跳转时浏览器打开新窗口(新页签)跳转,Router 路由跳转并新开一页教程, 无论您是在普通页面、纯 js/ts 文件中,都可以使用, 如下图所示,当执行路由跳转时浏览器

    2024年02月03日
    浏览(66)
  • Vue 解决route-link路由跳转时页面不刷新问题

    1.分析 在使用route-link跳转路由时,每次跳转,页面都不会刷新。是因为路由跳转并非页面刷新,而我们获取数据的方法都是写在created钩子函数中,所以,created并不会每次都执行,从而导致页面数据没有刷新。 2.解决方法 在router-view标签中加入:key=\\\"$route.fullPath\\\"即可

    2024年02月11日
    浏览(38)
  • [uniapp页面路由跳转]详细讲解uniapp中使用标签和的api完成页面跳转使用方法 代码注释

    Uniapp是一款基于Vue.js的跨平台开发框架,允许开发者使用同一套代码构建多个平台的应用程序,包括iOS、Android、Web、微信小程序、支付宝小程序、百度小程序、头条小程序等。在Uniapp中,页面跳转是非常重要的功能之一,本文将详细介绍Uniapp中页面跳转的各种标签和API的使用

    2024年02月20日
    浏览(54)
  • uniapp小程序路由跳转,使用uni.navigateBack方法,实现页面返回上一页

    在小程序中uni.navigateTo和uni.redirectTo是通过路由拼接的方式传参 uni.navigateBack() 是一个用于在uni-app中进行页面后退操作的API。它可以让你返回到上一个页面。在给定的示例中,uni.navigateBack() 被调用并传入了一个对象作为参数。该对象具有一个属性 delta,用于指定要后退的页面

    2024年04月28日
    浏览(46)
  • 微信小程序跳转页面的不同方法

    微信小程序如何进行页面切换呢? 1.对于tabbar页面的跳转 (若不明白tabbar可自行百度) 使用 switchTab 进行跳转 在wxml中输入 navigator url=\\\"/pages/message/message\\\" open-type=\\\"switchTab\\\"非tabbar页面的跳转/navigator 其中/pages/message/message是跳转的地址,跳转方式是switchTab 2.对于非tabbar页面的跳转

    2024年02月15日
    浏览(42)
  • Flutter 应用间跳转应用,实现唤起第三方App

    最近因为工作需求,做了应用间跳转应用,因为是一个flutter新手,所以在工作之余随便总结记录一下。 1.使用第三方用户登录,跳转到需授权的App。如QQ登录,微信登录等。需要用户授权,还需要\\\"返回到调用的程序,同时返回授权的用户名、密码\\\"。 2.应用程序推广,跳转到

    2024年02月05日
    浏览(69)
  • 【HarmonyOS】服务卡片 API6 JSUI跳转不同页面

    【引言】 “JS卡片支持为组件设置action,包括router事件和message事件,其中router事件用于应用跳。若设置router事件,则action属性值为\\\"router\\\";abilityName为卡片提供方应用的跳转目标Ability名;params中的值按需填写,其值在使用时通过intent.getStringParam(\\\"params\\\")获取即可;”这一段是

    2024年02月12日
    浏览(43)
  • 【HarmonyOS】服务卡片 API6 JSUI跳转不同页面并携带参数

     【】 服务卡片、卡片跳转不同页面、卡片跳转页面携带参数 【写在前面】           本篇文章主要介绍开发服务卡片时,如何实现卡片点击跳转不同页面,并携带动态参数到js页面。在此篇文章“服务卡片 API6 JSUI跳转不同页面”中说明了如果跳转不同页面,这里在

    2024年02月06日
    浏览(44)
  • uniapp小程序跳转到外部页面

    方案1 使用uni-app的扩展组件 uni-link ,使用参考文档uni-app官网 该组件的行为是在app内打开外部浏览器,在h5打开新网页。 方案2: 通过先跳转到web-view页面,通过web-view这个标签进行动态绑定接收来的有效可访问网址,即可实现跳转功能 在pages中新建一个webview页面 如下。 然后

    2024年02月11日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包