h e 1 1 o !

Effect Hook λ³Έλ¬Έ

p r o g r a m m i n g

Effect Hook

hee.hee 2022. 6. 14. 16:50

πŸ“‚ Side Effect


πŸ“Ž μˆœμˆ˜ν•¨μˆ˜λž€?

  • 순수 ν•¨μˆ˜λŠ” 였직 ν•¨μˆ˜μ˜ μž…λ ₯(λ§€κ°œλ³€μˆ˜)만이 ν•¨μˆ˜μ˜ 결과에 영ν–₯을 μ£ΌλŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 이에 따라 순수 ν•¨μˆ˜λŠ” 항상 예츑 κ°€λŠ₯ν•œ λ™μΌν•œ 리턴값을 좜λ ₯ν•©λ‹ˆλ‹€. Math.random() 같은 λ©”μ„œλ“œλŠ” λ™μΌν•œ μž…λ ₯에도 λ‹€λ₯Έ 좜λ ₯이 λ‚˜μ˜¬ 수 μžˆμœΌλ―€λ‘œ 순수 ν•¨μˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€.
  • 였직 λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ „λ‹¬λœ μΈμˆ˜μ—κ²Œλ§Œ μ˜μ‘΄ν•΄ 값을 생성해 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
  • 인수λ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • 외뢀값을 λ§€κ°œλ³€μˆ˜λ‘œ 전달 받을 수 μžˆμ§€λ§Œ λ³€μˆ˜λ‚˜ 객체 자체λ₯Ό μž¬ν• λ‹Ή ν•˜κ±°λ‚˜ λ³€κ²½μ‹œν‚€λŠ” κ²½μš°λŠ” λΉ„μˆœμˆ˜ ν•¨μˆ˜μ΄λ‹€.
  • μ–΄λ–€ μ™ΈλΆ€ μƒνƒœμ—λ„ μ˜μ‘΄ν•˜μ§€ μ•ŠμœΌλ©° μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜μ§€λ„ μ•ŠλŠ”λ‹€.
  • ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ™ΈλΆ€ μƒνƒœλ₯Ό 직접 μ°Έμ‘°ν•˜λ©΄ μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜κ²Œ λ˜μ–΄ 값이 λ³€ν•  수 μžˆλ‹€.
  • μ–΄λ–€ ν•¨μˆ˜κ°€ μ„œλ²„μ— λ„€νŠΈμ›Œν¬ μš”μ²­μ„ 보낸닀면 이둜 인해 μ„œλ²„μ˜ 데이터에 Side Effectλ₯Ό μΌμœΌν‚¬ 수 있고, 이에 따라 ν•΄λ‹Ή ν•¨μˆ˜λŠ” 순수 ν•¨μˆ˜κ°€ μ•„λ‹ˆλ‹€.

πŸ“Ž side effectλž€?

  • ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ™ΈλΆ€μ˜ 값에 κ΄€μ—¬ν•˜λŠ” 경우 Side λ‹€Effectκ°€ μžˆλ‹€κ³  ν•©λ‹ˆλ‹€. 순수 ν•¨μˆ˜μ˜ 좜λ ₯값에 영ν–₯을 λ―ΈμΉ˜λŠ” μž‘μ—…λ“€μ΄ λ°”λ‘œ Side Effect라고 ν•  수 μžˆκ² μŠ΅λ‹ˆλ‹€. μ•žμœΌλ‘œ μ—¬λŸ¬λΆ„μ˜ 코딩에 μžˆμ–΄μ„œ Side Effectλ₯Ό μ΅œμ†Œν™”ν•˜κ±°λ‚˜ λ”°λ‘œ λΆ„λ¦¬ν•˜μ—¬ ν•¨μˆ˜λ‘œ λ¬Άμ–΄μ£ΌλŠ” μž‘μ—…μ€ ν•΄λ‹Ή ν”„λ‘œμ νŠΈλ‚˜ μ†Œν”„νŠΈμ›¨μ–΄μ˜ μœ μ§€λ³΄μˆ˜λ₯Ό μ’€ 더 μˆ˜μ›”ν•˜κ²Œ ν•΄μ€λ‹ˆλ‹€.

"μ–΄λ–€ μ•‘μ…˜μ΄ λ‹€λ₯Έ μ•‘μ…˜μ„ μœ λ°œν•˜λ©΄ side effect"

