forked from zhouruizhe/gmTouringMiniApp
AI Code Review / review (pull_request) Successful in 2m11s
选中标点后地图在左右/上下反复抽动,根因是视口回写形成了自激回路: map 的 longitude/latitude/scale 绑定到 store,而 regionchange 又无条件把 地图当前中心点写回 store —— 写 store 触发地图移动,移动结束回传一个 「差一点点」的中心点,再写回,再移动。上一个提交把中心点改成从 detail.centerLocation 同步读取后,回路里原本靠 getCenterLocation 异步跳变 掩盖住的这一点噪声就直接闭合了。 两道闸: - 只接受手势造成的变化。causedBy 为 update(我们自己改绑定值或调 includePoints 触发)时 store 已是权威值,不回写。老基础库拿不到 causedBy 时退化到下一道闸。 - 所有回写走 commitViewport,经 isSignificantViewportChange 过滤掉小于 1e-4 度 / 0.01 级的变化。远小于任何一次真实拖动,足以吸收量化噪声。 顺带修一个 H5 构建回归(1bcdd40 引入):uni 的 H5 路由生成器按路径推导 组件标识,pages/poi/detail 与 pages-poi/detail 都归一成 PagesPoiDetail, 重复声明导致 build:h5 失败。兼容跳板必须留在旧路径上,所以改名分包路由 pages-poi/detail -> pages-poi/poi-detail。
63 lines
1.8 KiB
Vue
63 lines
1.8 KiB
Vue
<script setup lang="ts">
|
|
import PageState from '@/components/poi/PageState.vue'
|
|
|
|
/**
|
|
* 旧详情页路由的兼容跳板。
|
|
*
|
|
* 详情页已从 `pages/poi/detail` 移入 `pages-poi` 分包(见 f8ad5e1)。
|
|
* 旧路径一旦从 app.json 消失,任何还攥着它的入口 —— 开发者工具模拟器上次停留的
|
|
* 路由、预览时的启动页、已经发出去的分享卡片或二维码 —— 冷启动都会落到一个
|
|
* 微信解析不出来的路由上,渲染成白屏,左上角只剩一个回首页的小房子。
|
|
*
|
|
* 这里保留一个只做重定向的空页面把流量接回新路径。等所有入口都刷新过之后可以删掉。
|
|
*/
|
|
const REDIRECT_FAILURE_TOAST = '点位详情已更新,正在返回地图'
|
|
|
|
function fallbackToMap() {
|
|
uni.reLaunch({ url: '/pages/map/index' })
|
|
}
|
|
|
|
onLoad((query) => {
|
|
const rawPoiId = typeof query?.poiId === 'string' ? query.poiId : ''
|
|
if (!rawPoiId.trim()) {
|
|
fallbackToMap()
|
|
return
|
|
}
|
|
|
|
// redirectTo 而非 navigateTo:跳板本身不该留在页面栈里。
|
|
uni.redirectTo({
|
|
url: `/pages-poi/poi-detail?poiId=${encodeURIComponent(rawPoiId)}`,
|
|
fail: () => {
|
|
uni.showToast({ title: REDIRECT_FAILURE_TOAST, icon: 'none' })
|
|
fallbackToMap()
|
|
},
|
|
})
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<view class="poi-detail-redirect">
|
|
<PageState state="loading" title="正在打开点位详情…" />
|
|
</view>
|
|
</template>
|
|
|
|
<route lang="yaml">
|
|
layout: map
|
|
style:
|
|
navigationBarTitleText: 点位详情
|
|
navigationBarBackgroundColor: '#ffffff'
|
|
navigationBarTextStyle: black
|
|
backgroundColor: '#f5f7f6'
|
|
</route>
|
|
|
|
<style scoped lang="scss">
|
|
.poi-detail-redirect {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 100%;
|
|
min-height: 100vh;
|
|
background: #f5f7f6;
|
|
}
|
|
</style>
|