node.appendChild()와 node.removeChild() 같은 명령형 작업으로 시간에 따라 DOM을 수동으로 업데이트하고 명확한 구조가 없는 다음 코드를 생각해 봅시다:function trySubmit() { // Section 1 let spinner = createSpinner(); formStatus.appendChild(spinner); submitForm().then(() => { // Section 2 formStatus.removeChild(spinner); let successMessage = createSuccessMessage(); formStatus.appendChild(successMessage); }).catch(error => { // Section 3 formStatus.removeChild(spinner); let errorMessage = createErrorMessage(error); let retryButton = createRetryButton(); formStatus.appendChild(errorMessage); formStatus.appendChild(retryButton) retryButton.addEventListener('click', function() { // Section 4 formStatus.removeChild(errorMessage); formStatus.removeChild(retryButton); trySubmit(); }); })}let currentState = { step: 'initial', // 'initial' | 'pending' | 'success' | 'error'};function trySubmit() { if (currentState.step === 'pending') { // Don't allow to submit twice return; } setState({ step: 'pending' }); submitForm().then(() => { setState({ step: 'success' }); }).catch(error => { setState({ step: 'error', error }); });}function setState(nextState) { // Clear all existing children formStatus.innerHTML = ''; currentState = nextState; switch (nextState.step) { case 'initial': break; case 'pending': formStatus.appendChild(spinner); break; case 'success': let successMessage = createSuccessMessage(); formStatus.appendChild(successMessage); break; case 'error': let errorMessage = createErrorMessage(nextState.error); let retryButton = createRetryButton(); formStatus.appendChild(errorMessage); formStatus.appendChild(retryButton); retryButton.addEventListener('click', trySubmit); break; }}function setState(nextState) { // Clear all existing children formStatus.innerHTML = ''; // ... the code adding stuff to formStatus ...setState 호출까지. 렌더링 결과를 디버깅하는 Bug-O는 🐞(n)입니다. 여기서 n은 렌더링 코드 경로의 수입니다. 여기서는 4개일 뿐입니다 (switch에 4개의 경우가 있기 때문입니다).function trySubmit() { if (currentState.step === 'pending') { // Don't allow to submit twice return; }function FormStatus() { let [state, setState] = useState({ step: 'initial' }); function handleSubmit(e) { e.preventDefault(); if (state.step === 'pending') { // Don't allow to submit twice return; } setState({ step: 'pending' }); submitForm().then(() => { setState({ step: 'success' }); }).catch(error => { setState({ step: 'error', error }); }); } let content; switch (state.step) { case 'pending': content = <Spinner />; break; case 'success': content = <SuccessMessage />; break; case 'error': content = ( <> <ErrorMessage error={state.error} /> <RetryButton onClick={handleSubmit} /> </> ); break; } return ( <form onSubmit={handleSubmit}> {content} </form> );}아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!

Prisma 7 릴리스: Rust 제거, 더 빨라지고 향상된 호환성
Inkyu Oh • Back-End
setState는 어떻게 무엇을 해야 할지 알까?
Inkyu Oh • Front-End
RSC에서 Import가 작동하는 방식
Inkyu Oh • Front-End
RSC가 번들러와 통합되는 이유
Inkyu Oh • Front-End