news 2026/6/10 12:27:37

跨端路由设计:如何统一 RN 与 Web 的页面模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
跨端路由设计:如何统一 RN 与 Web 的页面模型

网罗开发(小红书、快手、视频号同名)

大家好,我是展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


文章目录

    • 摘要
    • 一个先抛出来的结论
    • 先拆掉一个常见误解
      • 误解:RN 页面不会被销毁,Web 页面会
    • 一个统一的页面阶段模型
    • RN 是怎么强迫你面对这个模型的?
    • Web 项目为什么一直在逃避这个问题?
    • keep-alive 的真正作用是什么?
    • 统一 RN 与 Web 的关键:抽象“页面阶段”
    • RN 中的阶段映射
    • Web 中的阶段映射(不使用 keep-alive)
    • Web 中的阶段映射(使用 keep-alive)
    • 一个跨端可复用的页面逻辑示例
      • 定义页面逻辑(与平台无关)
    • RN 中使用
    • Web 中使用(Vue + keep-alive)
    • 一个真实业务场景的对齐示例
      • 场景:订单列表轮询
      • 统一模型后的写法
    • 这套模型带来的实际好处
      • 1. 页面行为可预测
      • 2. keep-alive 使用变得理性
      • 3. RN / Web 团队可以真正对齐
    • 一个简单但很重要的团队约定
    • 总结

摘要

如果你同时做过 RN 和 Web 项目,大概率会有一种撕裂感:

  • RN 项目里,页面明明还在,却什么都不能随便跑
  • Web 项目里,页面一切都靠 mounted 和 unmounted
  • RN 强调 focus / blur
  • Web 强调 created / mounted / destroyed

最后的结果是:

同一个业务,在 RN 和 Web 里需要两套完全不同的设计方式

但问题其实不在技术栈,而在页面模型没有统一

这篇文章要做的不是“对比”,而是给出一个结论:

RN 和 Web 本质上可以共享同一套页面心智模型。

一个先抛出来的结论

页面不是“是否存在”的问题,而是“当前处于什么阶段”。

一旦你用“阶段”来理解页面,RN 和 Web 的差异会迅速缩小。

先拆掉一个常见误解

误解:RN 页面不会被销毁,Web 页面会

这句话只对了一半

  • RN 页面通常常驻内存
  • Web 页面通常会被销毁

但真正重要的不是存不存在,而是:

页面当前是否应该响应用户、请求数据、触发副作用

一个统一的页面阶段模型

不管 RN 还是 Web,每一个页面其实都经历这四个阶段:

  1. 创建(Create)
  2. 挂载(Mount)
  3. 激活(Active / Focus)
  4. 休眠(Inactive / Blur)
  5. 销毁(Destroy)

差别只在于:

  • RN 默认页面不会 Destroy
  • Web 默认页面不会 Inactive

RN 是怎么强迫你面对这个模型的?

在 React Navigation 里,你几乎一定会遇到:

useFocusEffect(React.useCallback(()=>{fetchData();return()=>{cancelRequest();};},[]));

这段代码背后的假设是:

  • 页面存在,但未必可见
  • 副作用必须和“聚焦状态”绑定

RN不给你偷懒空间

Web 项目为什么一直在逃避这个问题?

因为 Web Router 默认给你的是:

mounted(){fetchData();}

没有 focus,也没有 blur。

于是开发者自然会把:

  • 初始化
  • 请求
  • 监听
  • 轮询

全部堆进 mounted。

keep-alive 的真正作用是什么?

从跨端视角看:

keep-alive = 给 Web 补上 “Inactive / Active” 这两个阶段

但问题是:

  • Web 项目引入了 keep-alive
  • 却没有引入阶段意识

于是就变成:

页面存在,但逻辑不知道自己该不该跑

统一 RN 与 Web 的关键:抽象“页面阶段”

我们先不谈框架,直接定义一个跨端页面阶段接口

interfacePageLifecycle{onCreate():void;onMount():void;onActive():void;onInactive():void;onDestroy():void;}

这套模型在两个端上都成立。

RN 中的阶段映射

页面阶段RN 对应
onCreate组件初始化
onMountuseEffect(() => {}, [])
onActiveuseFocusEffect
onInactivefocus cleanup
onDestroy极少发生

Web 中的阶段映射(不使用 keep-alive)

页面阶段Web 对应
onCreatesetup
onMountmounted
onActive
onInactive
onDestroyunmounted

可以看到,Web缺失了中间层

