<script>
function App() {
const [value, setValue] = React.useState("Save Changes");
const chageValue = () => setValue("Revert Changes");
return (
<div>
<Btn print={value} onClickThen={chageValue} />
<Btn print="Confirm" />
</div>
);
const MemorizedBtn = React.memo(Btn)
function App() {
const [value, setValue] = React.useState("Save Changes");
const chageValue = () => setValue("Revert Changes");
return (
<div>
<MemorizedBtn print={value} onClickThen={chageValue} />
<MemorizedBtn print="Confirm" />
</div>
);
</script>
-prop가 변했다 -> state가 변했다

<script src="https://unpkg.com/react@18.3.1/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18.3.1/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/prop-types@15.7.2/prop-types.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
# print에는 string 타입이, fontSize에는 number 가 들어가야된다고
Btn.propTypes = {
print: PropTypes.string,
fontSize: PropTypes.number,
};
function App() {
return (
<div>
<Btn print={"Sava Changes"} fontSize={22} />
<Btn print={22} fontSize={"Continue"} />
</div>
);
}
useEffect 에는 2개의 argument가 있는데
첫번째 argument에는 딱 한 번만 실행하고 싶은 코드
두번째 argument에는 state 값을 적어주고 이 state값이 변할 때만 실행하고 싶은 코드
state값이 변경되면서 re-rendering 되지만, useEffect를 사용해서 계속해서 re-rendering 되지않고 한번만 실행시키는 함수를 만들 수 있다.
useEffect를 이용해서 state가 변함에 따라 계속해서 re-rendering 되지 않고 한 번 실행으로 끝날 수 있게 보호막을 쳐준다.

두번째 argument에 state 명을 적어줌으로써, React에게 "이 state값을 지켜보고, 변화할 때마다 코드를 실행시켜줘" 라고 알려주는 것!
useEffect 이해 하는 코드
function App() {
const [counter, setValue] = useState(0);
const [keyword, setKeyword] = useState("");
const onClick2 = () => setValue((prev) => prev + 1);
const onChange2 = (event) => setKeyword(event.target.value);
useEffect(() => {
console.log("i run only once (like call API only once");
}, []);
useEffect(() => {
if (keyword !== "" && keyword.length > 5) {
console.log("i run when 'keyword' changes");
}
}, [keyword]);
useEffect(() => {
console.log("i run when 'counter' changes");
}, [counter]);
이렇게 안쓰고
{props} 이렇게 쓰니깐
Error: input is a void element tag and must neither have children nor use dangerouslySetInnerHTML.
이런 경고 창이 나타났다.
input 태그는 자식을 가질 수 없는데 {props} 이렇게 자식을 적어줘서 이렇게 Error 메세지를 보내줬다.
해결 방법으로는 input 태그 안에 value를 이용해서 적어주면 된다.
<input value={props} />
or
<input value={props}></input>
function Hello() {
useEffect(() => {
console.log("created !");
return () => console.log("destroyted -.-");
}, []);
return <h1>This is Hello component</h1>;
}
여기서 Hello 컴포넌트를 클릭하면 creact 가 콘솔창에 출력되고
destroy하면 destroyed -.- 이 출력된다..
신기하네.. return값이 함수를 호출할 때 같이 출력되는 것이 아니라
clean(destroy)될 때 출력된다.
활용 예시는 컴포넌트가 사라질 때 event listener를 지우거나, console.log에 뭔가 보여주거나,
언제 컴포넌트가 create 되고 destroy되는지 살펴볼 수 있게
코드를 고쳐보면
function Hello() {
function destroyFn() {
console.log("now i am DESTROYED ... ");
}
function createFn() {
console.log("i am created ! ");
return destroyFn;
}
useEffect(createFn, []);
return <h1>Hello</h1>;
}
useEffect에 의해서 creactFn이 먼저 한 번만 실행 된다
그리고 컴포넌트가 업서지면 destroyFn 실행한다.