src > Components > ListsTobeSorted.jsx
export const ListsToBeSorted = () => {
//
const todos = useSelector((state) => state.todos);
const dispatch = useDispatch();
//
const changeStatusHandler = (def) => {
dispatch(toggleStatusTodo(def));
};
const deleteStatusHandler = (abc) => {
dispatch(deleteTodo(abc));
};
return (
<>
<div className="working">
<h2>Working๐ฅ</h2>
<div className="working-container">
{todos
.filter((todo) => todo.isDone === false)
.map(function (todo) {
return (
<div key={todo.id}>
<h5>{todo.title}</h5>
<br />
<p>{todo.content}</p>
<br />
<p>์๋ฃ์ฌ๋ถ: {todo.isDone.toString()}</p>
<button
onClick={() => changeStatusHandler(todo.id)}
// () => {
// dispatch(
// {
// type: TOGGLE_STATUS_TODO,
// payload: "todo.id", =>๋์ ์์์๋ def๋ก ๋ฐ๋ก ๋บ
// }
// )
// }
>
์๋ฃ
</button>
<button
onClick={() => deleteStatusHandler(todo.id)}
// () => {
// dispatch(
// {
// type: DELETE_TODO,
// payload: "todo.id", =>๐ฆํจ์๋ฅผ ๋ฐ๋ก ๋นผ๊ฒ ๋๋ฉด, payload๋ก ๋ฃ์ todo.id๋ฅผ ์ธ์ํ์ง ๋ชปํด์ abc๋ก ๋ฐ๊ฟ. but ๊ฒฐ๊ตญ abc = todo.id์
// }
// )
// }
>
์ญ์
</button>
{/* ์์ธ๋ณด๊ธฐ */}
{/* <Link to="/1">์์ธ๋ณด๊ธฐ</Link> */}
{/* ๐ฆ/${todo.id}๋ todo ๊ฐ์ฒด์ id ๊ฐ์ ํฌํจํ ๊ฒฝ๋ก๋ฅผ ์์ฑํฉ๋๋ค. ์๋ฅผ ๋ค์ด, todo.id๊ฐ 9d33d690-48ff-45e3-88ba-e8b3d872433b์ธ ๊ฒฝ์ฐ, ์์ฑ๋๋ ๊ฒฝ๋ก๋ /9d33d690-48ff-45e3-88ba-e8b3d872433b๊ฐ ๋ฉ๋๋ค. */}
<Link to={`/${todo.id}`}>์์ธ๋ณด๊ธฐ</Link>
</div>
);
})}
</div>
</div>
<div className="done">
<h2>Done๐</h2>
<div className="done-container">
{/* {todos
.filter((todo) => todo.isDone === true)
.map(function (todo) {
return todo.isDone ? (
<div key={todo.id}>
<h5>{todo.title}</h5>
<br />
<p>{todo.content}</p>
<br />
<p>์๋ฃ์ฌ๋ถ: {todo.isDone.toString()}</p>
<button onClick={() => changeStatusHandler(todo.id)}>
์๋ฃ์ทจ์
</button>
<button onClick={() => deleteStatusHandler(todo.id)}>
์ญ์
</button>
</div>
) : null;
})} */}
{todos
.filter((todo) => todo.isDone === !false)
.map(function (todo) {
return (
<div key={todo.id}>
<h5>{todo.title}</h5>
<br />
<p>{todo.content}</p>
<br />
<p>์๋ฃ์ฌ๋ถ: {todo.isDone.toString()}</p>
<button onClick={() => changeStatusHandler(todo.id)}>
์๋ฃ์ทจ์
</button>
<button onClick={() => deleteStatusHandler(todo.id)}>
์ญ์
</button>
<Link to={`/${todo.id}`}>์์ธ๋ณด๊ธฐ</Link> ๐
</div>
);
})}
</div>
</div>
</>
);
};
์ด ํ์ผ์์์ ์ฝ๋(1)๋
<Link to={`/${todo.id}`}>์์ธ๋ณด๊ธฐ</Link>
src > shared > Router.jsx
import React from "react";
// 1. react-router-dom์ ์ฌ์ฉํ๊ธฐ ์ํด์ ์๋ API๋ค์ import ํฉ๋๋ค.
import { BrowserRouter, Route, Routes } from "react-router-dom";
import Home from "pages/Home";
import Details from "pages/Details";
// 2. Router ๋ผ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ ์๋์ ๊ฐ์ด ์์ฑํฉ๋๋ค.
//BrowserRouter๋ฅผ Router๋ก ๊ฐ์ธ๋ ์ด์ ๋,
//SPA์ ์ฅ์ ์ธ ๋ธ๋ผ์ฐ์ ๊ฐ ๊น๋นก์ด์ง ์๊ณ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ ์ ์๊ฒ ๋ง๋ค์ด์ค๋๋ค!
const Router = () => {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/:abcdef" element={<Details />} /> ๐
{/* ๐ฆ"/:id"๋ก, ๋์ ์ธ id๊ฐ์ ์ ๋ฌ */}
</Routes>
</BrowserRouter>
);
};
export default Router;
์ด ํ์ผ์์์ ์ฝ๋(2)๋
<Route path="/:abcdef" element={<Details />} />
์๋ก ์ด๋ป๊ฒ ์ฐ๊ฒฐ์ด ๋๋์ง ์ ์ดํด๊ฐ ์๊ฐ.
โถ <Link to={`/${todo.id}`}>์์ธ๋ณด๊ธฐ</Link> ์์์ to๊ฐ
โท <Route path="/:abcdef" element={<Details />} /> ์์์ path๋ฅผ ์๋ฏธ. ๋ฐ๋ผ์, ๋ชฉ์ ์ง๋ <Details />์ด๋ฉฐ, ์ถํ ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์์ธ :abcdef์ ๊ฐ์ useParams()๋ฅผ ํตํด ๋ฐ์์ฌ ์ ์์.
src > pages > Details.jsx
import React from "react";
import { useSelector } from "react-redux";
import { useNavigate, useParams } from "react-router-dom";
const Details = () => {
// const params = useParams(); ๐
// console.log("useParams๋ฅผ ์ฐ๋ฉด, todo.id๊ฐ์ ๊ฐ์ฒด๋ก ๋ฐ์์ค๊ฒ ๋ฉ๋๋ค", params); ๐
//
const { abcdef } = useParams(); ๐
console.log("๋๊ฒจ๋ฐ์ id", abcdef); ๐
//์ด์ ํ๋ฉด์ผ๋ก
const navigate = useNavigate();
//๐ฆtodos.filter์ ๋ฐํ๋ ๋ฐฐ์ด : ์์๊ฐ 1๊ฐ์ง๋ฆฌ์ธ [0] ๋ฐฐ์ด์. ๋ฐ๋ผ์ ๋ช
์ํด์ค์ผ ํจ
const todos = useSelector((state) => state.todos);
// todos = [
// {id:000},
// {id: 001},
// ]
const todo = todos.filter((todo) => todo.id === abcdef)[0]; //๐ฆโโโ [0]์ ์ํด์ฃผ๋ฉด ํ๋ฉด์ id ์ถ๋ ฅ์ด ์๋จ
//
return (
<div>
{todo.id}
<br />
{todo.title}
<br />
{todo.content}
<br />
{todo.isDone.toString()}
<br />
<button onClick={() => navigate("/")}>์ด์ ํ๋ฉด์ผ๋ก</button>
</div>
);
};
export default Details;
+) ํ์ผ๊ฐ ๊ตฌ์กฐ
โถIndex.js
root.render(
//โทApp์ Provider๋ก ๊ฐ์ธ์ฃผ๊ณ , configStore์์ export default ํ store๋ฅผ ๋ฃ์ด์ค๋๋ค. => โธapp.jsx์์ ์ด์ useSelector๋ก store์ ๊ฐ (state)๋ฅผ ๊บผ๋ด์ฌ ์ ์๊ฒ ๋จ
<Provider store={store}>
<App />
</Provider>
);
โทApp.jsx
function App() {
//์ฝ์๊ฐ ๋น๊ต
const todos = useSelector(function (state) {
return state.todos;
});
console.log("state.todos์ ์ฝ์๊ฐ์ ๋ฐฐ์ด", todos);
console.log(
"state์ ์ฝ์๊ฐ์ ๊ฐ์ฒด",
useSelector((state) => state)
);
return (
<div>
<Router />
</div>
);
}
โธRouter.jsx
const Router = () => {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/:abcdef" element={<Details />} />
{/* ๐ฆ"/:id"๋ก, ๋์ ์ธ id๊ฐ์ ์ ๋ฌ */}
</Routes>
</BrowserRouter>
);
};
โนHome.jsx
function Home() {
return (
<div>
<Form />
<ListsToBeSorted />
</div>
);
}
=> ์ค์ ํ์ด์ง๋ Home.jsx (⊃Form.jsx, ListsToBeSorted) & Details.jsx์ด๊ณ ,
index.js ⊃ app.jsx ⊃ Router.jsx ๋ ๊ธฐ๋ฅ๋ง ํ๋ค๊ณ ๋ด์ผํ ๋ฏ
'[๊ฐ์ธ๊ณผ์ ]' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[lv2] [Redux] ํฌ๋๋ฆฌ์คํธ - ๋ ๋๊น์ง ์ฐ์ต (1) | 2023.07.06 |
---|