Files
xinlong-shop-taro/.workbuddy/memory/2026-07-12.md
赵忠林 70ad1d030f feat(user): 使用微信原生 Picker 替换所在地选择弹层
- 删除 NutUI Address 相关导入、状态及地区数据转换逻辑
- 新增派生 regionValue 用于绑定微信原生 Picker 的 value
- 将 handleRegionChange 调整为处理微信 Picker 的事件
- 将所在地选择 UI 修改为微信原生 Picker 包裹的视图结构
- 地图定位失败使用弹窗提示,引导用户手动选择或重试
- 移除手动打开地区选择器的函数及 NutUI 组件
- 保留 RegionData 用于文本智能识别解析
- 编译通过,提升在无地图或无权限环境下的地区选择稳定性
2026-07-12 23:19:18 +08:00

43 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 2026-07-12
## address-edit 地图选点「打开地图失败」修复
客户反馈部分手机无法通过选择地图填写地址/所在区,提示「打开地图失败,请重试」。
根因按概率①微信隐私授权未处理新版基础库强制最契合「部分手机」②chooseLocation 传 undefined 经纬度;③权限流程不完整;④失败无兜底。
已修复 `src/pages/user/address-edit.tsx`(四层):
1. 调 chooseLocation 前 `ensurePrivacyAuthorized()`wx.getPrivacySetting/requirePrivacyAuthorize旧基础库无接口则放行
2. 仅当 lat/lng 为有效数字时才传给 chooseLocation否则 `chooseLocation({})`
3. `ensureLocationPermission()`getSetting 预检 + authorize 申请 + openSetting 引导并回读确认。
4. 失败兜底:弹窗「手动选择」(打开所在地区选择器)/「再试一次」(chooseLocation({}))regionLocked 时不再误开选择器。
注意:项目本地 `tsc --noEmit` / `npm run type-check` 在本机因 Taro 类型入口缺失(`@tarojs/taro` 不在 @types)会报错,与本次改动无关;以 `taro build --type weapp` 为准。
另:如仍偶发,需确认微信公众平台后台已配置《隐私保护指引》并发布。
## 跟进:放宽所在地区锁定,始终可手动选择
用户要求「万一地图不可用也能手动选所在地区、填地址提交」。分析发现该路径原本已通所在地区行→NutUI Address 选择器、详细地址 Input、save 不强制经纬度)。
唯一拦截点:`regionLocked` 在地图选点/编辑带坐标地址后置 true导致「所在地区」行与 handleRegionChange 被拦。
已放宽(仍保留 regionLocked 用于「识别」文本不覆盖地图地区):
- openRegionPicker去掉 regionLocked 拦截,始终打开选择器。
- handleRegionChange去掉拦截手动改后 setRegionLocked(false)。
- chooseGeoLocation 兜底:去掉 regionLocked 分支,地图失败「手动选择」始终打开地区选择器。
编译验证:`taro build --type weapp` 通过。
(未做:手动改地区时不自动清除旧经纬度,避免误删数据;如需坐标随地区失效可再加。)
## 所在地区选择器NutUI Address → 微信原生 Picker mode='region'
参考 weiyu-taro 项目(同为 Taro 商城,`src/pages/user/address-edit.tsx` 用原生 `<Picker mode='region'>` 选省市区),将 xinlong 的所在地区从 NutUI `<Address>` 弹层改为微信原生 Picker与 weiyu-taro 对齐。
改动 `src/pages/user/address-edit.tsx`
- 删除 `import {Address} from '@nutui/nutui-react-taro'`、状态 `regionPickerVisible`/`regionOptions`、以及把 regions-data.json 转 NutUI options 的 useEffect。
- 新增派生 `regionValue = [province, city, region].map(v=>String(v||''))`3 元素数组,供原生 Picker value 绑定)。
- `handleRegionChange` 由 NutUI `(value:string[])` 改为原生 `(e:any)``e.detail.value`,手动改后 `setRegionLocked(false)`
- 「所在地区」行用 `<Picker mode='region' value={regionValue} onChange={handleRegionChange}>` 包裹。
- 删除底部 `<Address>` 组件与 `openRegionPicker` 函数。
- 地图失败兜底:原生 Picker 无法用代码调起,改为弹 modal 引导「重试」(chooseLocation({})) / 「手动填写」(toast 提示去下方手动选);未获定位权限时 toast 引导手动选。
优势:零依赖、零数据准备、系统级选择器永远可用(不联网/不依赖权限/不依赖组件库),是地图不可用最稳的兜底。
编译验证:`taro build --type weapp` 通过。
RegionData 仍被 parseRegion/parseAddressText文本智能识别使用import 保留。