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
此时可正常使用~
更多推荐
已为社区贡献3条内容
所有评论(0)