react와 redux를 연결하는 방법을 간략하게 알아보고 이때 사용되는 react-reudx와 reducer의 관계를 알아보자
* 일단 변수명은 지금 로직과 관련이 없다는 것만 알고 다양한 연결방법과 쓰임새만 알고 가자
reuducer는 combineReducers를 활용하여 redux를 생성하게 되고 reducer의 return 값들은 redux의 값으로 활용된다
reducer/index.js
import { combineReducers } from 'redux';
const songsReducer = () => {
return [
{ title: 'No Scrubs', duration: '4:05' },
{ title: 'Macarena', duration: '2:30' },
{ title: 'All Star', duration: '3:15' },
{ title: 'I Want it That Way', duration: '1:45' }
];
};
- ===============================================================
const selectedSongReducer = (selectedSong = null, action) => {
if (action.type === 'SONG_SELECTED') {
return action.payload;
}
return selectedSong;
};
export default combineReducers({
songs: songsReducer,
selectedSong: selectedSongReducer
});
- ===============================================================
reducer와 redux를 선언이 끝나면 redux에 값을 치환하기 위해서는 action함수를 선언한다
그리고 사용될 클래스 내에서 react-redux로 mapDispatchToProps를 활용하여
action함수와 reducer 를 Dispatch한다 그렇게 되면 action함수의 return 값이 reducer의 매개변수로 치환되어
redux값이 생성된다
actions/index.js
export const selectSong = song => {
return {
type: 'SONG_SELECTED',
payload: song
};
};
- ===============================================================
redux를 사용하기 위해서는 react-redux 라이브러리를 사용하여 redux와 react를 연결해야 한다
는 state와 ownProps를 사용하여 비교 분석하여 값 치환이 가능하다
state는 action함수를 실행시켜 reducer와 바인딩된 값을 가지고 있으며 그것을 사용하기 위해서는
mapStateToProps함수를 사용하여 현재 클래스와 connect를 해주어야 한다
ownProps는 부모 클래스에서 상속받아온 Props값을 나타낸다
아래의 코드는 action함수가 실행되고 나서 다른 클래스에서 reducer의 return값을 사용할 때
mapStateToProps함수를 현재 클래스와 connect 하는 것만으로 사용할 수 있게 된다
mapStateToProps함수에서 user에 값을 치환하여 클래스 내부에서 props로 받아서 사용이 가능하다
selectSong은 mapDispatchToProps함수를 통해 ation함수를 현 클래스의 property에 추가되어
props로 받아서 사용할 수 있다
이때 부모 컴포넌트에게 받아온 props값과 redux의 state값이 동시 추가되는 것을 확인할 수 있다
components/UserHeader.js
import { connect } from 'react-redux';
class UserHeader extends React.Component{
... 이하생략
소스가 궁금하다면 url 확인하자
https://tantangerine.tistory.com/5?category=379283
}
const mapStateToProps = (state, ownProps) => {
return { user: state.users.find(user => user.id === ownProps.userId) };
};
export default connect(mapStateToProps,{ selectSong })(UserHeader);
- ===============================================================
Provider로 App 컴포넌트를 감싸게 되면 App 컴포넌트는 물론 하위 컴포넌트까지
store에 저장된 값을 사용할 수 있다 이때 저장되는 값은 redux로 combineReducers함수를 사용한 값이 된다
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { createStore } from 'redux';
import App from './components/App';
import reducers from './reducers';
ReactDOM.render(
<Provider store={createStore(reducers)}>
<App/>
</Provider>,
document.querySelector('#root')
);
- ===============================================================