【项目实践-04】实验室移动端:对象添加新属性+webview IOS端appendJsFile()方法不生效

一、vue2对象添加新属性

在做实验室移动端时有这样一个需求,即获取下级页面的数据 (toChooseDevice()),为当前页面中的form表单数据添加新的属性和值,然后表单完成后进行提交(submitForm())操作

javascript 复制代码
toChooseDevice(str) {
				uni.navigateTo({
					url: `/pages/lab/lab-choose-device?labId=${this.form.labId}&deviceIds=${this.form[str]}`,
					// url: `/pages/lab/lab-choose-device?deviceIds=${this.form[str]}`,
					events: {
						// 获取下级页面传递回来的参数
						getSelectDevice: data => {
							let selectedDeviceIds = []
							let selectedDeviceNames = []
							JSON.parse(data).forEach(i => {
								selectedDeviceIds.push(JSON.parse(i).deviceId)
								selectedDeviceNames.push(JSON.parse(i).deviceName)
							})
                          // this.form[str] = selectedDeviceIds.toString()
                            this.form.test = '123456'
							this.$set(this.form, str, selectedDeviceIds.toString())
							this[str + 'Name'] = selectedDeviceNames.toString()
						}
					}
				})
			}


submitForm(form) {
				console.log(this.form);
				const data = {
					formData: this.form,
					key: 'share_appointment',
					startUserInfo: {
						name: this.user.nickname,
						id: this.user.id,
					}
				}
				getLabAppointmentApi(data).then(res => {
					this.$refs.uToast.show({
						message: '预约成功',
						duration: 1000,
						complete() {
							uni.$u.route({
								url: '/pages/lab/lab-reserve'
							})
						}
					})
				})
			},

遇到问题:在获取下级页面数据为form赋值时,如果使用

this.formstr = selectedDeviceIds.toString(),在提交表单时打印form时发现新的属性和数据并没有添加成功。但使用 this.form.test = '123456',test属性添加成功了。

原因 :vue2的响应式并不是很完美,使用 变量str 作为from属性并为其赋值时,并不会触发vue2的Object.defineproperty()方法,所以不会赋值成功,只有用 this.form.属性 才可触发此方法并赋值成功。

解决 :为了解决这个问题,我们可以使用 **this.$set(obj, 'newProp', 'newValue')**方法,强制触发响应式更新

就像上述代码中的 this.$set(this.form, str, selectedDeviceIds.toString())

二、uniapp app端 html5+ webview ios端appendJsFile不生效

**遇到问题:**在项目中需要使用 webview 来获取网页上的信息并实现当前页面与网页的通讯以及交互 ,但如下代码在IOS端并未建立起当前页面和网页的通讯,在安卓端却能正常通讯及交互。

javascript 复制代码
                var currentWebview = this.$scope.$getAppWebview() //此对象相当于html5plus里的plus.webview.currentWebview()。在uni-app里vue页面直接使用plus.webview.currentWebview()无效
				wv = currentWebview.children()[0]
                wv.addEventListener("loaded", () => {
					console.log('加载完成');
					this.getImg() // 加载完成后获取一次验证码图片,但可能获取为空
				}, false);
				wv.setJsFile("static/uni.webview.1.5.5.js")
				wv.appendJsFile("static/post.js")

原因: 参考了此文章 uniapp app html5+ webview ios端appendJsFile不生效_h5+app webview appendjsfile在华为可以小米不行-CSDN博客

  1. 文件地址要写正确,webview所加的 js 文件应写在 static 目录下

  2. 在 IOS 端 appendJsFile() 操作应放在监听 loaded 事件之后;

  3. wv.appendJsFile("_www/static/post.js"),地址默认要带上 '_www'

成功解决:

javascript 复制代码
                var currentWebview = this.$scope.$getAppWebview() //此对象相当于html5plus里的plus.webview.currentWebview()。在uni-app里vue页面直接使用plus.webview.currentWebview()无效
				wv = currentWebview.children()[0]
				wv.addEventListener("loaded", () => {
					wv.setJsFile("_www/static/uni.webview.1.5.5.js")
					wv.appendJsFile("_www/static/post.js")
					console.log('加载完成');
					this.getImg() // 加载完成后获取一次验证码图片,但可能获取为空
				}, false);
相关推荐
结网的兔子19 小时前
【前端开发】Web端迁移至 uni-app 及鸿蒙扩展方案对比
前端·uni-app·harmonyos
2501_9159090619 小时前
iOS 应用反调试技详解术 检测调试器的原理与防护实践
android·ios·小程序·https·uni-app·iphone·webview
AI多Agent协作实战派1 天前
AI多Agent协作系统实战(二十八):顶栏统一战争——从1个页面异常到31个页面全量对齐
数据库·人工智能·uni-app
00后程序员张1 天前
iOS加固技术路线全面解析:Bitcode模式、源码模式与汇编模式对比及爱加密优势
android·汇编·ios·小程序·uni-app·cocoa·iphone
2501_916008892 天前
iOS IPA文件反编译与打包操作方法,拆包分析防护和加固打包
android·macos·ios·小程序·uni-app·cocoa·iphone
name好难取诶2 天前
通过对云基座和离线基座的对比,帮助开发者理解如何在不同场景下选择合适的打包方案。 什么是“基座” 在 UniApp 中,基座(也称“ ...
开发语言·uni-app·php
2501_915921432 天前
iOS手游安全反外挂解决方案:基于Xcode的加固混淆特色详解
android·安全·ios·小程序·uni-app·iphone·xcode
2501_916007472 天前
iOS App分发教程 App Store、TestFlight 与 Ad Hoc 的配置与上传方法
android·ios·小程序·https·uni-app·iphone·webview
qq_316837752 天前
uniapp 打包APP 使用 Galacean Effects 的特效
uni-app
古韵3 天前
你的 uni-app 分页,一个 hook 搞定竞态和加载
javascript·vue.js·uni-app