본문 바로가기

프론트엔드 공부/react

redux todolist

 

//reducer.js
const initialState = {
  todos: [],
};
const reducer = (state = initialState, action) => {
  switch (action.type) {
    case "ADD_TODO":
      return {
        ...state,
        todos: [...state.todos, action.payload],
      };
    case "DELETE_TODO":
      return {
        ...state,
        todos: state.todos.filter((todo) => todo.id !== action.payload),
      };
    default:
      return state;
  }
};
export default reducer;
//index.js
import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import { Provider } from "react-redux";
import reducer from "./reducer";
import { createStore } from "redux";
const store = createStore(reducer);
ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById("root")
);
//App.js
import React, { Route, BrowserRouter, Switch } from "react-router-dom";
import { useState } from "react";
import { useDispatch, useSelector } from "react-redux";

const Todos = () => {
  const dispatch = useDispatch();
  const todos = useSelector((state) => state.todos);
  const handleClick = (id) =>
    dispatch({
      type: "DELETE_TODO",
      payload: id,
    });
  if (!todos || !todos.length) {
    return <p>No Todos</p>;
  }
  return (
    <ul>
      {todos.map((todo) => (
        <li onClick={() => handleClick(todo.id)}>{todo.label}</li>
      ))}
    </ul>
  );
};
const TodoInput = () => {
  const dispatch = useDispatch();
  const [newTodo, setNewTodo] = useState();
  const handleChange = (event) => setNewTodo(event.target.value);
  const handleClick = () =>
    dispatch({
      type: "ADD_TODO",
      payload: {
        label: newTodo,
        id: Math.ceil(Math.random() * 100),
      },
    });
  return (
    <>
      <input value={newTodo} onChange={handleChange} type="text" />
      <button onClick={handleClick}>ADD TODO</button>
    </>
  );
};
function App() {
  return (
    <div className="App">
      <header className="App-Header">Todos</header>
      <Todos />
      <TodoInput />
    </div>
  );
}

export default App;

 

https://github.com/fangmin26/reduxtodo/tree/master/src