目录
- useDeferredValue
- useTransition
- useIdleCallback
在 React 中,有一些钩子函数可以帮助你处理不紧急的更新或渲染,从而优化性能和用户体验。
以下是一些常用的相关钩子及其应用场景:
useDeferredValue
- 用途:用于处理高优先级和低优先级更新。将值的更新推迟到渲染的空闲时间,从而避免卡顿。
- 示例:
import { useState, useDeferredValue } from 'react';const MyComponent = () => {const [inputValue, setInputValue] = useState('');const deferredValue = useDeferredValue(inputValue);return (<div><input type="text" value={inputValue} onChange={(e) => setInputValue(e.target.value)} /><ExpensiveComponent value={deferredValue} /></div>); };const ExpensiveComponent = ({ value }) => {// 模拟一个开销很大的渲染操作let expensiveCalculation = value.split('').reverse().join('');return <div>{expensiveCalculation}</div>; };
useTransition
- 用途:用于标记更新为非紧急更新,并提供用户状态的过渡体验。
- 示例:
import { useState, useTransition } from 'react';const MyComponent = () => {const [inputValue, setInputValue] = useState('');const [isPending, startTransition] = useTransition();const handleChange = (e) => {startTransition(() => {setInputValue(e.target.value);});};return (<div><input type="text" onChange={handleChange} />{isPending ? "Loading..." : <ExpensiveComponent value={inputValue} />}</div>); };const ExpensiveComponent = ({ value }) => {// 模拟一个开销很大的渲染操作let expensiveCalculation = value.split('').reverse().join('');return <div>{expensiveCalculation}</div>; };
useIdleCallback
通过 polyfill 实现,因为 React 没有内置此钩子:
- 用途:在浏览器空闲时间执行不紧急的操作,如日志记录或数据预加载。
- 示例:
import { useEffect } from 'react';const useIdleCallback = (callback) => {useEffect(() => {const id = requestIdleCallback(callback);return () => cancelIdleCallback(id);}, [callback]); };const MyComponent = () => {useIdleCallback(() => {console.log('This runs during idle time');});return <div>Idle Callback Example</div>; };
这些钩子帮助开发者更好地控制 React 应用的性能和响应性,特别是在处理用户交互和长时间运行的计算时。