데이터 κ°€μ Έμ˜€κΈ°, ꡬ독(subscription) μ„€μ •ν•˜κΈ°, μˆ˜λ™μœΌλ‘œ React μ»΄ν¬λ„ŒνŠΈμ˜ DOM을 μˆ˜μ •ν•˜λŠ” κ²ƒκΉŒμ§€ 이 λͺ¨λ“  것이 side effects.

λ¦¬μ•‘νŠΈ μ»΄ν¬λ„ŒνŠΈμ—μ„œμ˜ side effectλŠ” 타이머λ₯Ό μ‚¬μš©ν•  λ•Œ(setTimeout), 데이터 κ°€μ Έμ˜¬ λ•Œ(fetch API, AJAX μš”μ²­, localStorage), HTTP Request λ“±μ—μ„œ μΌμ–΄λ‚œλ‹€. side Effectκ°€ μΌμ–΄λ‚˜λŠ” κ²½μš°λŠ” useEffect둜 λ„£μ–΄μ€˜μ•Όν•œλ‹€.

 

 

 

πŸ“ƒ  μ˜ˆμ œ

λ‹€μŒ 보기의 sum ν•¨μˆ˜ 쀑 순수 ν•¨μˆ˜μΈ 것을 κ³ λ₯΄μ„Έμš”.

//1
let c = 12;
function sum(a, b){
	c = a * b;
	return a + b;
}
//μ™ΈλΆ€μ˜ λ³€μˆ˜μΈ cλ₯Ό μ‚¬μš©

λ¦¬μ•‘νŠΈ μ»΄ν¬λ„ŒνŠΈμ—μ„œμ˜ side effectλŠ” νƒ€μ΄λ¨Έλ₯Ό μ‚¬μš©ν•  λ•Œ(setTimeout), λ°μ΄ν„° κ°€μ Έμ˜¬ λ•Œ(fetch API, AJAX μš”μ²­, localStorage) μΌμ–΄λ‚œλ‹€. side Effectκ°€ μΌμ–΄λ‚˜λŠ” κ²½μš°λŠ” useEffect둜 λ„£μ–΄μ€˜μ•Όν•œλ‹€.

//2
const obj = {value: 12};
function sum(obj, num){
	return {value: obj.value + num};
}
// 객체 objλ₯Ό 인자둜 λ°›μ•„μ„œ μ‚¬μš©ν•œλ‹€. 객체 킀값을 λ°”κΎΈμ§€ μ•Šκ³ , 인자둜 λ°›μ•„μ™”μœΌλ‹ˆ μˆœμˆ˜ν•¨μˆ˜
//3
const obj = {value: 12};
function sum(obj, num){
	obj.value += num;
}
//objλ₯Ό 인자둜 λ°›μ•˜μ§€λ§Œ obj.value 값을 μž¬ν• λ‹Ήν•˜κ³  μžˆλ‹€. μ™ΈλΆ€μ˜ 객체 값을 λ°”κΎΈκ³  μžˆμœΌλ‹ˆ λΉ„μˆœμˆ˜ ν•¨μˆ˜μ΄λ‹€.
//4
Math.sqrt(x)
//x의 제곱근 값은 항상 κ°™λ‹€. μˆœμˆ˜ν•¨μˆ˜μ΄λ‹€.
//5
Math.random()
// 0이상 1미만의 λ‚œμˆ˜λ₯Ό λ§Œλ“œλŠ” ν•¨μˆ˜μ΄λ‹€. κ·Έ κ²°κ³Όκ°€ 무엇이 될지 예츑 λΆˆκ°€ν•˜κΈ° λ•Œλ¬Έμ— λΉ„μˆœμˆ˜ ν•¨μˆ˜μ΄λ‹€.

 

 

 

 

 

 

πŸ“‚ Effect Hook


Effect Hook을 μ‚¬μš©ν•˜λ©΄ ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈμ—μ„œ side Effectλ₯Ό μˆ˜ν–‰ν•  수 μžˆλ‹€.

 

πŸ“Ž Effect Hook - useEffect의 μ‹€ν–‰ 쑰건

useEffectλŠ” μ»΄ν¬λ„ŒνŠΈκ°€ μƒˆλ‘œ λ Œλ”λ§ 될 λ•Œ μ‹€ν–‰λœλ‹€.

μ»΄ν¬λ„ŒνŠΈκ°€ μƒˆλ‘œ λ Œλ”λ§λ˜λŠ” μ„Έ κ°€μ§€ 경우

  • μ»΄ν¬λ„ŒνŠΈ 생성 ν›„ 처음 화면에 λ Œλ”λ§
  • μ»΄ν¬λ„ŒνŠΈμ— μƒˆλ‘œμš΄ propsκ°€ μ „λ‹¬λ˜λ©° λ Œλ”λ§
  • μ»΄ν¬λ„ŒνŠΈμ— μƒνƒœ(state)κ°€ λ°”λ€Œλ©° λ Œλ”λ§

 

 

