- 스프레드 연산자를 통해 배열을 복사하거나 조작할 때, 기존 배열은 변경되지 않으며 새로운 배열이 생성됩니다. 이를 통해 데이터 불변성을 유지하고 예기치 않은 부작용을 방지하는 데 도움이 됩니다.
const originalArray = [1, 2, 3];
const copiedArray = [...originalArray];
const array1 = [1, 2, 3];
const array2 = [4, 5, 6];
const combinedArray = [...array1, ...array2];
const originalArray = [1, 2, 3];
const newArray = [...originalArray, 4];
const originalArray = [1, 2, 3, 4, 5];
const slicedArray = [...originalArray.slice(0, 3)];
const originalArray = [1, 2, 3];
const modifiedArray = originalArray.map(item => item * 2);
- JavaScript의 map() 함수는 배열을 순회하면서 각 요소에 대해 지정된 콜백 함수를 호출하고, 콜백 함수의 반환 값으로 이루어진 새로운 배열을 생성합니다. map() 함수는 배열을 변환하거나 새로운 배열을 생성할 때 주로 사용됩니다.
- map() 함수는 원래 배열을 변경하지 않고 새로운 배열을 생성하기 때문에 데이터 불변성을 유지하면서 배열을 변환할 수 있으며, 함수형 프로그래밍 패턴과 잘 어울립니다. 이것은 React에서 상태나 props를 다룰 때 유용하게 활용됩니다.
const newArray = originalArray.map(callback(currentValue, index, array) {
// 반환할 값 계산
return /* 계산한 값 */;
});
const numbers = [1, 2, 3, 4, 5];
const squaredNumbers = numbers.map((number) => {
return number * number;
});
console.log(squaredNumbers); // [1, 4, 9, 16, 25]
const numbers = [1, 2, 3, 4, 5];
const squaredNumbers = numbers.map((idx) => {
return idx * idx;
});
console.log(squaredNumbers); // [1, 4, 9, 16, 25]

number가 아니라 idx라고 코드를 작성해도 결과는 동일하다. item이라는 argument명도 자주 사용된다.




event.preventDefault() 라는 함수를 이용하였다.event.preventDefault()는 웹 브라우저의 기본 동작을 중단시키는 메서드입니다. 이 메서드를 호출하면 이벤트의 기본 동작이 발생하지 않고, 대신에 개발자가 원하는 동작을 수행할 수 있습니다. 일반적으로 이 메서드는 다음과 같은 상황에서 사용됩니다:
- 폼 제출 이벤트에서: 웹 폼을 제출할 때, 브라우저는 페이지를 새로고침하거나 다른 페이지로 이동하려고 시도합니다. 이를 방지하기 위해 event.preventDefault()를 사용하여 제출 동작을 중단하고, 폼 데이터를 수집하거나 AJAX 요청을 보낼 수 있습니다.
- 앵커(링크) 클릭 이벤트에서: 일반적으로 앵커(링크)를 클릭하면 브라우저는 해당 링크의 URL로 이동하려고 합니다. 그러나 event.preventDefault()를 사용하면 페이지 이동을 막고, 클릭 이벤트에 사용자 지정 로직을 추가할 수 있습니다.
- 드래그 앤 드롭 이벤트에서: 파일을 웹 페이지로 드래그 앤 드롭하는 경우, 브라우저는 파일을 열거나 이동시키는 기본 동작을 수행합니다. event.preventDefault()를 사용하여 이러한 기본 동작을 중단하고 파일을 처리하거나 업로드하는 동작을 추가할 수 있습니다.
- 키보드 이벤트에서: 일부 키보드 이벤트에 대해서도 event.preventDefault()를 사용하여 기본 키 동작을 중단하고 사용자 정의 동작을 처리할 수 있습니다.
요약하면, event.preventDefault()는 브라우저의 기본 동작을 중단하여 원하는 동작을 수행할 수 있게 해주는 중요한 메서드입니다. 이를 통해 웹 애플리케이션의 동작을 더욱 제어할 수 있습니다.



