티스토리 뷰
Redux
리덕스의 3가지 규칙
1. 하나의 애플리케이션 안에는 하나의 스토어가 있다.
2. 상태는 읽기 전용이다.
3. 리듀서는 순수한 함수이어야 한다.
- 리듀서 함수는 이전 상태와, 액션 객체를 파라미터로 받습니다.
- 이전의 상태는 절대로 건들이지 않고, 변화를 일으킨 새로운 상태 객체를 만들어서 반환합니다.
- 똑같은 파라미터로 호출된 리듀서 함수는 언제나 똑같은 결과값을 반환해야만 합니다.
Provider
<Provider store={store}>
<App />
</Provider>
connect
import React, { Component } from 'react'; import { connect } from 'react-redux'; import Palette from '../components/Palette'; import { changeColor } from '../store/modules/counter'; class PaletteContainer extends Component { handleSelect = color => { const { changeColor } = this.props; console.log('what'); changeColor(color); }; render() { const { color } = this.props; return <Palette onSelect={this.handleSelect} selected={color} />; } } // props 로 넣어줄 스토어 상태값 const mapStateToProps = state => ({ color: state.counter.color, }); // props 로 넣어줄 액션 생성함수 const mapDispatchToProps = dispatch => ({ changeColor: color => dispatch(changeColor(color)), }); // 컴포넌트에 리덕스 스토어를 연동해줄 때에는 connect 함수 사용 export default connect( mapStateToProps, mapDispatchToProps )(PaletteContainer);
컨테이너 컴포넌트를 만들 때는 react-redux안에 들어있는 connect라는 함수를 사용한다. 이 함수는 파라미터에 전달해주는 mapStateToProps는 스토어 안에 들어있는 값을 props로 전달해주고, mapDispatchToProps는 액션 생성함수들은 props로 전달해준다.
여기서 mapDispatchToProps가 조금 헤갈릴 수도 있는데, 액션 생성함수는, 호출한다고 해서 상태에 변화가 일어나는 것이 아니다. 그 대신에, 액션 객체를 생성해난다. 그 액션 객체를 스토어한테 전달해주어야 상태에 변화가 발생한다.
여기 있는 mapDispatchToProps에서는 color를 파라미터로 받아와서 그 값을 가지고 CHANGE_COLOR액션 객체를 생성한 다음에 스토어한테 디스패치 하는 함수를 컴포넌트의 props로 전달해 주는 것이다.
connect함수가 호출되면 반환되는 값은 특정 컴포넌트에 설정된 props를 전달해 주는 함수이다. 지금은 connect(...)(PaletteContainer)ㅇ이런식으로 호출되었는데, connect()를 호출해서 반환받은 함수에, PaletteContainer를 파라미터로 넣어서 호출한 것이라고 이해하면 된다.
bindActionCreators
dispatch를 계속해주기가 귀찮으면 bindActionCreators라는 함수를 사용하면 조금 더 쉽게 할 수 있다.
const mapDispatchToProps = dispatch =>
bindActionCreators({ changeColor1, changeColor2, ... }, dispatch);
이렇게 하면 기존해 했던 actionCreator: (...params) => dispatch(actionCreator(...params)에 해당하는 작업을 자동으로 해 준다. 만약에 액션 생성함수가 파라미터를 필요로 하는것이더라도, 정상적으로 작동한다.
또 다른 방식으로는 mapDispatchToProps를 함수형태가 아닌 액션생성함수로 이뤄진 객체를 전달해주면 connect가 발생하게 될 때 bindActionCreators를 자동으로 해 준다.
const mapDispatchToProps = { changeColor1, changeColor2, .... };
combineReducers
import { combineReducers } from 'redux';
import counter from './counter';
export default combineReducers({
counter,
// 다른 리듀서를 만들게되면 여기에 넣어줌..
});
{
counter: {
// counter에서 사용하는 초깃값
},
// ... 다른 리듀서에서 사용하는 초깃값들
}
'WEB > Reat' 카테고리의 다른 글
Block Update (0) | 2019.01.23 |
---|---|
Middle Ware (0) | 2019.01.13 |
Redux(1) (0) | 2019.01.12 |
CRA(Create rReact App) (0) | 2019.01.08 |
React 간단 정리 (0) | 2018.12.14 |