Web 中的阶段映射(使用 keep-alive)

页面阶段Web 对应
onCreatesetup
onMountmounted
onActiveactivated
onInactivedeactivated
onDestroyunmounted

这时,Web 才第一次和 RN 站在同一张图上。

一个跨端可复用的页面逻辑示例

定义页面逻辑(与平台无关)

classListPageLogic{start(){console.log('start polling');}stop(){console.log('stop polling');}}

RN 中使用

functionListScreen(){constlogic=useRef(newListPageLogic()).current;useFocusEffect(React.useCallback(()=>{logic.start();return()=>logic.stop();},[]));returnnull;}

Web 中使用(Vue + keep-alive)

exportdefault{activated(){this.logic.start();},deactivated(){this.logic.stop();}};

同一套业务逻辑,只是生命周期绑定点不同。

一个真实业务场景的对齐示例

场景:订单列表轮询

错误模型:

  • mounted 开始轮询
  • unmounted 停止轮询

结果:

  • Web 需要 keep-alive
  • RN 出现后台轮询

统一模型后的写法

  • 页面激活 → 开始轮询
  • 页面失焦 → 停止轮询

平台无关。

这套模型带来的实际好处

1. 页面行为可预测

  • 不再出现“我不在这个页面但它在跑”
  • 副作用边界清晰

2. keep-alive 使用变得理性

你会发现:

  • 有些页面根本不该缓存
  • 有些页面缓存了也不会出问题

3. RN / Web 团队可以真正对齐

  • PR review 维度统一
  • 讨论问题不再纠结“这个端不一样”

一个简单但很重要的团队约定

在跨端项目中,建议强制约定:

禁止在 onMount / mounted 中启动长期副作用

所有长期行为必须绑定:

  • onActive
  • onInactive

总结

跨端路由设计不是选型问题,而是页面模型问题

当你把页面理解为:

一个会在不同阶段切换状态的长期对象

你会发现:

  • RN 不再“特殊”
  • Web 不再“混乱”
  • keep-alive 不再“危险”
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/2 1:42:55

AI智能预警系统:矿山、工厂与油气站安全管理架构浅析

随着矿山、工厂和油气站等高风险行业对安全管理要求的提升,传统人工巡查已无法满足严格的监管需求。人工巡查存在隐患空档、疏漏和瞒报问题。基于AI智能预警系统,结合深度学习、计算机视觉和大数据分析等前沿技术,能够实现全天候、全方位的智…

作者头像 李华
网站建设 2026/6/5 15:37:09

Multisim14模拟电路仿真入门必看基础指南

Multisim14模拟电路仿真入门:从零搭建你的第一个虚拟实验室你有没有过这样的经历?想做个放大电路,结果面包板刚搭好,三极管就烫得不敢碰;调试滤波器时示波器上全是噪声,却分不清是电路问题还是接线错误&…

作者头像 李华
网站建设 2026/6/5 2:01:06

跨境电商应用案例:用anything-llm管理产品说明书

跨境电商应用案例:用Anything-LLM管理产品说明书 在一家主营小家电的跨境电商公司里,客服主管李婷正为一个老问题头疼——每天要处理上百条来自欧美客户的咨询:“这款吹风机支持220V吗?”“包装里有没有英标插头?”虽然…

作者头像 李华
网站建设 2026/6/9 5:17:43

高速信号完整性设计:电路板PCB布局全面讲解

高速信号完整性设计:从布局到阻抗匹配的实战全解析你有没有遇到过这样的情况?一块PCB板子焊接完成,通电正常,但高速接口就是“抽风”——DDR总线频繁报错、PCIe链路协商失败、千兆以太网丢包严重。示波器一测,眼图几乎…

作者头像 李华
网站建设 2026/6/1 22:33:32

基于数字孪生的产线优化:完整指南

从“看得到”到“管得准”:如何用数字孪生重塑产线优化能力?你有没有遇到过这样的场景?某条关键产线突然停机,维修团队花了几个小时排查,最后发现只是某个传感器信号漂移;或者新产品导入时,反复…

作者头像 李华
网站建设 2026/6/1 4:29:13

anything-llm插件生态展望:未来可能的扩展方向

Anything-LLM 插件生态展望:未来可能的扩展方向 在企业知识管理日益智能化的今天,一个普遍存在的矛盾逐渐凸显:员工面对海量文档却找不到关键信息,而管理者又疲于重复解答相同问题。传统搜索工具因语义理解能力有限,难…

作者头像 李华