setState异步更新数据导致的问题
背景
子组件使用ProDescriptions组件,通过传入columns和request构建列表。
<Modal
open={visible}
>
<ProDescriptions
columns={columns as any}
request={getTableRequest as any}
/>
</Modal>
父组件通过调用子组件useImperativeHandle
提供的方法,改变visible来控制子组件的渲染
由于ProDescriptions的数据要根据父组件传入的id进行网络请求,所以每次打开的ProDescriptions展示的数据理论上都不一样
useImperativeHandle(ref, () => ({
show: (id: string) => {
setJobId(id);
setVisible(true);
},
}));
于是请求函数就会通过jobId进行网络请求
但是在关闭该弹窗,重新打开并传入新id后,发现不再进行网络请求并且ProDescriptions渲染的数据与第一次相同
解决
-
首先定义了actionRef节点去控制ProDescriptions组件,每次父组件调用show()后进行reload重新渲染。但是除去第一次打开弹窗,后面操作拿到的id都为上一次的id,依然有错。
const actionRef = useRef<ActionInstance>() show:(id:string) => { setJobId(id) actionRef.current?.reload() }
- 因为setState()是异步操作,数据更新存在延时性。所以改用useRef定义数据,通过改变ref.current进行数据改变。
const jobId = useRef<string>('') show:(id:string) => { jobId.current = id actionRef.current?.reload() }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现