在UniApp 3.x使用 $scope.setData 无法更新视图 WXML 变量名变化导致数据不同步的问题

1. 事情的起因

最近在升级到 UniApp 3.x 后,发现 this.$scope.setData 直接修改小程序数据层,并没有像以前那样更新视图。最开始以为是 HBuilderX 版本问题,后来深入排查发现,问题根本不在这里,而是 Uni3 编译后的 WXML 变量名发生了变化

2. 代码示例

先看看这个 Vue 代码,在 UniApp 2.x 里,this.$scope.setData 可以正常更新 renderList

<template>
  <div
    v-for="(stock, index) in renderList"
    :key="stock.chooseSymbol + index"
    :data-key="stock.chooseSymbol"
    class="stock-item portfolio-stock-item">
    <span class="stock-info-name" :class="[stock.name && stock.name.length > 14 ? 'small' : '']">
    <
当然,这是一个完整的微信小程序中包含用户位置获取和地图展示的简单示例。请注意,你需要先在`app.js`、`app.json`以及可能需要的`global.json`文件中配置好必要的权限和依赖。 **app.json:** ```json { "pages": [ "pages/index/index", "pages/maps/maps" // 这里假设有一个单独的地图页 ], "window": { "backgroundTextStyle": "light", "navigationBarBackgroundColor": "#fff", "navigationBarTitleText": "我的位置", "navigationBarTextStyle": "black" }, "permission": { "scope.geolocation": {} } } ``` **index.js:** ```javascript Page({ data: { location: null, }, onLoad: function() { this.checkLocationPermission(); }, checkLocationPermission() { wx.requestPermissions({ permissions: [&#39;scope.geolocation&#39;], success: (res) => { if (res-granted) { this.getLocation(); } else { console.error(&#39;用户拒绝了地理定位权限&#39;); } }, fail: () => { console.error(&#39;获取地理定位权限失败&#39;); } }); }, getLocation: function() { wx.getLocation({ type: &#39;wgs84&#39;, success: function(res) { this.setData({ location: { latitude: res.latitude, longitude: res.longitude } }); this.showMap(); }, fail: function(err) { console.error(&#39;获取地理位置失败: &#39;, err); } }); }, showMap: function() { let mapPage = wx.createSelectorQuery().select(&#39;#map-container&#39;).fields({ properties: [&#39;latitude&#39;, &#39;longitude&#39;] }); mapPage.exec((data) => { let position = { latitude: data[0].latitude, longitude: data[0].longitude }; wx.navigateTo({ url: &#39;/pages/maps/maps?position=&#39; + JSON.stringify(position) }); }); }, }); ``` **maps.wxml:** ```html <view id="map-container"> <!-- Your map component here --> <map bindgetmarkersuccess="handleMarkers" location="{{location}}" zoom="10" enableHighAccuracy="true" ></map> </view> ``` **maps.js:** ```javascript Page({ data: { markers: [], position: {}, }, onShow: function(e) { if (e.queryParams.position) { this.setData({ position: JSON.parse(e.queryParams.position), }); this.fetchMarkersFromLocation(); } }, fetchMarkersFromLocation: function() { // 在这里可以根据位置数据调用接口或计算标记点 // 并将结果存入markers数组,然后设置在视图上 }, handleMarkers: function(e) { this.setData({ markers: e.markers }); } }); ``` 这只是一个基础的例子,实际应用中可能还需要根据业务需求进行调整。如果你遇到运行错误,记得检查权限设置、网络状况以及地图组件是否正确安装。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码简单说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值