REACT v17 기준으로 작성된 글 입니다.
useState
- 리엑트의 근본, 리엑트에서 값 저장 용도로 사용한다.
- 값을 할당 받고, 값과 변환 함수 ( Set ) 를 반환한다.
- State 값이 변하는 경우 렌더링이 발생한다, 즉 다시 그림을 그린다.
- 변환 함수 ( Set ) 은 콜백을 인자로 받아 기존 상태값을 얻을 수 있다.
기본 사용법
import React, { useState } from "react";
const App = () => {
const [name, setName] = useState("");
return (
<div>
<span> 내 이름은 { name } </span>
</div>
)
}
return App;
여러 input 태그에 state 하나로 바인딩 하는 방법
import React, { useCallback, useState } from "react";
const Login = () => {
const [form, setForm] = useState({
id: "",
pw: "",
});
const onChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
setForm((prevState) => {
return {
...prevState,
[e.target.name]: e.target.value,
};
});
}, []);
const onSubmit = (e: React.FormEvent) => {
e.preventDefault();
};
return (
<form onSubmit={onSubmit}>
<div>
<input value={form.id} name="id" onChange={onChange} />
<input type="password" value={form.pw} name="pw" onChange={onChange} />
</div>
<div>
<button type="submit">
로그인
</button>
</div>
</form>
);
};
export default Login;
useRef
useRef 는 크게 두가지 방법으로 사용된다.
- 컴포넌트 변화와 상관없는 변수 값을 가지는 경우
- React DOM 객체를 참조할 경우
import React, { useRef } from "react";
const App = () => {
const isBoolean = useRef(false);
const refDom = useRef<HTMLInputElement>(null);
const onBtn = () => {
refDom.current = true;
}
return (
<div>
<input ref={refDom} />
<button onClick={onBtn}>버튼</button>
</div>
)
}
export defualt App;
useEffect
- Class React 시절의 componentDidMount , shouldComponentUpdate , componentWillUnmount를 묶어서 표현하는 훅 이다
- 첫번째 인자로 콜백 함수를, 두번째 인자로 배열을 받는다.
- 리엑트 실행주기와 가장 연관도가 높으며 해당 내용을 이해해야 적용이 수월하다.
componentDidMount 방식
- 컴포넌트가 랜더링 된 이후 처음 한번 실행되는 이펙트, 주로 서버 통신이나, 랜더링 후 필요한 작업을 작성한다.
useEffect(() => {
console.log("component did mount !!");
}, []);
shouldComponentUpdate 방식
- 참조하는 값의 변화에 따라 재 랜더링 후 실행될 함수
- shouldComponentUpdate 와의 차이는 최초 랜더링시에도 이펙트가 발생한다.
따라서 Update 시에만 발생할 함수를 구현 할 경우 추가적인 조작이 필요하다. (2번째 코드)
useEffect(() => {
console.log(" update !! ");
}, [ value ]);
const [value, setValue] = useState(100);
const isInit = useRef(false);
useEffect(() => {
if(!isInit.current){
isInit.current = true;
}else{
...
}
}, [ value ]);
componentWillUnmount 방식
- 해당 컴포넌트가 화면에서 제거 되었을 때 발생하는 이펙트
- return 함수 내부가 실행된다.
useEffect(() => {
return () => {
console.log(" component unmount !! ");
}
}, [])
useReducer
- useReducer 는 첫번째 인자로 액션과 상태를 처리하는 reducer 를 두번째 인자로 초기 값을 받는다.
- useReducer 가 리턴한 state 와 dispatch 를 이용해 상태관리한다.
- dispatch 로 타입과 액션값을 가진 객체를 전달하여 상태관리
import React, { useReducer } from 'react';
const INCREMENT = 'INCREMENT';
const DECREMENT = 'DECREMENT';
const RENAME = 'RENAME';
const reducer = (state, action) => {
switch(action.type){
case INCREMENT:
return {
...state,
age: state.age + 1
};
case DECREMENT:
return {
...state,
age: state.age - 1
};
case RENAME:
return {
...state,
name: action.name
};
default :
return state;
}
}
const initialState = {
age: 20,
name: 'default'
}
const Test = () => {
const [ state, dispatch ] = useReducer(reducer, initialState);
const upClickHandler = e => {
dispatch({type: INCREMENT});
}
const downClickHandler = e => {
dispatch({type: DECREMENT});
}
const ChangeHandler = e => {
dispatch({type: RENAME, name: e.target.value });
}
return(
<div>
<button onClick={ upClickHandler }>증가</button>
<button onClick={ downClickHandler }>감소</button>
<input type="text" value={state.name} onChange={ ChangeHandler } />
<p>나이: { state.age }</p>
<p>이름: { state.name }</p>
</div>
)
}
export default Test;
useCallback & useMemo
불필요한 리랜더링을 막기위한 최적화 hooks 로 둘은 약간 차이가 존재한다.
useCallback
- 함수 그 자체를 Memorize 하기 위한 기능
- 주로 Event Handler 에 적용된다.
const onBtn = useCallback(() => {
alert("btn");
}, []);
useMemo
- 함수 연산의 결과값을 Memorize 하기 위한 기능
There might be incorrect information or outdated content.
'Web > React' 카테고리의 다른 글
[REACT] react router “/” handling (0) | 2023.08.03 |
---|---|
[REACT] react-query 에러 순서 (0) | 2023.08.02 |
[REACT] react-query (v3) (0) | 2023.08.02 |
[REACT] Unexpected token '<' issue 🔥 (0) | 2023.07.29 |
[REACT] CRA version up issue 🔥 (0) | 2023.07.29 |