react hook 异步任务转同步

简介: keywords: - react - flushSync

抛出问题

由于 react 的批处理,会合并为一次 render

function handleClick() {
  setLoading(true);
  setCount(1);
  setLoading(false);
}

解决问题

React 中的批处理简单来说就是将多个状态更新合并为一次重新渲染,以获得更好的性能。如果要一个请求的 loading 效果怎么实现呢?

方式一: 利用 Promise、setTimeout

function handleClick() {
  setTimeout(() => {
    setCount(2);
    setLoading(false);
  });
  setLoading(true);
}

方式二: 利用 await

async function handleClick() {
  setLoading(true);
  await setCount(2);
  setLoading(false);
}

方式三: 利用 react17 新出的 flushSync

flushSync 会以函数为作用域,函数内部的多个 setState 仍然为批量更新,这样可以精准控制哪些不需要的批量更新
import React, { useState } from 'react';
import { flushSync } from 'react-dom';

export default () => {
  const [count, setCount] = useState(1);
  const click = async () => {
    flushSync(() => setLoading(true));
    setCount(2);
    setLoading(false);
  };
  return <button onClick={click}> count </button>;
};
相关文章
|
资源调度 前端开发 API
React Suspense与Concurrent Mode:异步渲染的未来
React的Suspense与Concurrent Mode是16.8版后引入的功能,旨在改善用户体验与性能。Suspense组件作为异步边界,允许子组件在数据加载完成前显示占位符,结合React.lazy实现懒加载,优化资源调度。Concurrent Mode则通过并发渲染与智能调度提升应用响应性,支持时间分片和优先级调度,确保即使处理复杂任务时UI仍流畅。二者结合使用,能显著提高应用效率与交互体验,尤其适用于数据驱动的应用场景。
267 20
|
前端开发 JavaScript
React 中 setState 什么时候是同步的,什么时候是异步的
React 中 setState 什么时候是同步的,什么时候是异步的
440 0
|
前端开发
React useImperativeHandle Hook
【7月更文挑战第1天】React useImperativeHandle Hook
148 3
|
前端开发 JavaScript 数据格式
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
467 1
|
前端开发
React 中的 Hook 概念
【8月更文挑战第31天】
294 0
|
存储 前端开发 JavaScript
处理 React 应用程序中的异步数据加载
【8月更文挑战第31天】
298 0
前端React篇之React setState 调用的原理、React setState 调用之后发生了什么?是同步还是异步?
前端React篇之React setState 调用的原理、React setState 调用之后发生了什么?是同步还是异步?
|
前端开发
Vue3 【仿 react 的 hook】封装 useTitle
Vue3 【仿 react 的 hook】封装 useTitle
191 0
|
前端开发 API
Vue3 【仿 react 的 hook】封装 useLocation
Vue3 【仿 react 的 hook】封装 useLocation
193 0