πŸ“Ž hook을 μ“Έ λ•Œ 주의 사항

  • μ΅œμƒμœ„μ—μ„œλ§Œ Hook을 ν˜ΈμΆœν•œλ‹€propsκ°€ μ „달
  • React ν•¨μˆ˜ λ‚΄μ—μ„œ Hook을 ν˜ΈμΆœν•œλ‹€

 

μ»΄ν¬λ„ŒνŠΈκ°€ μƒˆλ‘œ λ Œλ”λ§λ˜λŠ” μ„Έ κ°€μ§€ 경우

 

 

 

 

 

 

 

πŸ“‚ useEffect의 ν˜•νƒœ


useEffect의 두가지 ν˜•νƒœ (별코딩, https://www.youtube.com/watch?v=kyodvzc5GHU)

πŸ“Ž 1. 인자둜 μ½œλ°±ν•¨μˆ˜λ₯Ό λ°›μŒ

μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§ 될 λ•Œλ§ˆλ‹€ 콜백이 μ‹€ν–‰λœλ‹€.

(처음 마운트, λ‹€μ‹œ λžœλ”λ§ 될 λ•Œλ§ˆλ‹€ 맀번 콜백 호좜)

μ½œλ°±ν•¨μˆ˜λŠ” λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈν‰κ°€ ν›„, μ‹€ν–‰λœλ‹€(μ˜μ‘΄μ„±μ΄ 바뀐 경우)-> 이게 λ­” 말이지? 

 

πŸ“Ž 2. μ½œλ°±ν•¨μˆ˜μ™€ λ°°μ—΄(defendency array)을 λ°›μŒ

처음 마운트, λ°°μ—΄(κ°’μ˜ λͺ©λ‘) μ•ˆ μš”μ†Œμ˜ 값이 λ°”λ€” λ•Œ μ‹€ν–‰ λœλ‹€.

λ°°μ—΄ μ•ˆμ˜ 값이 state둜 μ—…λ°μ΄νŠΈ λ˜λŠ” 경우λ₯Ό μƒκ°ν•˜λ©΄ λœλ‹€.

 

πŸ“Ž 2-1. 빈 배열인 경우,  μ²˜μŒ 마운트 λ•Œλ§Œ 콜백 호좜

처음 단 ν•œ 번, μ™ΈλΆ€ APIλ₯Ό 톡해 λ¦¬μ†ŒμŠ€λ₯Ό λ°›μ•„μ˜€κ³  더 이상 API 호좜이 ν•„μš”ν•˜μ§€ μ•Šμ„ λ•Œμ— μ‚¬μš©ν•  수 μžˆλ‹€.

 

 

πŸ“ƒ  μ˜ˆμ œ useEffect의 μ„Έ κ°€μ§€ ν˜•νƒœ

function App() {
	const [keyword, setKeyword] = userState("");
	const onChange = (event) => seyKeyword(event.target.value);

	useEffect(() => {
		console.log("λ‚˜λŠ” μ—…λ°μ΄νŠΈκ°€ 될 λ•Œλ§ˆλ‹€ μž‘λ™ν•΄") // 1
	})

	useEffect(() => {
		console.log("λ‚˜λŠ” keywordκ°€ λ°”λ€” λ•Œλ§ˆλ‹€ μž‘λ™ν•΄") // 2
	},[keyword])
    
	useEffect(() => {
		console.log("λ‚˜λŠ” 처음만 μž‘λ™ν•΄") // 2-1
	},[])
    

	return (
		<div>
			<input
				value={keyword}
				onChange={onChange}
				type="text"
				placeholder="검색창..."
			/>
		</div>
	)
}

 

 

 

 

πŸ“‚ Dependency Array


쒅속성 λ°°μ—΄μ΄λž€, useEffect의 λ‘λ²ˆμ§Έ 인자둜 λ“€μ–΄κ°€λŠ” 배열을 λ§ν•œλ‹€.

Dependency Array(쒅속성 λ°°μ—΄)은 effect hook의 첫 번째 인자인 ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ” 쑰건을 λ‹΄κ³  μžˆλŠ” 두 번째 μΈμžμž…λ‹ˆλ‹€. useEffect(ν•¨μˆ˜, [쒅속성1, 쒅속성2, ...]) ν˜•νƒœλ‘œ λ‚˜νƒ€λ‚΄μ–΄μ§€λ©° 각 쒅속성은 ν‘œν˜„식이 μ•„λ‹Œ μ–΄λ–€ κ°’μœΌλ‘œ ν• λ‹Ήν•©λ‹ˆλ‹€.
쒅속성 배열은 λ°˜λ“œμ‹œ μ‘΄μž¬ν•˜μ§€λŠ” μ•Šμ•„λ„ λ©λ‹ˆλ‹€. 두 번째 인자λ₯Ό λΉ„μš°κ³  useEffect(ν•¨μˆ˜)의 κΈ°λ³Έ ν˜•νƒœλ‘œλ§Œ μž‘μ„±ν•˜λ©΄, ν•΄λ‹Ή effect hook의 ν•¨μˆ˜λŠ” λ‹€μŒ μ„Έ κ°€μ§€ 쑰건에 따라 μ‹€ν–‰λ©λ‹ˆλ‹€.
  • μ»΄ν¬λ„ŒνŠΈ 생성 ν›„ 처음 화면에 λ Œλ”λ§(ν‘œμ‹œ)
  • μ»΄ν¬λ„ŒνŠΈμ— μƒˆλ‘œμš΄ propsκ°€ μ „λ‹¬λ˜λ©° λ Œλ”λ§
  • μ»΄ν¬λ„ŒνŠΈμ— μƒνƒœ(state)κ°€ λ°”λ€Œλ©° λ Œλ”λ§

쒅속성 배열에 λ„£μ–΄μ€˜μ•Ό ν•˜λŠ” 경우 / μ•„λ‹Œ κ²½μš°κ°€ ν—·κ°ˆλ¦¬λ©΄ μ•„λž˜ 링크 μ°Έκ³ 

https://www.udemy.com/course/best-react/learn/lecture/28520645#questions

effect ν•¨μˆ˜μ—μ„œ μ‚¬μš©ν•˜λŠ” λͺ¨λ“  "것듀"을 μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€. κ΅¬μ„± μš”μ†Œ(λ˜λŠ” 일뢀 μƒμœ„ ꡬ성 μš”μ†Œ)κ°€ λ‹€μ‹œ λ Œλ”λ§ λ˜μ–΄ μ΄λŸ¬ν•œ "것듀"이 변경될 수 μžˆλŠ” 경우.κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ»΄ν¬λ„ŒνŠΈ ν•¨μˆ˜μ— μ •μ˜λœ λ³€μˆ˜λ‚˜ μƒνƒœ, μ»΄ν¬λ„ŒνŠΈ ν•¨μˆ˜μ— μ •μ˜λœ props λ˜λŠ” ν•¨μˆ˜λŠ” μ’…μ†μ„±μœΌλ‘œ μΆ”κ°€λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€!

μ‰½κ²Œ 말해, sideEffect의 μ½œλ°±ν•¨μˆ˜μ˜ 결과에 영ν–₯을 λ―ΈμΉ˜λŠ” 것듀을 λ„£μœΌλ©΄ λœλ‹€.

 

 

 

πŸ“‚ 클린업


타이머, 이벀트 λ¦¬μŠ€λ„ˆ λ“± ν•¨μˆ˜ 마치고 μ’…λ£Œμ‹œμΌœμ€Œ

useEffect μ•ˆμ—μ„œ 리턴 κ°’μœΌλ‘œ (μ •λ¦¬ν•˜λŠ”)ν•¨μˆ˜λ₯Ό λ„£μ–΄μ€€λ‹€.

 

const Timer = (props) => {
 useEffect(() => {        // μ½œλ°±ν•¨μˆ˜μ™€ 배열을 λ°›λŠ” useEffect 
 const timer = setInterval() => {
   console.log('타이머 λŒμ•„κ°€λŠ” 쀑')
   }, 1000);
   
   return () => { 
   clearInterval(timer); //클린업
   console.log('타이머 클리어')
   };
 }, []); // λΉˆλ°°μ—΄
 
 return (
 <div>
   <span>타이머λ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€></span>
 </div>
 );
 };

 

