2.20 useTransition与useDeferredValue
一、useTransition与useDeferredValue
useTransition是一个让在不阻塞UI的情况下来更新状态的ReactHook,返回一个状态值表示过度任务的等待状态,以及一个启动该过度任务的函数
import { useState, useTransition } from 'react' function List({ query }) { const items = [] const word = 'hello snow' if (query !== '' && word.includes(query)) { const arr = word.split(query) for (let i = 0; i < 10000; i++) { items.push( <li key={i}> {arr[0]} <span style={{ color: 'red' }}>{query}</span> {arr[1]} </li> ) } } else { for (let i = 0; i < 10000; i++) { items.push(<li key={i}>{word}</li>) } } return ( <> <ul>{items}</ul> </> ) } function App() { const [search, setSearch] = useState('') const [query, setQuery] = useState('') // 返回Boolean类型的状态,函数 const [pending, startTransition] = useTransition() const handleChange = (e) => { // 紧急的 setSearch(e.target.value) // 修改成非紧急 startTransition(() => { setQuery(e.target.value) }) } return ( <> <div>Default Template</div> <input type="text" value={search} onChange={handleChange} /> {pending && <div>loading</div>} <List query={query} /> </> ) } export default App使用useDeferredValue
import { useState, useDeferredValue } from 'react' function List({ query }) { const items = [] const word = 'hello snow' if (query !== '' && word.includes(query)) { const arr = word.split(query) for (let i = 0; i < 10000; i++) { items.push( <li key={i}> {arr[0]} <span style={{ color: 'red' }}>{query}</span> {arr[1]} </li> ) } } else { for (let i = 0; i < 10000; i++) { items.push(<li key={i}>{word}</li>) } } return ( <> <ul>{items}</ul> </> ) } function App() { const [search, setSearch] = useState('') // 得到对应search一样的值,只不过是一个延迟的副本 const [query] = useDeferredValue(search) const handleChange = (e) => { // 紧急的 setSearch(e.target.value) } return ( <> <div>Default Template</div> <input type="text" value={search} onChange={handleChange} /> <List query={query} /> </> ) } export default App
最后更新于