Today I Learned (TIL)
리액트 input 입력창 만들기,to do 리스트 만들기,나노 아이디 23.12.02
폼폼코
2023. 12. 2. 23:16
728x90
반응형

주말이라서 그동안 배운걸 다시 복습중에있다 리액트 기초중에 기초인 useState
원래는 손에서 자동으로 나올때까지 연습해야한다



리액트에서 input창에 입력한 값을 추출하는 코드 리액트에서는 이방식으로 사용을 권장한다고한다
function App() {
const [value, setValue] = useState("");
return (
<>
<input onChange={(e) => setValue(e.target.value)} />
// 버튼을 추가하여 클릭 시 현재 value를 알림창에 띄우도록 해봅니다.
<button
onClick={() => {
alert(value);
}}
>
입력한 값을 알림창에 띄우기
</button>
</>
);
}
위에 내용 요약 리액트 자주 쓰다보면 외운다고한다
리액트로 to do list 만들기


입력한값이 바로 들어가는걸볼수있다
import { useState } from "react";
import "./App.css";
function App() {
const [todos, setTodos] = useState([
"리액트 공부하기",
"아침 운동하기",
"블로그 글쓰기",
]);
const [value, setValue] = useState("");
return (
<>
<input value={value} onChange={(e) => setValue(e.target.value)} />
<button
onClick={() => {
setTodos([...todos, value]);
}}
>
추가
</button>
{todos.map((todo) => {
return <div>{todo}</div>;
})}
</>
);
}
export default App;
삭제 버튼 추가하기

소스 코드 안에 주석으로 설명써봤다
{todos.map((todo, index) => { //1 .현재 여기서 투두 리스트를 map을 이용해 나눠서뿌림
return (
<div>
<span>
{index} ,{todo} //2.그럼 이제 ex)0 ,리액트 공부하기 삭제 등으로 각자 출력
</span>
<button
onClick={() => { //3.삭제버튼 원리 : todos 스테이트를 변경하기위해 필터이용
const filterTodos = todos.filter((할일목록) => { //4.버튼 누르면 todos목록을 필터돌림
console.log("todos에 들어있는거",할일목록);
return 할일목록 !== todo; //5.todos목록중에서 현재 이름 ex)공부하기 이랑
}); 이름같으면 제외하고 나머지 출력
setTodos(filterTodos); //6.삭제하기 버튼은 사실상 filter로 재출력 버튼
console.log("그리고 필터결과",filterTodos);
}}
>
삭제
</button>
콘솔 로그로 할일 목록에는 뭐가 들었는지 확인


이거 이해 안되서 고생했다 이런....암튼 삭제버튼은 만들었지만
문제는 이름{todo} 같으면 삭제하는 원리라 같은이름이 여러게면
전부 삭제된다는거...! 그래서 이번에는 인덱스 각각 고유값으로 구분
{todos.map((todo, index) => {
return (
<div>
<span>
{index} ,{todo}
</span>
<button
onClick={() => {
const filterTodos = todos.filter((할일목록, index2) => {
console.log(index2);
return index !== index2;
});
setTodos(filterTodos);
}}
>
{todo}삭제

이제는 같은 이름이여도 한번에 삭제되지는 않지만 또 순서대로 삭제만된다.... 사실 이래서 인덱스 비교로 삭제하면 안된다고합니다

인덱스 로 비교하면 안되는게 어떤 느낌이냐면

a,b,c의 고유값이아니라 그냥 정해진 자리같은느낌입니다
아래는 나노아이디 적용 예시
import { useState } from "react";
import "./App.css";
import { nanoid } from "nanoid";
function App() {
const [todos, setTodos] = useState([
{ id: nanoid(), content: "리액트 공부하기" },
{ id: nanoid(), content: "아침 운동하기" },
{ id: nanoid(), content: "블로그 글쓰기1" },
{ id: nanoid(), content: "블로그 글쓰기2" },
{ id: nanoid(), content: "블로그 글쓰기3" },
]);
const [value, setValue] = useState("");
return (
<>
<input value={value} onChange={(e) => setValue(e.target.value)} />
<button
onClick={() => {
setTodos([...todos, value]);
}}
>
추가
</button>
{todos.map((todo, index) => {
return (
<div key={todo.id}>
<span>
{index} ,{todo.content}
</span>
<button
onClick={() => {
setTodos(todos.filter((idx) => idx.id !== todo.id));
}}
>
{todo.id}삭제
</button>
</div>
);
})}
</>
);
}
export default App;
하던거 마무리한 코드
import { useState } from "react";
import "./App.css";
import { nanoid } from "nanoid";
function App() {
const [todos, setTodos] = useState([
{ id: nanoid(), content: "리액트 공부하기" },
{ id: nanoid(), content: "아침 운동하기" },
{ id: nanoid(), content: "블로그 글쓰기1" },
{ id: nanoid(), content: "블로그 글쓰기2" },
{ id: nanoid(), content: "블로그 글쓰기3" },
]);
const [value, setValue] = useState("");
return (
<>
<input value={value} onChange={(e) => setValue(e.target.value)} />
<button
onClick={() => {
setTodos([...todos, { id: nanoid(), content: value }]); //입력내용 나노아이디 부여후 추가
setValue(""); //입력누면 input창 초기화
}}
>
추가
</button>
{todos.map((todo, index) => {
return (
<div key={todo.id}>
<span>
{index} ,{todo.content}
</span>
<button
onClick={() => {
setTodos(
todos.filter((원본할일목록) => 원본할일목록.id !== todo.id)
);
}}
>
{todo.id}삭제
</button>
</div>
);
})}
</>
);
}
export default App;
코드가 오류난거는 금방해결됐는데 원리가 이해안갈때는 시간이 정말 오래걸렸다
그냥 모르면 외워야 하나 싶다 지금으로써는 밀린 과제와 팀과제가 점점 무거워진다
728x90
반응형