一、第一种情况,使用了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

此时可正常使用~

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