μ‚¬μ΄λ“œμ΄νŽ™νŠΈ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜κΈ° 전에 싀행됨.

 

 

 

 

 

πŸ“‚ λ¦¬μ•‘νŠΈμ—μ„œ 데이터λ₯Ό ν•„ν„°ν•˜λŠ” 두 κ°€μ§€ 방법


πŸ“Ž μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ 필터링

처음 단 ν•œ 번, μ™ΈλΆ€ APIλ‘œλΆ€ν„° 전체 λͺ©λ‘ 데이터λ₯Ό 뢈러였고, λͺ©λ‘μ„ κ²€μƒ‰μ–΄λ‘œ filter ν•˜λŠ” 방법

 

πŸ“Ž μ»΄ν¬λ„ŒνŠΈ μ™ΈλΆ€μ—μ„œ 필터링

μ»΄ν¬λ„ŒνŠΈ μ™ΈλΆ€λ‘œ API μš”μ²­μ„ ν•  λ•Œ, 필터링 ν•œ κ²°κ³Όλ₯Ό λ°›μ•„μ˜€λŠ” 방법 (보톡, μ„œλ²„μ— 맀번 검색어와 ν•¨κ»˜ μš”μ²­ν•˜λŠ” κ²½μš°κ°€ 이에 ν•΄λ‹Ή)

 

