Console을 통해 렌더링과 useState, useEffect가 어떤 순서로 진행되는지 살펴보자
//parents
import { useState, useEffect } from 'react'
import { Child } from './Child';
export const HookFlow = () => {
console.log('Render start');
const [showInput, setShowInput] = useState(() => {
console.log('useState');
return false;
});
const handleClick = () => {
setShowInput(prev => !prev);
};
useEffect(() => {
console.log('useEffect No deps');
return () => {
console.log('[Clean up] No deps');
}
});
useEffect(() => {
console.log('useEffect Empty deps');
return (() => {
console.log('[Clean up] Empty deps');
});
}, []);
useEffect(() => {
console.log('useEffect [show]');
return (() => {
console.log('[Clean up] [show] deps');
})
}, [showInput]);
return (
<>
<button onClick={handleClick}>Search</button>
{showInput && (
<Child />
)}
{console.log('Render end')}
</>
);
}
// child
import { SetStateAction, useEffect, useState } from "react";
export const Child = () => {
console.log(' Child render start');
const [text, setText] = useState(() => {
console.log(' Child useState');
return '';
});
useEffect(() => {
console.log(' Child use Effect No deps');
return () => {
console.log(' Child [clean up] No deps');
}
});
useEffect(() => {
console.log(' Child use Effect Empty deps');
return () => {
console.log(' Child [clean up] No deps');
}
}, []);
useEffect(() => {
console.log(' Child use Effect Empty [text]');
return () => {
console.log(' Child [clean up] [text] deps');
}
}, [text]);
const handleChange = (e: { target: { value: SetStateAction<string>; }; }) => {
setText(e.target.value);
}
const elem = (
<>
<input onChange={handleChange} value={text} />
<p></p>
</>
);
console.log(' Child render end');
return (
elem
)
}