npm install react-redux
import { createStore } from "redux";
import reducer from "./action.js";
const store = createStore(reducer);
export default store;
Provider
: react-redux
기능, Provider
를 통해 store
를 React
전체에서 가져올 수 있다. import React from "react";
import ReactDOM from "react-dom";
import App from "./components/App";
import { Provider } from "react-redux";
import store from "./store";
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById("root")
);
const ACTION = "ACTION";
const ANOTHER_ACTION = "ANOTHER_ACTION";
const reducer = (state, action) => {
switch(action.type){
case ACTION:
return newState;
case ANOTHER_ACTION:
return newState;
default:
return state;
}
}
const action = (data) => {
return {
type: ACTION,
data
}
}
const anotherAction = (data) => {
return {
type: ANOTHER_ACTION,
data
}
}
export const actionCreators = {
action, anotherAction
}
export default reducer;
웹의 규모가 클수록 Reducer
를 나누어 구현해야 하는 경우가 발생할 수 있는데 combineReducer({})
를 사용하여 createStore
에 하나의 reducer
로 전달할 수 있다.
Redux toolkit
에서 createReducer
를 사용할 수 있는데 첫번째 인자로 initial state
를 두번째 인자로 action
객체를 전달할 수 있다.
import {createReducer} from "@reduxjs/toolkit";
const action = createAction("ACTIOIN");
const anotherAction = createAction("ANOTHER_ACTION");
const reducer = createReducr([], {
[action]: (state, action) => {
state.data = action.payload
return state;
},
[anotherAction]: (state, action) => {
// do someting with action.payload
return state;
}
})
createReducer
를 사용하면 state
또는 새로운 상태의 state
를 반환해야 한다.
기존 Redux
에서는 기존 상태 값을 변형하지 않고 상태를 복사해 반환해야 했지만 createReducer
를 사용하면 상태를 변형이 가능하게 해주는데 이는 code의 표면적으로는 상태를 직접 변형하는 것처럼 구현하지만 상태를 직접 변형하는 것이 아닌 immer
를 통해서 Redux toolkit
이 대신 변형된 새로운 상태를 반환해 주는것이라고 한다.
@reduxjs/toolkit
의 createSlice
는 Reducer
와 Action
을 한번에 구현할 수 있다.
import {createStore} from "redux"
import {createSlice} from "@reduxjs/toolkit";
const handleState = createSlice({
name: "reducer",
initialState: "",
reducers: {
type: (state, action) => {
state.data = action.playload;
},
anotherType: (state, action) => {
// do something with state and action
}
}
})
const store = createStore(handleState.reducer);
const { type, anotherType } = handleState.actions;
import {combineReducer} from "redux";
// reducers
export default combineReducers({
reducer,
anotherReducer
})
redux
에는 action
관리를 위한 redux-actions
가 있다. npm install redux-actions
npm install @reduxjs/toolkit
import { handleActions } from "redux-actions";
const ACTION_TYPE = "ACTION";
const ANOTHER_TYPE = "ANOTHER_ACTION";
const actions = createAction(TYPE);
const anotherActions = createAction(TYPE);
// 또는
const actions = state => dispatch => {
dispatch({ type: ACTION_TYPE, state })
}
const anotherActions = state => dispatch => {
dispatch({ type: ANOTHER_TYPE, state })
}
const initialState;
const reducer = handleActions({
[ACTION_TYPE]: (state, action) => {
return {
...state,
payload: action
}
},
[ANOTHER_TYPE]: (state, action) => {
return {
...state,
payload: action
}
}
}, initialState )
export default reducer;
redux toolkit
의 createAction
을 사용하여 action을 구현할 경우 reducer
의 action
내 payload
로 상태 값에 접근할 수 있다. handleActions
가 반환하는 객체의 payload
는 이름을 바꾸어 반환이 가능하다. import React from "react";
import { connect } from "react-redux";
import action from "./action.js"
function App({oldstate, key}) {
return
<>
</>
}
function mapStateToProps(state) {
return { newState: state };
}
function mapDispatchToProps(dispatch, props) {
return {
key: dispatch(action(props)),
// 또는
key: (data) => dispatch(action(data))
};
}
export default connect(mapStateToProps, mapDispatchToProps)(ToDo)
mapStateToProps(state)
: redux store
의 getState()
와 비슷한 기능, store
에 있는 상태 값을 React component
의 props
로 전달한다.
mapDispatchToProps(dispatch, props)
: dispatch
와 connect
된 react component
의 props
를 전달받아 접근할 수 있다. dispatch
는 action
을 react component
에 props
로 전달할 수 있다.
import { useSelector, useDispatch } from "react-redux"
function App() {
const getState = useSelector(store => store.payload.state)
const dispatch = useDispatch();
dispatch(actions);
}
mapStateToProps
와 mapDispatchToProps
를 사용하지 않고 react-redux
의 useSelector
와 useDispatch
를 사용하여 기능을 대신할 수 있고 props
로 전달 받는 것보다 직접적으로 store
의 state
에 접근할 수 있다.