createAction은 {type: , payload: }로 구성된다.
사용 전후 비교하면 코드를 많이 줄여준다.
첫번째 매개변수는 initialstate이다.
state를 변경하거나 새로운 state를 리턴해야 한다.
const reducer = createReducer([], {
[addToDo]: (state, action) => {
state.push({ text: action.payload, id: Date.now() });
},
[deleteToDo]: (state, action) =>
state.filter(toDo => toDo.id !== action.payload)
});
redux developer tools를 사용하기 위해서 선언하는 함수.
const store = configureStore({ reducer });
createAction과 createReducer 합쳤다.
createSlice는 reducer를 자동으로 생성한다.
Store.js
import { configureStore, createSlice } from "@reduxjs/toolkit";
const toDos = createSlice({
name: "toDosReducer",
initialState: [],
reducers: {
add: (state, action) => {
state.push({ text: action.payload, id: Date.now() });
},
remove: (state, action) => state.filter(toDo => toDo.id !== action.payload)
}
});
export const { add, remove } = toDos.actions;
export default configureStore({ reducer: toDos.reducer });
Home.js
import React, { useState } from "react";
import { connect } from "react-redux";
import { add } from "../store";
import ToDo from "../components/ToDo";
function Home({ toDos, addToDo }) {
const [text, setText] = useState("");
function onChange(e) {
setText(e.target.value);
}
function onSubmit(e) {
e.preventDefault();
addToDo(text);
setText("");
}
return (
<>
<h1>To Do</h1>
<form onSubmit={onSubmit}>
<input type="text" value={text} onChange={onChange} />
<button>Add</button>
</form>
<ul>
{toDos.map(toDo => (
<ToDo {...toDo} key={toDo.id} />
))}
</ul>
</>
);
}
function mapStateToProps(state) {
return { toDos: state };
}
function mapDispatchToProps(dispatch) {
return {
addToDo: text => dispatch(add(text))
};
}
export default connect(mapStateToProps, mapDispatchToProps)(Home);
ToDo.js
import React from "react";
import { connect } from "react-redux";
import { remove } from "../store";
import { Link } from "react-router-dom";
function ToDo({ text, onBtnClick, id }) {
return (
<li>
<Link to={`/${id}`}>{text}</Link>
<button onClick={onBtnClick}>DEL</button>
</li>
);
}
function mapDispatchToProps(dispatch, ownProps) {
return {
onBtnClick: () => dispatch(remove(ownProps.id))
};
}
export default connect(null, mapDispatchToProps)(ToDo);