Android WebView 中 React useState 更新失效问题

1. 问题

在 Android App 内嵌的 H5 页面(React)中:

  • 打开文件选择器上传图片后,页面所有 useState 的更新(如 setLoadingsetRecordList)都不生效
  • 接口返回数据正常,但页面不渲染
  • 原生 DOM 操作正常
  • 使用 Zustand/Redux/Context 管理状态时正常
  • iOS 正常

2. 问题原因

Android WebView 的底层渲染 Bug

  • 触发条件:打开文件选择器(<input type="file">)后返回页面
  • WebView 在 onPause()onResume() 后,渲染引擎进入异常状态
  • 组件内部的 useState 更新被无限期挂起,无法提交到 DOM
  • Context/Redux/Zustand 走的是独立的订阅-通知机制,绕过了这个问题
更新方式 是否失效
useState / useReducer ❌ 失效
Context / Zustand / Redux ✅ 正常
原生 DOM 操作 ✅ 正常

3. 解决方案

将组件本地状态迁移到全局状态管理库

使用 Zustand 示例

javascript 复制代码
import { useEffect, useRef, useState, useContext } from 'react';
import { APP_CONTEXT } from '@/server/store';

export default function App({}) {
  // const [recordList, setRecordList] = useState([]);
   const {
        state: { recordList },
        dispatch,
    } = useContext(APP_CONTEXT);
}
 const getFirstPageData = async () => {
        // 请求第一页数据
        setLoading(true);
        const res = await getGrowthRecordListApi();
        // setRecordList(res.list);
        dispatch({ recordList: res.list });
        setLoading(false);
    };
 }
相关推荐
researcher-Jiang2 小时前
高性能计算之OpenMP——超算习堂学习1
android·java·学习
随风一样自由3 小时前
【前端独角兽】刚进入前端领域的前端开发用jQuery还是Vue3?
前端·javascript·vue3·jquery
alexhilton3 小时前
Kotlin DSL深度解析:从Gradle脚本到构建你自己的DSL
android·kotlin·android jetpack
IMPYLH4 小时前
HTML 的 <data> 元素
前端·html
烽火聊员4 小时前
查看Android Studio错误日志
android·ide·android studio
YHHLAI4 小时前
[特殊字符] 面试中的 Promise —— 从入门到精通
前端·javascript·面试
kyriewen6 小时前
我扒了 GPT-5.6 的全部编程跑分——有一项 OpenAI 没敢放出来
前端·gpt·ai编程
前端H7 小时前
微前端 v3 架构升级:从加载隔离到状态协同
前端·架构·状态模式
陆枫Larry8 小时前
小程序包体积优化:用 SVG 图片替换 iconfont,并保留 CSS 控色能力
前端
环境栈笔记9 小时前
多账号浏览器选型检查清单:Profile、权限、Session 和任务日志怎么评估
前端·人工智能·后端·自动化