useDeferredValue Hook
React Hook
ဒီတစ်ခါ ကျတော်တို့ ဆက်လေ့လာသွားကြမှာက useDeferredValue ဆိုတဲ့ react hook လေးတခုပါ
အဲကောင်က ဘယ်လိုအလုပ်လုပ်တာလည်းဆိုတာကို ကျတော်တို့ ဒီလိုလေးလေ့လာလိုက်ကြရအောင်
အရင်ဆုံး ကျတော်တို့ app.js မှာ ဒီလိုလေးရေးလိုက်ပါမယ်
import { useState,memo } from 'react'
function App () {
const [ text, setText ] = useState("")
return ( <>
<input value={text} onChange={ e => setText(e.target.value) } />
<Listing text={text} />
</>
)
}
export default App
memo(function Listing ({ text }) {
let render = []
for(let i = 0 ; i < 10000 ; i++){
render.push(<div key={i}> input : { text } </div>)
}
return ( <> { render } </> )
})
ကုဒ်ကိုကြည့်လိုက်တဲ့အခါမှာ ကျတော်တို့ တွေ့ရမှာက listing ကို အကြိမ် ၁သောင်း render လုပ်ထားတာကိုမြင်ရပါမယ်
အဲဒါကို ကျတော်တို့က input မှာ စာလေး နည်းနည်းလောက် ရိုက်ကြည့်လိုက်တဲ့အခါမှာ UI က slow ဖြစ်ပြီးတော့
render ကနှေးနေတာကိုမြင်ရပါလိမ့်မယ်
ကျတော်တို့က တကယ်လို့ နောက်ပိုင်းကျရင် listing တွေအများကြီးထဲကနေပြီးတော့ တခုခုကိုရှာစေချင်တာပဲဖြစ်ဖြစ်
api မှာ search လုပ်တာပဲဖြစ်ဖြစ် ဒီလိုမျိုးတွေကြုံလာရနိုင်ပါတယ်
အဲအတွက်ကြောင့် react ကနေပြီးတော့ useDeferredValue ဆိုတဲ့ Hook တစ်ခုကို create လုပ်ပေးထားပါတယ်
ကျတော်တို့ ဒီမှာ တခု သတိထားမိမှာက memo ဆိုတဲ့ function လေးကို Listing Component မှာ သုံးထားတာပါပဲ
ဘာလို့ သုံးတာလည်းဆိုတော့ ကျတော်တို့က parent ကနေပြီးတော့ state update လုပ်လိုက်တဲ့အခါမှာ child ကိုပါ
re-render လုပ်နေတာမလို့ပါ အဲအတွက်ကြောင့် ကျတော်တို့က memo ဆိုပြီးတော့ child component ကို cache
အနေနဲ့ ထိန်းပေးထားလိုက်ပါတယ်
performance အတွက် လည်းပိုကောင်းသွားတာပေါ့
ကဲ ကျတော်တို့ ဆက်ပြီးတော့ကြည့်လိုက်ကြရအောင်
အဲဒါက ဘယ်လိုမျိုးအလုပ်လုပ်တာလည်းဆိုတော့ ကျတော်တို့ ကုဒ်ကို ဒီလိုလေးပြင်လိုက်ကြရအောင်
import { useState, memo, useDeferredValue } from 'react'
function App () {
const [ text, setText ] = useState("")
const deferredText = useDeferredValue(text)
return ( <>
<input value={text} onChange={ e => setText(e.target.value) } />
<Listing text={deferredText} />
</>
)
}
export default App
memo(function Listing ({ text }) {
let render = []
for(let i = 0 ; i < 10000 ; i++){
render.push(<div key={i}> input : { text } </div>)
}
return ( <> { render } </> )
})
ဒီတစ်ခါမှာ ကျတော်တို့ က useDeferredValue Hook ကို import လုပ်လိုက်ပြီးတော့ သူရဲ့ parameter ထဲမှာ state
ကိုထည့်ပေးလိုက်တာပါ
သူကဘယ်လိုအလုပ်လုပ်သွားတာလည်းဆိုတော့ ကျတော်တို့ debounce / တို့ throttle တို့ အလုပ်လုပ်ပုံနဲ့ တော့
နည်းနည်းဆင်ပါတယ်
တူတော့မတူပါဘူး
သူက ဘယ်လိုမျိုးအလုပ်လုပ်ပေးတာလည်းဆိုတော့ ကျတော်တို့ အပေါ်က ကုဒ်ကို run ပြီးတော့စမ်းကြည့်တဲ့အခါမှာ
တခုထူးခြားတာကိုမြင်ရပါလိမ့်မယ်
အဲဒါက ဘာလည်းဆိုတော့ ကျတော်တို့ input မှာ က စာရိုက်ရင် ခုနက လိုမျိုး UI နှေးတာတို့ဘာတို့မဖြစ်တော့ပဲနဲ့
ကျတော်တို့ပုံမှန်အတိုင်းစာရိုက်သလိုရိုက်လို့ရနေတာကိုပါပဲ
ပြီးတော့ အောက်မှာရှိတဲ့ render list ကလည်း အဆင်ပြေပြေနဲ့ UI update လိုက်လုပ်တာကိုမြင်ရမှာပါ
အဲမှာ သူက ဘယ်လိုမျိုးအလုပ်လုပ်တာလည်းဆိုတော့ ခုနက ပြောခဲ့တဲ့ debounce တို့ throttle တို့ လိုမျိုး
သူက ui update ကို ခနလေး စောင့်ကြည့်တာပါ
ပြောချင်တာက သူက list render ui ကို update မလုပ်သေးခင်မှာ state ရဲ့ update ကိုစောင့်ကြည့်နေပါတယ်
state က ထပ်ပြီးတော့ update မဖြစ်တော့တဲ့အချိန်မှာသူက အဲဒီ final update ကို ပဲ ယူပေးလိုက်တာပါ
ခုနက debounce တို့ က ကျတော့ သူတို့က ခနလေးစောင့်ပြီးတော့မှအကုန်လုံးကို အလုပ်လုပ်စေတာပါ
အခု useDeferredValue က ကျတော့ ဒီလိုမဟုတ်ပါဘူး သူက state update မရှိတော့တဲ့အချိန်မှာ
final state ကိုပဲ ယူပြီးတော့ update လုပ်လိုက်တာပါ
ပိုမြင်သာအောင်လို့ ကျတော်ခုနက ကုဒ်ကို ဒီလိုလေးပြင်လိုက်ပါမယ်
import { useState, memo, useDeferredValue, useEffect } from 'react'
function App () {
const [ text, setText ] = useState("")
const deferredText = useDeferredValue(text)
useEffect(() => {
console.log("This is update for state : ", text)
console.log("This is update for deferred : " , deferredText)
console.log("--------end of render-----------")
}, [deferredText, text])
return ( <>
<input value={text} onChange={ e => setText(e.target.value) } />
<Listing text={deferredText} />
</>
)
}
export default App
memo(function Listing ({ text }) {
let render = []
for(let i = 0 ; i < 10000 ; i++){
render.push(<div key={i}> input : { text } </div>)
}
return ( <> { render } </> )
})
ကျတော်တို့ ဒီလိုလေးထည့်ပြီးတော့ input မှာ စာရိုက်ကြည့်လိုက်ရင် ကျတော်တို့ ဒီလိုလေးမြင်ရပါလိမ့်မယ်

ဒီလောက်ဆိုရင် useDeferredValue Hook ကို နားလည်သွားမယ်လို့ထင်ပါတယ်
Last updated