解决了。。。 根本原因是onDiscover()中的回调函数我没有定义在methods中,导致this出现了问题。
wx.NFCAdapter.onDiscovered()内部监听函数形成闭包?功能是nfc读取文本后传到后端进行识别跳转页面,现在识别的部分跑通了,但是测试下来发现onDiscovered里面的监听函数的this指向有问题?首次进入页面的时候修改data中的值可以触发watch监听,后续重新切换路由就不触发watch了。 之前试过在onDiscover中调请求方法,然后用this传参,发现也不对,一直沿用第一次成功的参数。 如下是代码截图,我是通过watch监听修改后调接口,然后实现页面跳转的 watch: { cleanedcodeDataVal: { // immediate:true, // deep:true, handler(nv, v){ console.log('cleanedcodeData发生了变化', nv, v); if (nv) { this.showNFC = false this.handleScanLinkToDetail(this.cleanedcodeData, this.actionSheetNfcData) this.cleanedcodeData = '' } else { console.log('cleanedcodeData新值为空', this.cleanedcodeData); } } }, }, handelNfc(item){ this.actionSheetNfcData = {} this.actionSheetNfcData = item this.showNFC = true // #ifdef MP-WEIXIN // 获取nfc实例 const self = this const contentDiscoverHandler = (res) => { const byteToString = function (arr) { if (typeof arr === 'string') { return arr; } var str = '', _arr = arr; for (var i = 0; i < _arr.length; i++) { var one = _arr[i].toString(2), v = one.match(/^1+?(?=0)/); if (v && one.length == 8) { var bytesLength = v[0].length; var store = _arr[i].toString(2).slice(7 - bytesLength); for (var st = 1; st < bytesLength; st++) { store += _arr[st + i].toString(2).slice(2); } str += String.fromCharCode(parseInt(store, 2)); i += bytesLength - 1; } else { str += String.fromCharCode(_arr[i]); } } return str; }; // console.log('查看nfc感应返回的callback',res.techs,this.nfc.tech); // if (res.techs.includes(this.nfc.tech.ndef)) { // console.log('符合nfc标准',res.messages) let cordsArray = res.messages[0].records; // 经常性1次成功,多次空值。所以需要排除 if (!cordsArray.length > 0) { return } // 准备处理后数据的容器 let read = {} cordsArray.find(item => { read.payload = byteToString(new Uint8Array(item.payload)); read.id = byteToString(new Uint8Array(item.id)); read.type = byteToString(new Uint8Array(item.type)); }); let code = read.payload // 去除乱码字符 let cleanedcode = code.replace(/[^\x20-\x7E]/g, ""); console.log('nfc读取后获得的code字段==', cleanedcode, this.cleanedcodeData); this.cleanedcodeData = cleanedcode self.cleanedcodeData = cleanedcode console.log('nfc读取后赋值==', this.cleanedcodeData); } this.nfc.onDiscovered(contentDiscoverHandler) this.nfc.startDiscovery({ fail(err) { console.log('failed to discover:', err) } }) // #endif }, async handleScanLinkToDetail(cleanedcodeData, item){ const payData = { // 如果是详情页的扫码感应,type为detail type: 'list', content_id: this.contentId, fkd_content_id: item.fkd_content_id, code: cleanedcodeData } console.log('请求前检查请求参数', payData); // 调取接口获得跳转到详情页所需的data_id await this.$http.get('content/scan-code', { params: payData }).then((res) => { if (!res.data.success) { // 业务失败,错误信息 uni.showToast({ title: res.data.message, icon: 'error' }) } console.log('请求成功返回==', res.data); const data_id = res.data.data.id if (data_id) { this.setLinkToContentName(item.label) // 请求成功获取到data_id,可以进行跳转 uni.navigateTo({ url: `/pages_1/contentInfo/contentInfo?content_id=${item.fkd_content_id || this.contentId}&data_id=${data_id}&menu_id=${this.menu_id}&parent_menu_id=${this.parent_menu_id}¶meter_value=${this.parameter_id}&isLinkTo=1` }); } }).catch((err) => { // 请求失败 // uni.showToast({ // icon:'error', // title:this.$t('common.failed') // }) }) }, [图片][图片]上面两张真机截图分别是第一次进入,感应成功后触发watch调用请求方法的截图和后续进入,数据赋值但是没有触发watch的情况
2023-11-27老哥,这个问题有解决吗?我遇到了一样的情况,第一次进入页面能修改this.data中的值,第二次就改不了了。折腾好久了
小程序内调用组件功能(如蓝牙识别,nfc读取)后,形成闭包并且无法获取this.data中的值?rt,应用环境如下:进入页面后调用api实例化nfc对象,代码截图:[图片] 红圈内的proofA()方法是nfc读卡流程,里面有大量异步回调流程,其中在成功识别nfc信息后,会setData()页面data中的属性值,如:setData({ code:...// }) 在proofA()方法内部打印that.data.code值正常,说明set流程有效。但是在onUnload()内部获取this.data.code就是空!我猜测是因为proofA()方法内部由于回调嵌套太深,导致形成了一个闭包环境,setData()流程外部无法获取。请问如何解决这个问题?
2023-11-20换成emit层层传id进行查找后在上级组件中统一修改了[图片]
子组件使用计算属性赋值修改props中对象中属性不生效?pc端的项目是使用了计算属性直接修改父组件通过props传来的对象中的属性,绕开了单向数据流原则。我用uniapp在微信开发者工具中调试发现父组件中的值没有被修改,编译到浏览器端发现可以正常修改父组件中的值。 [图片] [图片] [图片]
2023-06-28