πŸ“Ž λ‘λ°©μ‹μ˜ 차이점

  μž₯점 단점
μ»΄ν¬λ„ŒνŠΈ λ‚΄ HTTP μš”μ²­μ˜ λΉˆλ„λ₯Ό 쀄일 수 μžˆλ‹€ λΈŒλΌμš°μ €(ν΄λΌμ΄μ–ΈνŠΈ)의 λ©”λͺ¨λ¦¬ 상에 λ§Žμ€ 데이터λ₯Ό κ°–κ²Œ λ˜λ―€λ‘œ, ν΄λΌμ΄μ–ΈνŠΈμ˜ 뢀담이 λŠ˜μ–΄λ‚œλ‹€
μ»΄ν¬λ„ŒνŠΈ μ™Έ ν΄λΌμ΄μ–ΈνŠΈκ°€ 필터링 κ΅¬ν˜„μ„ μƒκ°ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€ λΉˆλ²ˆν•œ HTTP μš”μ²­μ΄ μΌμ–΄λ‚˜κ²Œ 되며, μ„œλ²„κ°€ 필터링을 μ²˜λ¦¬ν•˜λ―€λ‘œ μ„œλ²„κ°€ 뢀담을 κ°€μ Έκ°„λ‹€

 

 

 

 

πŸ“ƒ 예제 1. μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ 필터링

import { useEffect, useState } from "react";
import "./styles.css";
import { getProverbs } from "./storageUtil";

export default function App() {
  const [proverbs, setProverbs] = useState([]);
  const [filter, setFilter] = useState("");

  useEffect(() => {
    console.log("μ–Έμ œ effect ν•¨μˆ˜κ°€ λΆˆλ¦΄κΉŒμš”?");
    const result = getProverbs();
    setProverbs(result);
  }, []);////////////////////////////////////////////// 처음 λ Œλ”λ§ν•  λ•Œλ§Œ effect ν•¨μˆ˜κ°€ 호좜됨

  const handleChange = (e) => {
    setFilter(e.target.value);
  };

  return (
    <div className="App">
      ν•„ν„°
      <input type="text" value={filter} onChange={handleChange} />
      <ul>
        {proverbs
          .filter((prvb) => {
            return prvb.toLowerCase().includes(filter.toLowerCase()); //////////////직접 ν•„ν„°ν•΄μ„œ λ„£μ–΄μ£Όκ³  μžˆλ‹€
          })
          .map((prvb, i) => (
            <Proverb saying={prvb} key={i} />
          ))}
      </ul>
    </div>
  );
}

function Proverb({ saying }) {
  return <li>{saying}</li>;
}

 

πŸ“ƒ 예제 2. μ»΄ν¬λ„ŒνŠΈ μ™ΈλΆ€μ—μ„œ 필터링 

import { useEffect, useState } from "react";
import "./styles.css";
import { getProverbs } from "./storageUtil";

