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

本文介绍了在uniapp中遇到的两个技术问题:一是使用异步api导致页面栈异常,通过将方法异步化解决了此问题;二是H5与App端属性访问差异,通过使用$vm解决在App端找不到属性的问题。这两个案例展示了uniapp在不同平台上的兼容性和异步处理的重要性。
摘要由CSDN通过智能技术生成

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

此时可正常使用~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值