import { useState } from 'react';
const IterationSample = () => {
const [names, setNames] = useState([
{ id: 1, text: '눈사람' },
{ id: 2, text: '얼음' },
{ id: 3, text: '눈' },
{ id: 4, text: '바람' },
]);
const [inputText, setInputText] = useState('');
const [nextId, setNextId] = useState(5); // 새로운 항목을 추가할 때 사용할 id
const nameList = names.map(name => <li key={name.id}>{name.text}</li>);
return (
<>
<ul>{nameList}</ul>;
</>
);
}
export default IterationSample;
import { useState } from 'react';
const IterationSample = () => {
const [names, setNames] = useState([
{ id: 1, text: '눈사람' },
{ id: 2, text: '얼음' },
{ id: 3, text: '눈' },
{ id: 4, text: '바람' },
]);
const [inputText, setInputText] = useState('');
const [nextId, setNextId] = useState(5); // 새로운 항목을 추가할 때 사용할 id
const onChange = (e) => {
setInputText(e.target.value);
};
const onClick = () => {
const nextNames = names.concat({
id: nextId, // nextId 값을 id로 설정
text: inputText,
});
setNextId(nextId + 1); // nextId값에 1을 더해준다.
setNames(nextNames); // names 값을 업데이트한다.
setInputText(''); // inputText를 비운다.
// 값이 들어오면 그 값 이 inputText가 되겠다.
};
const nameList = names.map((name) => <li key={name.id}>{name.text}</li>);
return (
<>
<input value={inputText} onChange={onChange} />
<button onClick={onClick}>추가</button>
<ul>{nameList}</ul>
</>
);
};
export default IterationSample;
import { useState } from 'react';
const IterationSample = () => {
const [names, setNames] = useState([
{ id: 1, text: '눈사람' },
{ id: 2, text: '얼음' },
{ id: 3, text: '눈' },
{ id: 4, text: '바람' },
]);
const [inputText, setInputText] = useState('');
const [nextId, setNextId] = useState(5); // 새로운 항목을 추가할 때 사용할 id
const onChange = (e) => {
setInputText(e.target.value);
};
const onClick = () => {
const nextNames = names.concat({
id: nextId, // nextId 값을 id로 설정
text: inputText,
});
setNextId(nextId + 1); // nextId값에 1을 더해준다.
setNames(nextNames); // names 값을 업데이트한다.
setInputText(''); // inputText를 비운다.
// 값이 들어오면 그 값 이 inputText가 되겠다.
};
const onRemove = (id) => {
const nextNames = names.filter((name) => name.id !== id);
setNames(nextNames);
};
const nameList = names.map((name) => (
<li key={name.id} onDoubleClick={() => onRemove(name.id)}>
{name.text}
</li>
));
return (
<>
<input value={inputText} onChange={onChange} />
<button onClick={onClick}>추가</button>
<ul>{nameList}</ul>
</>
);
};
export default IterationSample;
복잡한 중첩처리도 가능하기때문에, 익숙해질수록 생산성이 매우 높아짐
기존 생성자함수의 기능들을 그대로 상속받아 다른 생성자 함수를 만드려면
extends 문법을 사용
let score = 80;
let copy = score;
console.log(score); // 80
console.log(copy); // 80
score = 100;
console.log(score); // 100
console.log(copy); // 80
console.log(score === copy); // false
score 에 '80'이라는 값을 어떤 메모리공간에 할당
변수라는건 메모리 공간을 식별하기위한 이름
copy는 변수 score가 갖는 '80'이라는 값을 copy라는 메모리 공간에 할당
결국, score와 copy는 값 80을 공통으로 갖고 있지만, 80이 가지고 있는 메모리의 공간은 다르다.
score의 값을 100으로 재할당
score는 새로운 메모리공간에 100을 할당했다.
socore는 100 / copy는 여전히 80
그래서 socore와 copy는 같지 않다.
화살표함수, 고차함수 부분
원시타입과 객체(참조)타입