今天遇到一個問題,業務場景是:表單詳情頁,用了antd
的Form
組件,想在組件onChange
時調用form.validateFields
先校驗數據再作提交,過程當中,validateFields
一直是延遲的狀態,即填了值,在onChange
中能拿到當前值,可是在validateFields
的回調中仍是上一次的值。在antd
的issue
中找到了問題的緣由。https://github.com/ant-design... 關鍵答案是git
Because,
setState
is asynchronously.
issue
中並無提到解決方案,後來經過嘗試用setTimeout
解決了這個問題。
相關代碼連接: https://codesandbox.io/s/unru...
關鍵代碼github
handleSelectChange = value => { console.log(value); this.props.form.validateFields(["gender"], (errors, values) => { console.log("inner not setTimeout", values); }); setTimeout(() => { this.props.form.validateFields(["gender"], (errors, values) => { console.log("inner is setTimeout", values); }); }, 0); };
可見 setTimeout
後拿到的值是才正確的。segmentfault
一個很重要的概念:js是單線程的,單線程就意味着,全部任務須要排隊,前一個任務結束,纔會執行後一個任務。若是前一個任務耗時很長,後一個任務就不得不一直等着。空閒時,state 已經更新完成。
解析setTimeout時間設置爲0 推薦這篇文章對setTimeout 講得很透徹antd