ęļ°ëģļė ėžëĄ stateę° ëģí ëë§ëĪ App ėŧīíŽëíļ ëīė ëŠĻë ė―ëę° ë°ëģĩ ėĪíëëĪ.
ę·ļëŽë App ėŧīíŽëíļė ėžëķ ė―ëë
App ėŧīíŽëíļę° ėēė ë ëë§ë ëë§ ėĪí
ëëëĄ íęģ , ėīíė stateę° ëģí ëë ėĪíëė§ ėëëĄ
í íėę° ėëĪ. ex) API íļėķ
import { useState } from "react";
function App() {
const [counter, setValue] = useState(0);
const onClick = () => setValue((prev) => prev + 1);
console.log("call an api"); // stateę° ë°ë ëë§ëĪ ė―ėė ė°íëĪ
return (
<div>
<h1 className={styles.title}>{counter}</h1>
<button onClick={onClick}>Click</button>
</div>
);
}
export default App;
useEffect()ë 2ę°ė ėļėëĨž ë°ëëĪ.
ėēŦ ëēė§ļ ėļėë ęļ°ëģļė ėžëĄ ėŧīíŽëíļ ë ëë§ ė í ëēë§ ėĪíë ė―ëėīëĪ.
import { useEffect, useState } from "react";
function App() {
const [counter, setCounter] = useState(0);
const onClick = () => setCounter((prev) => prev + 1);
console.log("íė ėĪíëë ė―ë");
useEffect(() => console.log("call the api..."), []);
return (
<div>
<h1 className={styles.title}>{counter}</h1>
<button onClick={onClick}>Click</button>
</div>
);
}
export default App;
ë ëēė§ļ ėļėë ëģíëĨž ė§ėžëģž stateëĨž ėėīí
ėžëĄ ę°ė§ë ë°°ėīė ë°ëëĪ.
Reactę° íīëđ stateëĨž ė§ėžëģīëĪę° ę·ļ stateę° ëģęē―ëė ëėë ėēŦ ëēė§ļ ėļėëĄ ë°ė ė―ëëĨž ėĪííëĪ.
import { useEffect, useState } from "react";
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("íė ėĪíëë ė―ë"); // íė ėĪí
useEffect(() => console.log("API íļėķ..."), []); // ėŧīíŽëíļ ėēė ë ëë§ ė í ëēë§ ėĪí
useEffect(() => console.log(keyword, "ęēė"), [keyword]); // ã + keword state ëģęē―ë ëë§ëĪ ėĪí
return (
<div>
<input
value={keyword}
onChange={onChange}
type="text"
placeholder="ėŽęļ°ė ęēė..."
/>
<h1 className={styles.title}>{counter}</h1>
<button onClick={onClick}>íīëĶ</button>
</div>
);
}
export default App;
ëĪë§ íėŽë inputė keywordëĨž ė ë Ĩíė§ ėėë ėŧīíŽëíļę° ėēė ë ëë§ë ë ëŽīėĄ°ęąī ęēėė íęļ° ëëŽļė keywordę° ė ë Ĩëė ëë§ ęēėíëëĄ ėė íëĪ.
useEffect(() => {
if (keyword !== "" && keyword.length > 5) {
console.log(keyword, "ęēė");
}
}, [keyword]);
ðĄ useEffect() VS memo()
useEffect()
: ëėž ėŧīíŽëíļėė stateę° ëģíė ë ėžëķ ė―ëę° ėĪíëė§ ėëëĄ íëĪ.
memo()
: ëķëŠĻ ėŧīíŽëíļėė stateę° ëģíė ë ę·ļęēėī ėė ėŧīíŽëíļė propęģž ė°ęē°ëėī ėė§ ėėžëĐī ëķëŠĻ ėŧīíŽëíļė stateę° ëģíīë ėė ėŧīíŽëíļë ëĶŽë ëë§ ëė§ ėëëĄ íëĪ.
ëĪė ė―ëė ë°ëĨīëĐī, ëēížė ëëĨž ëë§ëĪ showingė ę°ėī ëģíëĐīė Hello ėŧīíŽëíļę° ėŽėėąëëĪ.
ë°ëžė, ę·ļëë§ëĪ(ėĶ, showingė ę°ėī trueę° ë ëë§ëĪ) Hello ėŧīíŽëíļė useEffect() ėė ė―ëę° ėĪíëëĪ.
import { useEffect, useState } from "react";
function Hello() {
useEffect(() => console.log("Hello ėŧīíŽëíļ ëĶŽë ëë§"));
return <h1>ėë
</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;
ę·ļë°ë° ėŧīíŽëíļę° ėėąë ëëŋ ėëëž íęīīë ëë íđė ė―ëëĨž ėĪííëëĄ í ė ėëĪ.
ėīëĨž ėíī useEffectė ėíī ėĪíë íĻė(ė―ë°ą íĻė)ę° cleanup functionė return íëëĄ íīėž íëĪ.
cleanup functionėīë ėŧīíŽëíļę° íęīīë ë ėĪíë ė―ëëĨž ëīė íĻė
ëĨž ë§íëĪ.
function Hello() {
// cleanup function(ėŧīíŽëíļę° íęīīë ë ėĪíë ė―ëëĨž ëīė íĻė)
const byFn = () => console.log("ėŧīíŽëíļ íęīī");
// useEffectė ėíī ėĪíë íĻė(ė―ë°ą íĻė)
const hiFn = () => {
console.log("ėŧīíŽëíļ ėėą");
return byFn;
};
useEffect(hiFn, []);
return <h1>ėë
</h1>;
}
ííļ, ė ė―ëę° ėīíīíęļ°ë ė―ė§ë§ ëģīíĩė ë°ëĄ íĻėëĨž ëđžė§ ėęģ useEffect() ėė ëŠĻë ė―ëëĨž ėėąíëĪ.
function Hello() {
useEffect(() => {
console.log("ėŧīíŽëíļ ėŽėėą");
return () => console.log("ėŧīíŽëíļ íęīī");
}, []);
return <h1>ėë
</h1>;
}
ðĄ
useEffect()
ëĨž ėŽėĐíëĐī ėŧīíŽëíļę° ėėąë ë, stateę° ëģíí ë, ėŧīíŽëíļę° íęīīë ë ëŠĻë íđė ė―ëëĨž ėĪíí ė ėëĪ. ėĶ, íđė ė―ëė ėĪí ėė ė ėĪė í ė ėëĪ.