const [optimisticState, addOptimistic] = useOptimistic(state, updateFn);
UI를 낙관적으로 업데이트할 수 있게 해주는 React Hook
비동기 작업이 진행 중일 때 이미 완료인 것 처럼 보여줄 수 있게 해줌
반환값
optimisticState
: 결과적인 낙관적인 상태. 작업이 대기 중이지 않을 때는state
와 동일하며, 그렇지 않은 경우updateFn
에서 반환된 값과 동일
addOptimistic
: 낙관적인 업데이트가 있을 때updateFn
을 호출하는 dispatch 함수. 어떠한 타입의optimisticValue
라는 하나의 인자를 취함
useOptimistic 매개변수
state
: 작업이 대기 중이지 않을 때 초기에 반환될 값
updateFn(currentState, optimisticValue)
: 낙관적인 상태를 반환하는 순수 함수
ex)
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> </> );
절차
submit 을 누름
→ formAction 실행
→ 비동기 시작 & addOptimisticMessage 호출로 낙관적 업데이트
→ [비동기 완료 전] optimisticMessages 값이 낙관업데이트 된 값으로 나옴
→ [비동기 완료 후] optimisticMessages 값이 원래 값인 messages로 바뀜