⚛️ react-redux 생활코딩 강의 학습내용 정리 3
앞에서처럼 컴포넌트를 분리하면 종속성은 사라지지만 관리해야 할 컴포넌트가 많아진다는 것이 문제였다. 이를 위해 'react-redux'를 이용한다.
npm install react-redux
connect api를 사용해본다. connect()()는 connect함수에서 함수를 리턴하고, 리턴한 그 함수를 또 실행시킨 값을 export한다.
connect()의 내부 코드는 아래와 같다.
함수 내에서 함수를 return하고, 그 함수에서는 WrappedComponent를 또 return한다. 이 WrappedComponent는 실습에서 따지면 DisplayNumber같은 감싸지는 컴포넌트에 해당한다.
export default connect()(DisplayNumber)
export default connect()(AddNumber)
두번째 괄호에 감싸질 컴포넌트를 인자로 전달하면, 해당 컴포넌트가 랩핑된다. 이 때 AddNumber처럼 클릭 이벤트가 필요한 경우에는 어떻게 이벤트를 전달해야 할까?
첫 번째()에는 첫 번째 인자로 mapStateToProps,그리고 두번째 인자로 mapDispatchToProps를 전달한다.
function mapReduxStateToReactProps(state){ //redux의 state값을 인자로 받는다.
//redux에서 store의 값이 변경될 때 마다 호출
return{
//들어갈 props 이름:store에서 공급될 값
number:state.number
/*
==
초기화: state = {number:store.getState().number}
구독: store.subscribe(function(){
this.setState({number:store.getState().number});
}.bind(this));
전달: number={this.state.number}
위 코드 부분들과 같은 역할을 하게 된다.
*/
}
}
export default connect(mapReduxStateToReactProps)(DisplayNumber)
function mapReduxDispatchToReactProps(dispatch){
//인자로 store.dispatch라는 api를 공급->store import 없이 바로 사용 가능
return {
//props이름:처리할 dispatch 함수
onClick:function(size){
dispatch({type:'INCREMENT',size:size})
}
}
}
export default connect(null,mapReduxDispatchToReactProps)(AddNumber)//전달되는 props는 이벤트 뿐,따라서 첫번째 인자는 필요없음.
위에서처럼 store를 매번 파일에서 불러올 필요 없이 즉시 편하게 사용하려면 다음과 같이 react-redux에서 제공하는 Provider 컴포넌트를 이용하면 된다.
이는 최상위 파일인 index.js에서 Provider라는 react-redux에서 제공하는 컴포넌트를 이용해 App 컴포넌트를 감싸주어야 한다.
Provider 컴포넌트의 props로 store를 전달한다. 이렇게 하면 App 아래의 컴포넌트에서 import를 매번 하지 않아도 store를 이용 가능해진다.