useOptimistic
useOptimistic
๋ UI๋ฅผ ๋๊ด์ ์ผ๋ก ์
๋ฐ์ดํธํ ์ ์๊ฒ ํด์ฃผ๋ React Hook์
๋๋ค.
const [optimisticState, addOptimistic] = useOptimistic(state, updateFn);
๋ ํผ๋ฐ์ค
useOptimistic(state, updateFn)
useOptimistic
์ React Hook์ผ๋ก, ๋น๋๊ธฐ ์์
์ด ์งํ ์ค์ผ ๋ ๋ค๋ฅธ ์ํ๋ฅผ ๋ณด์ฌ์ค ์ ์๊ฒ ํด์ค๋๋ค. ์ธ์๋ก ์ฃผ์ด์ง ์ผ๋ถ ์ํ๋ฅผ ๋ฐ์, ๋คํธ์ํฌ ์์ฒญ๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์์
๊ธฐ๊ฐ ๋์ ๋ฌ๋ผ์ง ์ ์๋ ๊ทธ ์ํ์ ๋ณต์ฌ๋ณธ์ ๋ฐํํฉ๋๋ค. ํ์ฌ ์ํ์ ์์
์ ์
๋ ฅ์ ์ทจํ๋ ํจ์๋ฅผ ์ ๊ณตํ๊ณ , ์์
์ด ๋๊ธฐ ์ค์ผ ๋ ์ฌ์ฉํ ๋๊ด์ ์ธ ์ํ๋ฅผ ๋ฐํํฉ๋๋ค.
์ด ์ํ๋ โ๋๊ด์ โ ์ํ๋ผ๊ณ ๋ถ๋ฆฌ๋๋ฐ, ์ค์ ๋ก ์์ ์ ์๋ฃํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ผ๋ ์ฌ์ฉ์์๊ฒ ์ฆ์ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ํ๊ธฐ ์ํด ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
import { useOptimistic } from 'react';
function AppContainer() {
const [optimisticState, addOptimistic] = useOptimistic(
state,
// updateFn
(currentState, optimisticValue) => {
// merge and return new state
// with optimistic value
}
);
}
์๋์ ๋ ๋ง์ ์์ ๋ฅผ ์ฐธ์กฐํ์ธ์.
๋งค๊ฐ๋ณ์
state
: ์์ ์ด ๋๊ธฐ ์ค์ด์ง ์์ ๋ ์ด๊ธฐ์ ๋ฐํ๋ ๊ฐ์ ๋๋ค.updateFn(currentState, optimisticValue)
: ํ์ฌ ์ํ์ addOptimistic์ ์ ๋ฌ๋ ๋๊ด์ ์ธ ๊ฐ์ ์ทจํ๋ ํจ์๋ก, ๊ฒฐ๊ณผ์ ์ธ ๋๊ด์ ์ธ ์ํ๋ฅผ ๋ฐํํฉ๋๋ค. ์์ ํจ์์ฌ์ผ ํฉ๋๋ค.updateFn
์ ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ทจํฉ๋๋ค.currentState
์optimisticValue
. ๋ฐํ ๊ฐ์currentState
์optimisticValue
์ ๋ณํฉ๋ ๊ฐ์ ๋๋ค.
๋ฐํ
optimisticState
: ๊ฒฐ๊ณผ์ ์ธ ๋๊ด์ ์ธ ์ํ์ ๋๋ค. ์์ ์ด ๋๊ธฐ ์ค์ด์ง ์์ ๋๋state
์ ๋์ผํ๋ฉฐ, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐupdateFn
์์ ๋ฐํ๋ ๊ฐ๊ณผ ๋์ผํฉ๋๋ค.addOptimistic
:addOptimistic
๋ ๋๊ด์ ์ธ ์ ๋ฐ์ดํธ๊ฐ ์์ ๋ ํธ์ถํ๋ ๋์คํจ์น ํจ์์ ๋๋ค. ์ด๋ ํ ํ์ ์optimisticValue
๋ผ๋ ํ๋์ ์ธ์๋ฅผ ์ทจํ๋ฉฐ,state
์optimisticValue
๋กupdateFn
์ ํธ์ถํฉ๋๋ค.
์ฌ์ฉ๋ฒ
ํผ์ ๋๊ด์ ์ผ๋ก ์ ๋ฐ์ดํธํ๊ธฐ
useOptimistic
Hook์ ๋คํธ์ํฌ ์์ฒญ๊ณผ ๊ฐ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์ด ์๋ฃ๋๊ธฐ ์ ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋๊ด์ ์ผ๋ก ์
๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ํผ์ ๋งฅ๋ฝ์์, ์ด ๊ธฐ์ ์ ์ฑ์ด ๋ ๋ฐ์์ ์ผ๋ก ๋๊ปด์ง๋๋ก ๋์์ค๋๋ค. ์ฌ์ฉ์๊ฐ ํผ์ ์ ์ถํ ๋, ์๋ฒ์ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ธํฐํ์ด์ค๋ ๊ธฐ๋ํ๋ ๊ฒฐ๊ณผ๋ก ์ฆ์ ์
๋ฐ์ดํธ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ํผ์ ๋ฉ์์ง๋ฅผ ์
๋ ฅํ๊ณ โ์ ์กโ ๋ฒํผ์ ๋๋ฅด๋ฉด, useOptimistic
Hook์ ๋ฉ์์ง๊ฐ ์ค์ ๋ก ์๋ฒ๋ก ์ ์ก๋๊ธฐ ์ ์ โ์ ์ก ์คโฆโ ๋ผ๋ฒจ์ด ์๋ ๋ชฉ๋ก์ ๋ฉ์์ง๊ฐ ์ฆ์ ๋ํ๋๋๋ก ํฉ๋๋ค. ์ด โ๋๊ด์ โ ์ ๊ทผ๋ฒ์ ์๋์ ๋ฐ์์ฑ์ ๋๋์ ์ค๋๋ค. ๊ทธ๋ฐ ๋ค์ ํผ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฉ์์ง๋ฅผ ์ค์ ๋ก ์ ์กํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์๋ฒ๊ฐ ๋ฉ์์ง๋ฅผ ๋ฐ์์์ ํ์ธํ๋ฉด, โ์ ์ก ์คโฆโ ๋ผ๋ฒจ์ด ์ ๊ฑฐ๋ฉ๋๋ค.
import { useOptimistic, useState, useRef } from "react"; import { deliverMessage } from "./actions.js"; function Thread({ messages, sendMessage }) { const formRef = useRef(); async function formAction(formData) { addOptimisticMessage(formData.get("message")); formRef.current.reset(); await sendMessage(formData); } const [optimisticMessages, addOptimisticMessage] = useOptimistic( messages, (state, newMessage) => [ ...state, { text: newMessage, sending: true } ] ); return ( <> {optimisticMessages.map((message, index) => ( <div key={index}> {message.text} {!!message.sending && <small> (Sending...)</small>} </div> ))} <form action={formAction} ref={formRef}> <input type="text" name="message" placeholder="Hello!" /> <button type="submit">Send</button> </form> </> ); } export default function App() { const [messages, setMessages] = useState([ { text: "Hello there!", sending: false, key: 1 } ]); async function sendMessage(formData) { const sentMessage = await deliverMessage(formData.get("message")); setMessages((messages) => [...messages, { text: sentMessage }]); } return <Thread messages={messages} sendMessage={sendMessage} />; }