uni.chooseImage选取图片造成应用刷新的问题

在uniapp 做选择文件的功能 有部分手机选择完后 会触发生命周期里的方法 会造成页面数据重新渲染,数据更新,造成图片选择不成功等问题,防止这种做法 我们有两种方式

一. 不要在onshow生命周期填写相关的函数操作,在onload做函数处理,不过这个方法有个弊端 就是当这个页面不是二级页面,就没有办法进行数据的实时更新,必须退出应用才会重新更新数据,不然就是一直读取之前onload请求的数据

二. 通过定义一个布尔值来判断是否为选择图片,因为的话,选择图片虽然会触发onshow方法,但不会把data的数据给重置了,所以这里我们还是可以拿到对应的数据

1.在data里定义一个布尔值,默认为false;

data() {
	return {
		isChoseImg: false
	}
},

2.在onshow生命周期里面加上一个条件判断,判断是否为选择图片触发,还是页面打开触发

onShow: function() {
	if (!this.isChoseImg) {
		const token = uni.getStorageSync('token')
		if (token) {
			this.getInfo()
		} else {
			const routes = getCurrentPages();
			const curRoute = routes[routes.length - 1].route
			if (curRoute !== 'pages/Login/Login') {
				uni.navigateTo({
					url: 'pages/Login/Login'
				})
			}
		}
	}
},

3.在选择文件的函数做一下布尔处理,在触发这个函数的时候,把状态改为true,表示已经开始选择中,页面不可触发onshow方法。然后在选择成功和取消选择两个行为中把状态改为false,表示选择已经结束,页面可以触发onshow方法

upload(type) {
	this.isChoseImg = true
	uni.chooseImage({
		count: 1,
		sizeType: ['original', 'compressed'],
		sourceType: ['album'],
		success: (res) => {
			this.isChoseImg = false
			uni.uploadFile({
				url: 'https://file.cs08.cn/file/uploadUtil',
				header: {
					"Token": this.userToken
				},
				filePath: res.tempFilePaths[0],
				name: 'file',
				success: res => {
					let data = JSON.parse(res.data) //返回的是字符串,需要转成对象格式,打印data如下图
					if (data.code == 200) {
						if (type == 'photo') {
							this.$set(this.formData, 'DoctorImgUrl', data.data.url)
						}
					} else {
						uni.showToast({
							icon: 'none',
							title: data.msg
						})
					}

				},
				fail: () => {}
			})
		}
	})
},