diff --git a/packages/taro-platform-weapp/src/apis.ts b/packages/taro-platform-weapp/src/apis.ts index e3d25ec04201..ef0edf805040 100644 --- a/packages/taro-platform-weapp/src/apis.ts +++ b/packages/taro-platform-weapp/src/apis.ts @@ -22,6 +22,52 @@ export function initNativeApi (taro) { } } }) + + // 保存原始的 navigateTo 方法 + const originalNavigateTo = taro.navigateTo + + /** + * 重写 navigateTo 以支持 Skyline 渲染模式 + * 在 Skyline 模式下使用 routeType 参数时,直接调用微信原生 API,避免 Taro 运行时的动画处理导致节点查找失败 + * @param options - 导航参数对象 + * @returns Promise + */ + taro.navigateTo = function (options: Record) { + // 检查是否在 Skyline 模式下使用了特殊的 routeType + if (options?.routeType && typeof wx !== 'undefined') { + // 获取当前渲染器类型 + const renderer = taro.getRenderer?.() || 'webview' + + // Skyline 模式下,routeType 参数需要通过原生 API 直接调用 + // 避免 Taro 运行时的动画处理导致节点查找失败 + if (renderer === 'skyline') { + return new Promise((resolve, reject) => { + const { success, fail, complete, ...restOptions } = options + wx.navigateTo({ + ...restOptions, + success: (res) => { + success?.(res) + complete?.(res) + resolve(res) + }, + fail: (err) => { + try { + fail?.(err) + } catch (e) { + // ignore + } + complete?.(err) + reject(err) + } + }) + }) + } + } + + // 非 Skyline 模式或无 routeType 参数时使用标准流程 + return originalNavigateTo.call(taro, options) + } + taro.cloud = wx.cloud taro.getTabBar = function (pageCtx) { if (typeof pageCtx?.getTabBar === 'function') {