export default function App() {
  const [proverbs, setProverbs] = useState([]);
  const [filter, setFilter] = useState("");
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log("μ–Έμ œ effect ν•¨μˆ˜κ°€ λΆˆλ¦΄κΉŒμš”?");
    const result = getProverbs(filter);
    setProverbs(result);
  }, [filter]); // 3. 쒅속성 배열에 filterλ₯Ό λ„£μ—ˆλ‹€. filterκ°€ 갱신될 λ•Œ λ§ˆλ‹€ useeffect μ•ˆμ˜ ν•¨μˆ˜κ°€ μ‹€ν–‰λœλ‹€

  const handleChange = (e) => { // 2. μΈν’‹μ—μ„œ μ½μ–΄μ˜¨ 이벀트 valueλ₯Ό setFilter에 λ„£μ–΄ filter κ°±μ‹ 
    setFilter(e.target.value);
  };

  const handleCounterClick = () => {
    setCount(count + 1);
  };

  return (
    <div className="App">
      ν•„ν„°
      <input type="text" value={filter} onChange={handleChange} /> // 1.μΈν’‹μ—μ„œ 이벀트λ₯Ό 읽고 μžˆλ‹€
      <ul>
        {proverbs.map((prvb, i) => (
          <Proverb saying={prvb} key={i} />
        ))}
      </ul>
      <button onClick={handleCounterClick}>μΉ΄μš΄ν„° κ°’: {count}</button>
    </div>
  );
}

function Proverb({ saying }) {
  return <li>{saying}</li>;
}

 

 

 

 

 

πŸ“‚ μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œμ˜ AJAX μš”μ²­ 


fetchλ₯Ό μ‚¬μš©ν•œλ‹€. λ¬Όλ‘  side effectλ₯Ό μΌμœΌν‚€λŠ” μ½”λ“œμ΄λ‹ˆ useEffect에 λ„£μ–΄μ€€λ‹€.

데이터λ₯Ό μ–»μ–΄μ˜€λŠ” μ—”λ“œν¬μΈνŠΈλ₯Ό μ‚¬μš©ν•œλ‹€.

useEffect(() => {
  fetch(`http://μ„œλ²„μ£Όμ†Œ/proverbs?q=${filter}`)
    .then(resp => resp.json())
    .then(result => {
      setProverbs(result);
    });
}, [filter]);

 

 

 

 

πŸ“‚ loading indicator


λͺ¨λ“  λ„€νŠΈμ›Œν¬ μš”μ²­μ΄ 항상 즉각적인 응닡을 κ°€μ Έλ‹€μ£ΌλŠ” 것은 μ•„λ‹ˆλ‹€.

μ™ΈλΆ€ API 접속이 느릴 경우λ₯Ό κ³ λ €ν•˜μ—¬, λ‘œλ”© ν™”λ©΄(loading indicator)의 κ΅¬ν˜„μ€ ν•„μˆ˜μ .

 

Loading indicator의 κ΅¬ν˜„ μ—­μ‹œ state이고, side effect이닀.

const [isLoading, setIsLoading] = useState(true);

// μƒλž΅, LoadingIndicator μ»΄ν¬λ„ŒνŠΈλŠ” λ³„λ„λ‘œ κ΅¬ν˜„ν–ˆμŒμ„ κ°€μ •ν•©λ‹ˆλ‹€
return {isLoading ? <LoadingIndicator /> : <div>λ‘œλ”© μ™„λ£Œ ν™”λ©΄</div>}

μ»΄ν¬λ„ŒνŠΈκ°€ κ΅¬ν˜„λ˜λŠ” 리턴문 μ•ˆμ—μ„œ, Loading indicatorκ°€ λ‘œλ”© μ™„λ£Œ 화면을 λŒ€μ²΄ν•œλ‹€κ³  보면 λœλ‹€.

isLoading이 true이면 Loading indicatorκ°€ 좜λ ₯되고, λ Œλ”λ§μ΄ λλ‚˜κ³  isLoading이 false이면 λ‘œλ”©μ™„λ£Œ 화면이 좜λ ₯λœλ‹€.

 

 

useEffect(() => {
  setIsLoading(true);
  fetch(`http://μ„œλ²„μ£Όμ†Œ/proverbs?q=${filter}`)
    .then(resp => resp.json())
    .then(result => {
      setProverbs(result);
      setIsLoading(false);
    });
}, [filter]);

μœ„μ˜ μ˜ˆμ‹œμ²˜λŸΌ λ„€νŠΈμ›Œν¬ 톡신을 톡해 μ„œλ²„λ‘œλΆ€ν„° 데이터λ₯Ό λ°›λŠ” 경우 fetch μš”μ²­μ˜ μ „ν›„λ‘œ setIsLoading을 μ„€μ •ν•΄ μ£Όμ–΄ 보닀 λ‚˜μ€ UXλ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€.

 

 

 

 

 

 

 

πŸ“‚ Reference


https://www.youtube.com/watch?v=kyodvzc5GHU

μ½”λ“œμŠ€ν…Œμ΄μΈ 

 

 

μ°Έκ³