react-redux 로 ToDo List 만들기 (routes 사용

최하림·2022년 3월 11일
0

좀더 쉽게 그리고 코드를 최소로 쓰려고 노력했다
그리고 엄청 쉬운해결법을 두고 3일동안이나 못찾아서 스트레를 받았었지만 풀고나서 속시원한 작업이었다.

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import {Provider} from 'react-redux';
import store from './store';





ReactDOM.render(
  <React.StrictMode>
    <Provider store={store}>
    <App />
    </Provider>
  </React.StrictMode>,
  document.getElementById('root')
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

app.js

import React from 'react';
import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import Detail from './routes/Detail';
import Home from './routes/Home';
const App = () => {
  return (
    <Router>
    <Routes>
      <Route path="/" element={<Home/>}/>
      <Route path="/:id" element={<Detail/>}/>
    </Routes>
  </Router>
  );
};

export default App;

store.js

import {createStore, combineReducers} from 'redux';

const ADD = "ADD"
export const DELETE = "DELETE"


export const addToDo = (text) =>{
    return{
        type : ADD,
        text
    }
}

export const deleteToDo = (만세)=>{
    
    return{
        type:DELETE,
        id: 만세
    
    }
 
}

const reducer = (state =[] , action ) =>{
    switch(action.type){
        
        case ADD: const id = Date.now()
            return [{text:action.text, id:id}, ...state]
        case DELETE: 
        return (state.filter((toDo) => toDo.id !== action.id))
        default: 
        return state
    }
}

const store = createStore(reducer)
export default (store);

routes 폴더

Home.js

import React, { useState } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { addToDo, deleteToDo } from '../store';
import ToDo from './ToDo';
const Home = () => {
    
    const toDos = useSelector((state)=>state);
    const dispatch = useDispatch()
    
    const [text,setText] = useState("")

    const onChange =(e) =>{
        setText(e.target.value)
    }

    const onSubmit = (e) =>{
        e.preventDefault();
        dispatch(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} id={toDo.id} deleteToDo={deleteToDo}/>) )}
        </ul>
       </>
    );
};




export default Home;

ToDo.js

import React from 'react';
import { useDispatch } from 'react-redux';



const ToDo = ({text, id,deleteToDo}) => {
    const dispatch = useDispatch()

    const onClick = () =>{
        dispatch(deleteToDo(id))

    }

    return (
        <li>
        {text}
      
         <button onClick={onClick} >DEL</button>
        </li>
    );
};

export default ToDo;

Detail.js

import React from 'react';

const Detail = () => {
    return (
        <div>
            <h1>디테일 페이지</h1>
        </div>
    );
};

export default Detail;

문제점 설명

store 의

딜리트 기능의 action.id 를 읽어오질 못해서 큰일이었다. id값을 못구해오던것이다.

이게 사실 엄청 쉬운 방법이있었다 내가 못해서 못찾은 이유도 컸다

Home.js 에서

<ul>
  {toDos.map(toDo=>(<ToDo {...toDo} key={toDo.id} id={toDo.id} deleteToDo={deleteToDo}/>) )}
</ul>

이부분에서 id={toDo.id} 과 deleteToDo={deleteToDo}를 프롭스로 넘겨서

프롭스 파일의 거리가 멀다면 그파일에서

mport { useSelector, useDispatch } from 'react-redux';

사용하면된다.

toDo.js

import React from 'react';
import { useDispatch } from 'react-redux';


								// id 는 toDo.id 값이다.
const ToDo = ({text, id, deleteToDo}) => {
    const dispatch = useDispatch()

    const onClick = () =>{
        dispatch(deleteToDo(id)) 
										//이쪽으로 넘겨주면 엄청 쉬운방법이었다.
								
    }

    return (
        <li>
        {text}
      
         <button onClick={onClick} >DEL</button>
        </li>
    );
};

export default ToDo;

받아주고

store.js

export const deleteToDo = (만세)=>{
    
    return{
        type:DELETE,
        id: 만세
    
    }

여기서 받아서 필터로 보내면 되는것이었다 ㅠㅠ.

파일 흐름
store.js = 액션 기능과 액을 부르는 함수

app.js = 라우터 적용

index.js = 스토어 연결. (리덕스)

Home.js = useSelector / useDispatch 와 스토어의 함수를 불러오기.

ToDo.js = 리스트 생성 작업 (액션실행함수와 id 값을 Home.js 에서 받아와야합니다.)
ToDo.js. = onClick 에 적용.

profile
노력하는 성장형

0개의 댓글