Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

COCSOS - guitar, computer, etc

211218 리액트 다른 훅 본문

Computer/react

211218 리액트 다른 훅

COCSOS 2021. 12. 18. 23:52

리액트 내장 훅

useState
useEffect
useContext
useRef

useMemo, useCallback
=> 메모이제이션


const timerIdRef = useRef(-1)

useEffect(()=>
timerIdRef.current = setTimeout(()=>{}, 1000);
});
=> 타이머는 렌더링과 상관없음 
// 불필요하게 state로 관리할 필요가 없으므로  Ref 객체가 적합하다.







* useMemo
계산량이 많은 함수를 저장

const value = useMemo(()=> runExpensiveJob(v1,v2), [v1,v2]);
useEffect와 마찬가지로 두번째의 배열은 의존성 배열임.
v1,v2 값이 변경될때만 runExpensiveJob이 수행된다.

import React, {useMemo, useState} from 'react'


export default function App(){


	const [v1, setV1] =  useState(0);
	const [v2, setV2] =  useState(0);
	const [v3, setV3] =  useState(0);

	const value = setMemo(()=>runExpensiveJob(v1, v2), [v1,v2])
	//두번째 param? useeffect 처럼 의존성 배열.
	// 각 원소가 변경될때만 함수가 수행된다.


	return <div>
		<p>{`value is ${value}`}</p>	//value가 호출 되며 runExpensiveJob이 1회 호출
		
		<p>{`v3 changed to ${v3}`}</p>
		<button onClick={()=>setV3(Math.random)}>v3 수정</button>
		// 버튼이 눌려서 v3가 변경되어도 runExecuteJob이 호출되지 않는다.
	</div>
}

function runExpensiveJob(v1,v2){
		// 비싼 함수
	return 3;
}

 

 


 

 

* useCallback()

useMemo와 비슷하다. 함수 memoization에 특화..

import React, {useCallback, useState} from 'react'


export default function App(){


	const [name, setName] =  useState(0);
	const [age, setAge] =  useState(0);
	const [v3, setV3] =  useState(0);


	return <div>
		<p>{`name is ${name}`}</p>
		<p>{`age is ${age}`}</p>
		<UserEdit
			onSave={()=>saveToServer({name,age})}
			setName={name}
			setAge={age}
		/>
		<p>{`v3 is  ${v3}`}</p>
		<button onClick={()=>setV3(Math.random)}>v3 수정</button>
	</div>
}


const UserEdit = React.memo(function ({onSave,setName,setAge}){
	console.log('userEdit rendered')
	return null;
});

function saveToServer(a, ..){

	//saved
}

//v3 가 변경이 되어도 saveToServer가 새로 생성되어 전달될것이기때문에 
//UserEdit이 다시 렌더링 됨.

-> 이렇게 변경하기

const onSave = useCallback(()=>{saveToServer({name,age}), [name,age]});

...
<UserEdit
	onSave={save}
	setName={name}
	setAge={age}
/>

useReducer, useRef 는 나중에 다시 보자.. 하나도 모르겠ㅇ움ㅎ

 

'Computer > react' 카테고리의 다른 글

211222 리액트 PropTypes  (0) 2021.12.22
211221 리액트 컴포넌트 작성  (0) 2021.12.21
211218 리액트 ref 속성  (0) 2021.12.18
211218 리액트 Context  (0) 2021.12.18
211215 리액트 입문 - 훅 사용시 주의  (0) 2021.12.15
Comments