toDos.push를 이용하겠지만 이건 리액트의 state다.
setToDos((currentArray) => [toDo, ...currentArray]);
- currentArray라는 매개변수를 받는 함수를 setToDos 함수의 인자로 전달합니다. 이 함수는 현재 toDos 상태 배열을 나타내며, 이전 상태를 읽어오기 위해 사용됩니다.
- 이 함수는 현재 toDos 배열을 가져와서 새로운 배열을 생성합니다. 새로운 배열은 다음과 같이 구성됩니다.
- toDo: 새로운 할 일 항목인 toDo를 배열의 첫 번째 요소로 추가합니다.
...currentArray: 스프레드 연산자(...)를 사용하여 현재 배열의 모든 요소를 새 배열에 복사합니다.- 최종적으로 setToDos 함수는 이 새로운 배열을 사용하여 toDos 상태를 업데이트합니다. 이로써 새로운 할 일 항목인 toDo가 현재 할 일 목록의 맨 위에 추가되게 됩니다.
import { useState } from "react";
function App() {
const [toDo, setToDo] = useState("");
const [toDos, setToDos] = useState([]); // 여러가지 투두리스틑 입력받게 배열로 입력 받음
const onChange = (event) => setToDo(event.target.value);
const onSubmit = (event) => {
event.preventDefault();
if (toDo === "") {
return; // 함수의 작동을 막음 (kill the function)
}
setToDo(""); // 등록 후에 인풋 안에 남지 않게
setToDos((currentArray) => [toDo, ...currentArray]); // 스프레드 연산자로 combine
};
console.log(toDos);
return (
<div>
<h1>My To-do-list ({toDos.length})</h1>
<form onSubmit={onSubmit}>
<input
onChange={onChange}
value={toDo}
type="text"
placeholder="Write your to-do"
/>
<button>Add To-do</button>
</form>
</div>
);
}
export default App;

function App() {
const [toDo, setToDo] = useState("");
const [toDos, setToDos] = useState([]); // 여러가지 투두리스틑 입력받게 배열로 입력 받음
const onChange = (event) => setToDo(event.target.value);
const onSubmit = (event) => {
event.preventDefault();
if (toDo === "") {
return; // 함수의 작동을 막음 (kill the function)
}
setToDo(""); // 등록 후에 인풋 안에 남지 않게
setToDos((currentArray) => [toDo, ...currentArray]); // 스프레드 연산자로 combine
};
console.log("toDo : ", toDo);
console.log("toDos : ", toDos);
return (
<div>
<h1>My To-do-list ({toDos.length})</h1>
<form onSubmit={onSubmit}>
<input
onChange={onChange}
value={toDo}
type="text"
placeholder="Write your to-do"
/>
<button>Add To-do</button>
</form>
</div>
);
}



toDos.map(() => ":)") 라고 적으면 배열의 아이템들이 모두 웃는 이모티콘이 되는 귀여운 상황 발생. 우리는 귀여운 기능 말고 쿨한 기능을 원하니까 뭔가 바꿔야겠지?

import { useState } from "react";
function App() {
const [toDo, setToDo] = useState("");
const [toDos, setToDos] = useState([]); // 여러가지 투두리스틑 입력받게 배열로 입력 받음
const onChange = (event) => setToDo(event.target.value);
const onSubmit = (event) => {
event.preventDefault();
if (toDo === "") {
return; // 함수의 작동을 막음 (kill the function)
}
setToDo(""); // 등록 후에 인풋 안에 남지 않게
setToDos((currentArray) => [toDo, ...currentArray]); // 스프레드 연산자로 combine
};
//console.log("toDo : ", toDo);
console.log("toDos : ", toDos);
return (
<div>
<h1>My To-do-list ({toDos.length})</h1>
<form onSubmit={onSubmit}>
<input
onChange={onChange}
value={toDo}
type="text"
placeholder="Write your to-do"
/>
<button>Add To-do</button>
</form>
<hr />
<ul>
{toDos.map((item) => (
<li>{item}</li>
))}
</ul>
</div>
);
}
export default App;

ul, li 태그를 이용하여 이렇게 작성하면 될 것이다.

<ul>
{toDos.map((item, idx) => (
<li key={idx}>{item}</li>
))}
</ul>
<ul>)의 리스트 아이템(<li>)으로 표시하는 것을 나타냅니다. ul 태그는 순서 없는 목록(리스트)을 나타냅니다.<li key={idx}>{item}</li> : 이 부분은 각 항목을 리스트 아이템(<li>)으로 렌더링합니다.<ul>)의 리스트 아이템(<li>)으로 렌더링합니다. 이때 각 리스트 아이템에는 고유한 key 속성이 지정되어 React가 업데이트를 효율적으로 관리할 수 있도록 합니다. 결과적으로 페이지에는 toDos 배열의 내용을 나타내는 목록이 표시됩니다.