返回博客列表
前端开发
2024-01-01
15 分钟

React 18 并发特性详解

React 18 引入了强大的并发特性,包括 Suspense、Concurrent Rendering 等。了解这些特性如何提升用户体验。

React并发性能优化
👁️892 次阅读
71 个赞
✍️作者:Charlie
React 18 并发特性详解

React 18 并发特性详解


React 18 引入了强大的并发特性,这些特性从根本上改变了 React 应用的渲染方式,提供了更好的用户体验和性能。


并发渲染的核心概念


并发渲染允许 React 中断渲染工作,处理更高优先级的任务,然后继续之前的工作。


// 使用 createRoot 启用并发特性

import { createRoot } from 'react-dom/client';


const container = document.getElementById('root');

const root = createRoot(container);

root.render();


Suspense 的进化


Suspense 现在不仅支持代码分割,还支持数据获取。


// 数据获取的 Suspense

function ProfilePage() {

return (

}>

}>

);

}


自动批处理


React 18 自动批处理所有状态更新,包括 Promise、setTimeout 和原生事件处理程序中的更新。


// React 18 中这些更新会被自动批处理

function handleClick() {

setCount(c => c + 1);

setFlag(f => !f);

// React 只会重新渲染一次

}


startTransition API


startTransition 允许我们标记某些更新为"过渡",这些更新的优先级较低。


import { startTransition } from 'react';


function SearchBox() {

const [query, setQuery] = useState('');

const [results, setResults] = useState([]);


const handleChange = (e) => {

setQuery(e.target.value);


startTransition(() => {

// 这个更新的优先级较低

setResults(searchResults(e.target.value));

});

};


return (

value={query}

onChange={handleChange}

placeholder="搜索..."

/>

);

}


useDeferredValue Hook


useDeferredValue 允许我们延迟更新 UI 的某些部分。


import { useDeferredValue } from 'react';


function SearchResults({ query }) {

const deferredQuery = useDeferredValue(query);

const results = useMemo(() =>

searchResults(deferredQuery), [deferredQuery]

);


return (

{results.map(result =>

)}

);

}


新的 Hooks


React 18 还引入了一些新的 Hooks:


useId


import { useId } from 'react';


function PasswordField() {

const passwordHintId = useId();


return (

<>

type="password"

aria-describedby={passwordHintId}

/>

密码应包含至少 8 个字符

);

}


useSyncExternalStore


import { useSyncExternalStore } from 'react';


function useWindowWidth() {

return useSyncExternalStore(

(callback) => {

window.addEventListener('resize', callback);

return () => window.removeEventListener('resize', callback);

},

() => window.innerWidth,

() => 0 // 服务器端渲染的默认值

);

}


性能优化建议


  • **合理使用 startTransition**:对于非紧急的 UI 更新
  • **利用 Suspense 边界**:提供更好的加载体验
  • **使用 useDeferredValue**:延迟昂贵的计算
  • **避免不必要的重新渲染**:使用 React.memo 和 useMemo

  • 总结


    React 18 的并发特性为构建高性能、响应式的用户界面提供了强大的工具。这些特性让我们能够更好地控制渲染优先级,提供更流畅的用户体验。


    在实际项目中,建议逐步采用这些新特性,特别是在处理大量数据或复杂 UI 交互时。记住,并发特性的目标是提升用户体验,而不是增加代码复杂性。


    892 次阅读