uniapp的navigateTo页面跳转参数传递问题

uniapp的navigateTo页面跳转参数传递问题

URL直接传递

例如:uni.navigateTo({ url: '/pages/salemanManage/my/myorder/particulars?id=' + this.orderInfo.id })
弊端:url有长度限制,太长的字符串会传递失败。
处理方式: 使用encodeURIComponent进行编码。
参数传递:先JSON再编码

detail(item) {
	uni.navigateTo({
		url: '/pages/salemanManage/homePage/salesReturn/detail?data=' + encodeURIComponent(JSON.stringify(item)),
	})
},

参数接收:先解码再JSON

onLoad(option) {
	this.dataList = JSON.parse(decodeURIComponent(option.data))
},

注意:如果传递参数的字符串中存在特殊字符(如 #,%,?,&,=),则在接收参数之前需要先处理特殊字符,将其改为十六进制,否则会报错
解决方法:
在methods中添加方法:

// 因为decodeURIComponent参数参数传递在接收时有特殊字符会报错,所以在接收前要处理特殊字符为十六进制
encodeSearchKey(key) {
	const encodeArr = [{
		code: '%',
		encode: '%25'
	},{
		code: '?',
		encode: '%3F'
	},{
		code: '#',
		encode: '%23'
	},{
		code: '&',
		encode: '%26'
	},{
		code: '=',
		encode: '%3D'
	}]
	return key.replace(/[%?#&=]/g, ($, index, str) => {
		for(const k of encodeArr) {
			if(k.code === $) {
				return k.encode
			}
			}
	})
},

在获取参数时:

onLoad(option) {
	// 处理特殊字符
	let options = this.encodeSearchKey(option.data)
	this.dataList = JSON.parse(decodeURIComponent(options))
},

使用eventChannel

传递参数时:

uni.navigateTo({
  url: 'pages/test?id=1',
  success: function(res) {
    // 通过eventChannel向被打开页面传送数据
    res.eventChannel.emit('变量参数名', { data: 'data from starter page' })
  }
})

获取参数时:

onLoad: function(option) {
  let self = this
  // APP-NVUE平台暂不支持以this.getOpenerEventChannel()方式获取eventChannel,请换用this.$scope.eventChannel来获取
  // #ifdef APP-NVUE
  const eventChannel = this.$scope.eventChannel; // 兼容APP-NVUE
  // #endif
  // #ifndef APP-NVUE
  const eventChannel = this.getOpenerEventChannel();
  // #endif
  // 监听acceptDataFromOpenerPage事件,获取上一页面通过eventChannel传送到当前页面的数据
  eventChannel.on('变量参数名', function(data) {
    console.log(data.data) // 'data from starter page'
    self.a = data.data
  })
}

弊端:页面刷新会数据丢失

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值