깊은 복사를 하는 함수
rendering
이 된다.re-rendering
이 되는 셈이다.compoent화
시키는 것이라고 할 수 있다.return (
<div>
<div>해</div>
<div>나무</div>
</div>
);
function Wood () {
return (
<div>나무</div>
);
}
import Wood from './Wood';
function App() {
return(
<div>
<div>달</div>
<Wood></Wood>
</div>
);
}
<Wood />
를 import하여 또 다른 return값을 가진 컴포넌트가 생겼다.<Wood />
또한 return을 할지 결정할 수 있다.데이터가 변경이 되었는가
로 결정된다.깊은 복사
를 해야 한다.const a = [1, 2, 3];
const b = [...a]; // a라는 배열을 전개한다.
...
를 통해서 전개한다.b.push(4); // 배열에 데이터를 추가
console.log(`a의 값은 : ${a}`); // 1, 2, 3
console.log(`b의 값은 : ${b}`); // 1, 2, 3, 4
push()
함수를 통해서 배열에 새로운 데이터를 추가하는 것이다.b는 [1, 2, 3, 4]
가 되어야 할 것이고 a는 [1, 2, 3]
이 되어야 깊은 복사를 하게 되는 것이다.const b = a;
를 통해서 a와 b 모두 [1, 2, 3, 4]가 될 수 있지만, 변수를 달리하여 다른 heap 공간에 '깊은 복사'
를 하는 것이다.const c = [...a, 4]; // 1, 2, 3, 4
console.log(`c의 값은 : ${c}`); // 1, 2, 3, 4
const c = [0, ...a, 4]; // 0, 1, 2, 3, 4
const a2 = [1, 2, 3];
const b2 = a2.concat(4);
console.log(`a2의 값은 : ${a}`); // 1, 2, 3
console.log(`b2의 값은 : ${b}`); // 1, 2, 3, 4
// push를 하게 되면?
const b2 = a2.push(4); // 4
// b2라는 변수를 지우면?
a2.concat(4); // 1, 2, 3
a2.push(4); // 4
concat()
또한 불변함수이기 때문에 a2.concat(4)
을 통해 데이터를 변경하려 했는데, 데이터는 변경이 된 것은 맞지만 이렇게 깊은 복사를 한 데이터를 담을 공간이 없기 때문에 콘솔에서는 그대로 1, 2, 3
이 나온다.const a3 = [1, 2, 3];
a3.filter((e)=>{ // n에 차례대로 배열의 데이터가 들어온다.
return n !== 1;
});
// a3에 있는 데이터를 꺼내서 filter의 매개변수 안에 있는 함수에다 넣는다.
// boolean을 return한다.
console.log(a3); // [2, 3]
true
만 걸러내는 함수이다.return은 boolean
타입이다.const a4 = [1, 2, 3];
const b4 = a4.slice(0, 2); // index 번호
console.log(`b4의 값은 : ${b4}`); // [1, 2]
const c4 = [a4.slice(0, 2)]
console.log(`c4의 값은 : ${c4}`); // [[1, 2]]
// 배열 안에 배열이 들어가있음
// 이를 똑같은 답으로 나오게 하려면?
const c4 = [...a4.slice(0, 2), 4, ...a4.slice(2, 3)]
console.log(`c4의 값은 : ${c4}`); // [1, 2, 4, 3]
const c4 = [a4.slice(0, 2)]
이를 통해 a4를 slice한 배열의 배열을 c4 안에다 넣는다.const a5 = [1, 2, 3];
// 이를 반복하는 것은 for문이 가장 간단하다. 하지만 JSX에서는 사용할 수 없다.
a5.forEach((e)=>{ // 매개변수 값이 함수이다.
console.log(e); // 1, 2, 3
});
// 리턴이 안 되기 때문에 깊은 복사가 안 된다.
const b5 = a5.map((e)=> e); // 데이터를 순환하여 리턴값을 b5에 담을 수 있다.
// return문 생략이 가능하다.
console.log(b5); // 1, 2, 3
import './App.css';
function App() {
let list = [1, 2, 3];
return (
<div>
<div>{list[0]}</div>
</div>
);
}
export default App;
import './App.css';
function App() {
let list = [1, 2, 3];
return (
<div>
<div>{list.map((n) => <h1>{n}</h1>)}</div>
</div>
);
}
export default App;
[1, 2, 3]
이 될 것이다.map()
을 사용하는 이유는 가공할 수 있다는 장점이다.import './App.css';
function App() {
let list = [1, 2, 3];
return (
<div>
<div>{list.map((n) => n + 10)}</div>
</div>
);
}
export default App;
import './App.css';
function App() {
let list = [1, 2, 3];
return(
<div>
<div>{list.map(n => <h1>{n}</h1>)}</div>
</div>
);
}
React 오프라인 4강 - 배열(map, filter, slice, concat, spread 연산자) - 메타코딩