uniapp 报错 Cannot read properties of undefined (reading ‘$vm‘) (页面栈丢失处理)

一、第一种情况,使用了uniapp的异步api

代码结构如下:

aaa(){
	let pages = getCurrentPages();
 	let prevPage = pages[pages.length - 2];
 	if(...){ 
		this.xxx()//调用方法
	}
	uni.navigateBack({})
}xxx(){
	let pages = getCurrentPages();
 	let prevPage = pages[pages.length - 2];
	xx(params).then(res=>{
	
	})
}
	

在xxx方法中 ,获取到的页面栈,将本页面销毁了(比pages少一页),原因为:
uni.navigateBack({})为异步方法,会在xxx()同步方法前调用,此时,页面栈就将本页面销毁了。

二、解决方法

将xxx方法异步化

使用es7的async和await,将方法异步化,并将aaa也加上async和await。类似:

async aaa(){
	let pages = getCurrentPages();
 	let prevPage = pages[pages.length - 2];
 	if(...){ 
		await this.xxx()//调用方法
	}
	uni.navigateBack({})
},
async xxx(){
	let pages = getCurrentPages();
 	let prevPage = pages[pages.length - 2];
	let { data:res } = await xx(params)
}

此时,xxx方法就与uni.navigateBack({})为一个任务队列,页面栈也不会丢失了。

三、第二种情况,在h5端能获取到属性,app端获取不到

代码如下:

let pages = getCurrentPages(); // 当前页,
let prevPage = pages[pages.length - 2]; // 上一页
//比如上一页有一个字符串name为2
//设置name属性为1
prevPage.name = 1;

在h5端不报错,可正常使用。
app端报错:

Property or method “toJSON” is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property.

排查问题是没有找到上一页的name属性,修改调用方式为prevPage.$vm.

//保持一致
let pages = getCurrentPages(); // 当前页,
let prevPage = pages[pages.length - 2]; // 上一页
//使用$vm方式来设置
prevPage.$vm.name = 1

此时可正常使用~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值