Redux 특강
Redux : 상태를 관리하기 위한 도구(라이브러리)
리액트 개발하는 방법
1. index.html
2. id가 root인 div를 index.js에서 코드로 가져옴
3. App.jsx가 작업공간!
리덕스가 필요한 이유 : 상태(state) 관리가 필요하기 때문!
store 안에는 state와 reducer가 있다
state -> 컴포넌트 단위!!
state ->전역(global
1. 전역 state : Redux store에 있는 것들
2. 컴포넌트 state : props로 전달되는 것들
Reduer는 state와 action을 받는다
후발대 강의 - todolist
리액트는 사용자가 만들어놓은 .jsx 코드를 렌더링 함
state와 props의 변화에 따라 동적으로 렌더링!
useState가 return하는 값이 [state, setState]
setState는 항상 이전 값을 인자로 가진다!
배열을 변경하는 경우 : setState([prev 이전값) => {return [...prev, 내가 넣고싶은 값]}
const [todos, setTodos] = useState(initialTodos);
// setTodos를 이용해 하위 컴포넌트에서 todos를 변경할 수 있다
// setTodos(변경할 값) --> todos값이 바뀜
import React from "react";
export default function Header({ children }) {
// 열고 닫는 태그 사이의 내용이 기본적으로 children값이 됨
// 그래서 props로 넣을 수 있음
return (
<header className='head'>
<h1>{children}</h1>
</header>
);
}
<input
type='text'
name='title'
value={title}
className='input-title'
onChange={(e) => {setTitle(e.target.value)}}
/>
// input 태그에서 중요한 건 onChange와 value!!!
form 태그 안의 버튼이 클릭이 되면 onSubmit이 실행됨
12/11 todolist 프로젝트 처음부터 만드는 보충 강의
import { useState } from "react";
import { v4 as uuidv4 } from "uuid";
import "./App.css";
function App() {
//state 만들기
const [todos, setTodos] = useState(initialState);
// title과 contents
const [title, setTitle] = useState("");
const [contents, setContents] = useState("");
const handleSubmitClick = (event) => {
// 원래 onSubmit이 가지고 있는 고유기능 삭제 --> 새로고침 방지
event.preventDefault();
// title과, contents를 가져와서
// todos에 넣어주는 과정이 필요(setTodos)
// 1. 새로운 객체를 만들어요 : Todo 객체
// {
// title: "제목1",
// contents: "내용1",
// isDone: false,
// id: uuidv4(),
// }
const newTodo = {
title: title,
contents: contents,
isDone: false,
id: uuidv4(),
};
// newTodo를 todos에 넣어주기
setTodos((prev) => {
return [...prev, newTodo];
});
setTitle("");
setContents("");
};
return (
<>
<header>헤더입니다.</header>
<main>
<section
style={{
border: "1px solid black",
padding: "20px",
}}
>
{/* input들이 들어갈 곳
1. 인풋필드 2개 만들기
2. 버튼 만들기 -> 누르면 input에 있는 값이
밑에있는 todolist로 들어가야함
*/}
<form onSubmit={handleSubmitClick}>
제목 :
<input
placeholder='제목을 입력해주세요.'
value={title}
onChange={(event) => {
setTitle(event.target.value);
}}
/>
내용 :
<input
placeholder='내용을 입력해주세요.'
value={contents}
onChange={(event) => {
setContents(event.target.value);
}}
/>
<button>추가</button>
</form>
</section>
<p>TodoList 해야할 것</p>
<section
style={{
display: "flex",
}}
>
{/* todoList 해야할 것 */}
{todos
.filter((item) => item.isDone === false) // false인 애들만 가져오기
.map((item) => {
return (
<div
style={{
backgroundColor: "#ffebee",
margin: "10px",
}}
key={item.id}
// map이 todos의 있는 내용을 빙글빙글 돌면서 return.
// div가 많기 때문에 div 컴포넌트에 key를 넣어줘야함
>
<h4>{item.title}</h4>
<p>{item.contents}</p>
<button>완료</button>
<button>삭제</button>
</div>
);
})}
</section>
<p>TodoList 완료된 것</p>
<section
style={{
display: "flex",
}}
>
{/* TodoList가 들어갈 곳(완료된 것) */}
{todos
.filter((item) => item.isDone === true)
.map((item) => {
return (
<div
style={{
backgroundColor: "#ffebee",
margin: "10px",
}}
key={item.id}
>
<h4>{item.title}</h4>
<p>{item.contents}</p>
<button>완료</button>
<button>삭제</button>
</div>
);
})}
</section>
</main>
<footer>Footer 영역입니다.</footer>
</>
);
}
const initialState = [
{
title: "제목1",
contents: "내용1",
isDone: false,
id: uuidv4(),
},
{
title: "제목2",
contents: "내용2",
isDone: true,
id: uuidv4(),
},
{
title: "제목3",
contents: "내용3",
isDone: false,
id: uuidv4(),
},
];
// id를 순차적으로 하게 되면, 지우고 더하는 과정 중에 꼬일 수 있음
// 그래서 id는 아주 유니크하게 만들자
export default App;
'내배캠 4기 React - TIL' 카테고리의 다른 글
221213 TIL (0) | 2022.12.13 |
---|---|
221212 TIL (1) | 2022.12.12 |
221206 TIL (0) | 2022.12.07 |
221205 TIL (0) | 2022.12.05 |
221202 TIL - 보충 강의 (1) | 2022.12.03 |