VUE3.0 をすぐに始める方法:
React 18 を学習するために、新しい概念であるtransition
が導入され、新しい API - startTransition
と 2 つの新しいフック - useTransition
とusedeferredValue
が導入されました。この記事はここから始まります。アーリーアダプターの紹介を使用します。
1. 概要
この記事はtansition
の本来の目的、startTransition
使用と導入useTransition
使用と導入、useDeferredValue
使用と導入の 4 つの部分に分かれています。
2. Transition の本来の目的、
transtion
を直訳すると、过渡
。 Tansition は基本的に、为了解决渲染并发问题所提出
。 React では、コンポーネントの状態が変化して再レンダリングがトリガーされると、レンダリングを停止することはできません。コンポーネントが再レンダリングされるまで、ページはユーザーの操作に応答し続けることはできません。
为此react 18中更新都可以划分为以下两类:
紧急更新
(urgent update):用户期望马上响应的更新操作,例如鼠标单击或键盘输入。过渡更新
: クエリ、検索の推奨、検索結果の表示など、許容可能な遅延のある一部の更新操作。// startTransition(()=> { startTransiton によって遷移用にマークされた後、更新します) // 緊急でない更新の優先度が低くなり、setQueryValue(inputValue) の実行が遅れます。 }) // マークされていない場合、setInputValue(inputValue) は即時に実行されます。react
18 のstartTrionstion
でマークされた更新は、一時的な更新です (実行優先度が低くなります)。このとき、react は内部状態の実行を遅らせます。内部スケジュールメカニズムに従って更新します。
開発中の開発者は、移行フックを通じてどの更新を移行イベントとしてマークするかを決定できます。マークが付けられると、優先度の低い実行を表します。つまり、通过区分更新优先级
、優先度の高いイベントの応答性を維持し、提高用户交互体验,保持页面响应
ができます。 。
3. startTransiton
startTransiton の使い方の紹介
const handleClick = () => { //優先度の低い更新としてマークされたStartTransitionパッケージStartTransition(()=> { setQueryValue(inputValue) }) // マークされていない場合は、setInputValue(inputValue) がすぐに実行されます }
首先我们来介绍下最简单的startTransition
、デモと比較を通じて、
大量の検索結果を偽造することで、検索結果を表示するシナリオのシミュレーションです。凍結しやすいものです。
123を継続的に入力し、検索ボックスvalue
の変更(緊急の更新)と検索値searchVal
(トランジションアップデート)の変更を監視し、コントロールバーに出力しようとします。
import React, { useEffect, useState, startTransition } from 'react'; './App.css' をインポートします const SearchResult = (小道具) => { const resultList = props.query ? Array.from({ 長さ: 10000 }, (_, インデックス) => ({ ID: インデックス、 キーワード: `${props.query} -- 検索結果${index}`, })): []; return resultList.map(({ id, キーワード }) => ( <li key={id}>{キーワード}</li> )) } const App = () => { const [type, setTpye] = useState(1) const [値, setValue] = useState(''); const [searchVal, setSearchVal] = useState('-'); useEffect(() => { // 検索値の変化を監視 console.log('検索値 update++++++ への応答' + searchVal + '++++++++++++') }, [検索値]) useEffect(() => { console.log('入力ボックスの値更新に対する応答-----' + 値 + '-------------') if (タイプ === 1) { setSearchVal(値 || '-') } if (タイプ === 2) { startTransition(() => { setSearchVal(値 || '-') }) } }, [値, 型]); 戻る ( <div className='アプリ'> <input value={value} onChange={e => setValue(e.target.value)} /> <div className={`type_button ${type === 1 ? 'type_button_checked' : ''}`} onClick={() => setTpye(1)}>normal</div> <div className={`type_button ${type === 2 ? 'type_button_checked' : ''}`} onClick={() => setTpye(2)}>transiton</div> <ul> <SearchResultクエリ={searchVal}></SearchResult> </ul> </div> );
通常モードの
場合
如图所示:
123文字が継続的に入力されます。検索値はすぐに応答し、入力ボックスがフリーズして応答しませんレンダリングが完了するまで応答し続けます。
startTransition を使用した後
如图所示:
文字 123 を連続入力すると、入力ボックスは応答し続けますが、ページのフィードバックを確保するために検索値への応答は遅れ、入力が終了するまで検索値への応答が開始されません。検索結果を表示し、ページの応答性を維持します。
4. useTransiton
useTransiton の使い方の紹介
import { useTransiton } from 'react' const [isPending, startTransition] = useTransiton({timeoutMs: 2000}) // たとえば、保留状態では、スピナーを表示できます
startTransition
ISPENDING?
isPending
はブール値で、遷移が完了するまで待つかどうかを React が伝える方法です。useTransition
、特定のtimeoutMs
内で完了してstartTransition
ない場合の遅延応答の値を受け入れます。useTransiton の簡単な解析
useTransition
疑似コードで理解します。
関数 useTransition(){ const [isPending, setPending] = mountState(false); const start = (コールバック)=>{ setPending(true); // Scheduler.unstable_next 遷移モードを通じて、優先度の低いスケジューリング実行コールバック関数 // は更新の優先度を下げることができます。コールバックでトリガーされた更新の優先度が低い場合、 // 優先度の高い更新に設定されるか、現在のトランザクションがビジー状態の場合は、次のアイドル期間に適用されるようにスケジュールされます。 Scheduler.unstable_next(() => { const prevTransition = ReactCurrentBatchConfig.transition; ReactCurrentBatchConfig.transition = 1; 試す { setPending(false); //コールバック関数 callback() を実行します。 } ついに { ReactCurrentBatchConfig.Transition = prectransition; } }) } return [isPending, start];
startTransition
の実行中、 setPending は 2 回トリガーされます ( transition=1
前に 1 回、その後に 1 回)
。
setPending(true)
startTransition
が呼び出されたとき、およびtransiton
Transitionタスクの更新は、 startTransition
内のコールバック関数が実行されたときにsetPending(false)
実行します。 React は保留中の値の変化に基づいて待機遷移時間を正確に把握し、これを使用してtimeoutMs
超過したかどうか (渡された場合) を判断して更新を強制できます。
5. useDeferredValue
useDeferredValue の使い方の紹介
const [value, setValue] = useState('') // defferedValue値は、状態の更新Const DeferredValue = useFerredValue(value、{timeoutms:2000})
timeoutMs
設定できます。一段逻辑
を処理し、useDeferred は一个新状态
を生成します。useDeferredValue の使用
import React, { useEffect, useState, useTransition, useDeferredValue } from 'react'; './App.css' をインポートします const SearchResult = (小道具) => { const resultlist = props.query ? Array.from({ 長さ: 10000 }, (_, インデックス) => ({ ID: インデックス、 キーワード: `$ {props.query} - 結果を検索$ {index}`、 })): []; return resultList.map(({ id, キーワード }) => ( <li key={id}>{キーワード}</li> )) } const App = () => { const [値, setValue] = useState(''); const searchValue = useDeferredValue(値, { timeoutMs: 2000 }); useEffect(() => { console.log( '入力ボックス値への応答-------' + value + '-------------') }、 [価値]) useEffect(() => { // 検索値の変化を監視 console.log('検索値への応答を更新++++++' + searchValue + '++++++++++++') }, [検索値]) 戻る ( <div className='アプリ'> <入力値= {値} onchange = {e => setValue(e.target.value)} /> <div className = {`type_button type_button_checked`}> usedeferredValue </div> <ul> <searchResult query = {searchValue}> </searchResult> </ul> </div> ); };
usedeferredValueの単純な分析では、
擬似コードを介してuseDeferredValue
理解しています。
function suteferredValue(value){ const [prevvalue、setValue] = updatestate(value); updateEffect(() => { // useEffect の遷移モードを通じて値を更新します。 Scheduler.unstable_next(() => { const prectransition = ReactCurrentBatchConfig.Transition; ReactCurrentBatchConfig.transition = 1; 試す { setValue(値); } ついに { ReactCurrentBatchConfig.transition = prevTransition; } }) }、 [価値]); prevValue を返します。 }
useDeferredValue
、使用効果を介して着信値の変更を聴き、遷移タスクを介して値の変更を実行します。これにより、保证defrredValue的更新滞后于setState
。