Open PalePlain opened 8 months ago
@crazylxr
收到,我看下
这个计划解决吗?
这个计划解决吗?
有的
ReactDOM.render(<App />, document.getElementById("root"))
改成
const root = createRoot(document.getElementById("root"));
root.render(<App />);
就正常了
这个计划解决吗?
有的
当前进度如何 @crazylxr
useRequest:
Fetch.ts
文件:useRequestImplement.ts
文件:当触发用户交互行为, 如拖拽行为时:
React 17 会按照下列顺序执行:
drag文件
Effect CleanupuseRequest
Hook Effect Cleanup, 此时会触发useRequestImplement.ts
useUnmount
回调函数, 即fetchInstance.cancel()
, 而执行fetchInstance.cancel()
后会使得this.count + 1
, 此时this.count
值为 1this.count
再次 + 1, 值为 2, 因此 currentCount 的值也为 2, 因此会按照预期执行 onSuccess 回调函数符合预期
React 18 执行顺序 :
this.count + 1
, 值为 1, 因此 currentCount 的值为 1const res = await servicePromise;
触发异步可中断更新
3..时间切片
调度其他优先级任务, 执行 Effect 链条 Cleanup:useDragPreCheck
Hook Effect Cleanup ->useRequest
Hook Effect Cleanup, 此时执行fetchInstance.cancel()
,this.count + 1
, 此时this.count
值为 2异步
行为完成后, 回到上下文继续执行逻辑, 此时判断currentCount !== this.count
成立, currentCount 由于闭包存在, 值为1, 而this.count
值为 2, 因此返回了new Promise(() => {});
导致onSuccess
未被执行在页面中的表现则为
onSuccess
未触发,loading
不消失, 数据未处理相关 demo (React 18.2.0 + ahooks 3.7.10) : https://is.gd/lZJgyH
将一个节点拖拽到另一个容器中, 表现为 loading 不消失; 而将 react 版本更换为 react 17 后则表现正常;