
애플리케이션의 UI는 렌더링 시점의 현재 데이터 (상태 = state) 를 나타내야함
hook = 리액트에서 컴포넌트 내의 값을 추적하고 상태와 UI를 동기화 하기 위해 제공하는 몇가지 함수
리액트는 상태와 UI가 동기화 되도록 보장함
useState를 호출하면 값과 갱신 함수를 돌려 받기 때문에 변수가 아닌 useState로 상태를 관리함
const [ selectedRoom, setSelectedRoom ] = useState(initialValue);
- selectedRoom = 리액트가 현재 값을 첫 번째 원소에 대입
- setSelectedRoom = 갱신 함수
- (initialValue) = 초깃값
리액트가 처음 컴포넌트를 실행 할 때 useState는 초깃값을 배열의 첫 번째 요소로 대입함
리액트는 UI가 이전 버전과 다른지 확인 하고 갱신을 일괄 처리하고 스케줄링 하며, 효율적인 DOM 개신 방법을 결정하고, DOM을 처리함
상태 값이 여럿인 경우, useState를 여러 번 호출 할 수 있음
class BookablesList extends React.Component {
constructor (props) {
super(props);
this.state = {
bookableIndex: 1,
group: "Rooms"
};
}
}
handleClick (index) {
this.setState({
bookableIndex: index
});
}
const [bookableIndex, setBookableIndex] = useState(1);
setBookableIndex(3);
function BookableList () {
const [state, setState] = useState({
bookableIndex: 1,
group: "Rooms"
});
}
function handleClick (index) {
setState({
bookableIndex: index
});
}
function handleClick (index) {
setState({
...state,
bookableIndex: index
});
}
function untangle (aFrayedKnot) {
return nugget;
}
function ShinyComponent ({tangledWeb}) {
const [shiny, setShiny] = useState(untangle(tangledWeb));
}
reducer 함수 = 여러 상태 값을 항상 함께 갱신해야만 하거나 상태 갱신 로직이 지나치게 흩어져 있어서 따라가기 어려운 경우 상태 갱신을 대신 관리하는 함수
dispatch 함수 = 액션을 리듀서에게 디스패치 하기 위한 함수 -> 리듀서에게 어떤 액션을 수행할지 전달함
여러가지 갱신 함수(setIsLoading, setError, setPosts 등) 를 호출 해야하는 경우 리액트는 useReducer 훅이라는 더 깔끔한 대안을 제공함
리듀서를 활용하면 상태에 영향을 미치는 명확한 액션을 통해 상태 변경을 중앙 집중식으로 잘 정의해 관리할 수 있음
리듀서는 액션을 사용해 이전 상태로부터 새 상태를 생성함 -> 서로 연관된 여러 상태를 포함할 수 있는 좀 더 복잡한 갱신을 더 쉽게 지정할 수 있음
리액트가 제공하는 useReducer 훅을 통해 컴포넌트의 초기 상태를 지정하고 현재 상태에 접근하며 상태를 갱신하고 재 렌더링을 촉발 할 수 있음
명확하게 정의된 액션을 디스패치 하면 상태 변경을 따라가기 쉽고, 컴포넌트가 여러 이벤트에 대한 응답으로 상태와 상호 작용하는 방식을 이해하기 쉬워짐
let count = 0;
function reducer (state, action) {
if (action === 'inc') {
return state + 1;
}
if (action === 'dec') {
return state - 1;
}
return state;
}
count = reducer(count, 'inc');
count = reducer(count, 'inc');
count = reducer(count, 'dec');
리듀서는 증가와 감소 액션을 처리하고 그 외의 액션이 들어오면 변경하지 않은 카운터 값을 반환함
컴포넌트의 상태와 리듀서를 리액트가 관리하게 하려면 useReducer 훅을 호출 후 useReducer에게 리듀서와 초기 상태를 전달 하면 됨
useReducer는 현재 상태와 디스패치 함수를 포함하는 배열을 반환함
const [state, dispatch] = useReducer(reducer, initialState);