#6.0~ 6.4
💡useState를 배우기전에 왜 필요한가부터 알아보자!
//App.js
import { useState } from "react";
function App() {
const [counter, setCounter] = useState(0); //0부터 시작
const onClick = () => setCounter((prev) => prev + 1);
console.log("render");
return (
<div>
<h1>{counter}</h1>
<button onClick={onClick}>click me!</button>
</div>
);
}
export default App;
button
을 클릭하면 onClick함수가 실행되고 counter를 +1씩 해주는 컴포넌트를 만듬React.useState()
이런식으로 앞에 React.을 작성해줬는데 생략이 가능해짐But‼️ 여기서 문제가 있는데 state(counter)가 변할때마다 컴포넌트 전체가 리렌더링됨.
console.log('call an api')
도 계속 불러옴💡 어떻게 하면 component 내부의 특정 코드가 처음 한번만 실행되고, 다시는 실행되지 않도록 할 수 있을까? => useEffect를 사용하자!!
import { useEffect, useState } from "react";
function App() {
const [counter, setCounter] = useState(0);
const onClick = () => setCounter((prev) => prev + 1);
console.log("i run all the time"); //리렌더링 될때 마다 실행됨
useEffect(() => {
console.log("CALl THE API.."); //처음 한번만 렌더링 됨
}, []);
return (
<div>
<h1>{counter}</h1>
<button onClick={onClick}>click me!</button>
</div>
);
}
export default App;
useEffect
를 제공함useEffect
함수는 우리 코드가 딱 한번만 실행될 수 있도록 보호해줌useEffect(() => {}, []);
글자를 타이핑 할 때마다 리렌더링 되는 문제
=> 사용자가 글자를 타이핑할 때마다 API를 새로 호출하면 비효율적임
function App() {
const [counter, setValue] = useState(0);
const [keyword, setKeyword] = useState('');
const onClick = () => setValue((prev) => prev + 1);
const onChange = (event) => setKeyword(event.target.value);
console.log('i run all the time');
useEffect(() => {
console.log('CALL THE API...');
}, []);
return (
<div>
<input
value={keyword}
onChange={onChange}
type="text"
placeholder="Search here..."
/>
<h1>{counter}</h1>
<button onClick={onClick}>click me!</button>
</div>
);
}
input
의 value가 바뀔 때마다 리렌더링됨.function App() {
const [counter, setValue] = useState(0);
const [keyword, setKeyword] = useState('');
const onClick = () => setValue((prev) => prev + 1);
const onChange = (event) => setKeyword(event.target.value);
console.log('i run all the time');
useEffect(() => {
console.log('CALL THE API...');
}, []);
useEffect(() => {
console.log('Search for', keyword);
}, [keyword]);
//keyword가 바뀔때 마다 리렌더링 하고 싶으면 []안에 keyword를 적으면 됨.
return (
<div>
<input
value={keyword}
onChange={onChange}
type="text"
placeholder="Search here..."
/>
<h1>{counter}</h1>
<button onClick={onClick}>click me!</button>
</div>
);
}
useEffect(() => {}, [])
페이지가 처음 로드될 때 첫번째 argument가 실행된다음, []안의 state가 변화될 때도 첫번째 argument가 실행됨.[]
이 빈칸이면 처음 한번만 렌더링됨.사용자가 영화이름을 검색할때 예시
function App() {
const [counter, setCounter] = useState(0);
const [keyword, setKeyword] = useState("");
const onClick = () => setCounter((prev) => prev + 1);
const onChange = (event) => setKeyword(event.target.value);
console.log("i run all the time");
useEffect(() => {
console.log("CALl THE API..");
}, []);
useEffect(() => {
if (keyword !== "" && keyword.length > 5) {
console.log("SEARCH FOR", keyword);
}
}, [keyword]);
return (
<div>
<input
value={keyword}
onChange={onChange}
type="text"
placeholder="Search here..."
/>
<h1>{counter}</h1>
<button onClick={onClick}>click me!</button>
</div>
);
}
if (keyword !== "" && keyword.length > 5)
조건을 걸어서 조건이 충족되면 [keyword]
가 변경되었을때 리렌더링 되게 할 수 있음.import { useState, useEffect } from 'react';
function App() {
const [showing, setShowing] = useState(false);
const onClick = () => setShowing((prev) => !prev);
return (
<div>
<button onClick={onClick}>{showing ? "Hide" : "Show"}</button>
</div>
);
}
export default App;
useEffect()
에서 parameter로 넣은 함수의 return 함수function Hello() {
return <h1>Hello</h1>;
}
function App() {
const [showing, setShowing] = useState(false);
const onClick = () => setShowing((prev) => !prev);
return (
<div>
{showing ? <Hello /> : null} //js 쓸 때는 중괄호 쓰기
<button onClick={onClick}>{showing ? "Hide" : "Show"}</button>
</div>
);
}
function Hello() {
useEffect(() => {
console.log("created :)");
return () => console.log("destroyed :("); // cleanUp Function
}, []);
return <h1>Hello</h1>;
}
function App() {
const [showing, setShowing] = useState(false);
const onClick = () => setShowing((prev) => !prev);
return (
<div>
{showing ? <Hello /> : null}
<button onClick={onClick}>{showing ? "Hide" : "Show"}</button>
</div>
);
}
function Hello() {
function byeFn() {
console.log("bye :(");
}
function hiFn() {
console.log("created :)");
return byeFn;
}
useEffect(hiFn, []);
return <h1>Hello</h1>;
}
✅ 최종코드
import { useEffect, useState } from "react";
function Hello() {
useEffect(() => {
console.log("hi :)");
return () => console.log("bye :("); // cleanUp Function
}, []);
return <h1>Hello</h1>;
}
function App() {
const [showing, setShowing] = useState(false);
const onClick = () => setShowing((prev) => !prev);
return (
<div>
{showing ? <Hello /> : null}
<button onClick={onClick}>{showing ? "Hide" : "Show"}</button>
</div>
);
}
export default App;