2019.09.04 React LT会の発表資料です。 https://informetis.connpass.com/event/142183/
useRefʹ͍ͭͯௐͯΈͨ@shibe972019.9.4 React LTձ
View Slide
ࣲా فΥϯλגࣜձࣾͰmicroCMSͱ͍͏ϔουϨεCMSΛ࡞͍ͬͯ·͢ɻීஈReact͍Ͱɺ࠷ۙVueͪΐͬͱ৮Γ·͢ɻ@shibe97
ೖྗϑΥʔϜͱAPIΛඵͰ࡞Ͱ͖ΔαʔϏε
React Hooksͱ• React 16.8͔ΒՃ͞Εͨػೳ• Functional ComponentʹClass Componentͱಉ༷ͷॲཧ͕ Ͱ͖ΔΑ͏ʹՃ͞Εͨ• stateϥΠϑαΠΫϧ૬ͷͷ
useRefͱ• DOMͷࢀরʹ͑Δ• ࠶ඳըͤ͞ͳ͍มཧ͕Ͱ͖Δ
DOMͷࢀরʹ͑ΔʢެࣜྫΑΓʣfunction TextInputWithFocusButton() {const inputEl = useRef(null);const onButtonClick = () => {// `current` points to the mounted text input elementinputEl.current.focus();};return (<>Focus the input>);}
࠶ඳըͤ͞ͳ͍มཧ͕Ͱ͖Δ• refΦϒδΣΫτΛcurrentϓϩύςΟʹอ࣋͢Δ• ࠶ඳը࣌ɺຖճಉ͡refΦϒδΣΫτΛฦ͢• currentʹೖͯ͠࠶ඳը͞Εͳ͍{current: initialValue}
useRefͷ࣮function mountRef(initialValue: T): {current: T} {const hook = mountWorkInProgressHook();const ref = {current: initialValue};if (__DEV__) {Object.seal(ref);}hook.memoizedState = ref;return ref;}function updateRef(initialValue: T): {current: T} {const hook = updateWorkInProgressHook();return hook.memoizedState;}ϝϞϦ্ͷΛຖճฦ͚ͩ͢ϝϞϦ্ͰΦϒδΣΫτΛอ࣋currentϓϩύςΟʹΛอ࣋
͜ͷΈΛར༻Ͱ͖ΔྫͬͯͳΜͩΖ͏
DOMͩʂ
inputཁૉͷྫ: useStatefunction TextInput() {const [ text, setText ] = useState(‘’);const onChange = useCallback(e => {setText(e.target.value);};return ();}ςΩετΛมߋ͢Δͨͼʹඳը͞ΕΔ
inputཁૉͷྫ: useRefʢcurrentࢦఆʣfunction TextInput() {const { current } = useRef(null);const onChange = useCallback(e => {current = e.target.value;});return ();}ςΩετΛมߋͯ͠࠶ඳը͞Εͳ͍
͋ΕɺͰ͜Εͬͯɾɾɾ
inputཁૉͷྫ: useRefʢDOMࢀরʣfunction TextInput() {const inputEl = useRef(null);return ();}ͪΖΜ͜ͷํ๏࠶ඳը͞Εͳ͍
·ͱΊ• useRefΛอ࣋Ͱ͖Δ্ʹɺมߋͯ͠࠶ඳը͞Εͳ͍• inputཁૉʹuseStateΑΓuseRefͷํ͕ύϑΥʔϚϯεྑ͍• ͪΖΜControlled Componentʹ͍ͨ͠߹useStateʹ͢Δඞཁ͋Γ
͓·͚
useRefΦϒδΣΫτΛࢀর͍ͯ͠Δ͔Β෦ϓϩύςΟมߋͨ͠ͱ͜ΖͰ࠶ඳը͞Εͳ͍ΜͩΖ͏
Α͠ɺLTωλ͜ΕͰ͍͜͏ʂ
·ͬͨؔ͘ͳ͔ͬͨ
Thanks :)@shibe97