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()
    }
posted @   Karle  阅读(81)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示