불변성 유지
리액트에서 state 내부의 값을 직접적으로 수정하면 안된다.
-> push, splice, unshift, pop 내장함수 xxxxxxx
ex)this.state.array.push('some value')
handleCreate = (data) => {
const { information } = this.state;
this.setState({
information: information.concat({ id: this.id++, ...data })
})
리액트는 배열을 렌더링할 때 값을 통해 업데이트 성능을 최적화한다.
import React, { Component } from 'react';
class PhoneInfo extends Component {
static defaultProps = {
info: {
name: '이름',
phone: '010-0000-0000',
id: 0
}
}
render() {
const style = {
border: '1px solid black',
padding: '8px',
margin: '8px'
};
const {
name, phone, id
} = this.props.info;
return (
<div style={style}>
<div><b>{name}</b></div>
<div>{phone}</div>
</div>
);
}
}
export default PhoneInfo;
export default PhoneInfo;
import React, { Component } from 'react';
import PhoneInfo from './PhoneInfo';
class PhoneInfoList extends Component {
static defaultProps = {
data: []
}
render() {
const { data } = this.props;
const list = data.map(
info => (<PhoneInfo key={info.id} info={info}/>)
);
return (
<div>
{list}
</div>
);
}
}
export default PhoneInfoList;
Each child in a list should have a unique "key" prop.
key값을 설정하지 않은 경우 위와 같은 오류가 발생한다.
- 리스트의 다른 항목들 사이에서 해당 항목을 고유하게 식별할 수 있는 문자열을 사용한다.(=ID)
- index를 key로 사용할 경우 state와 관련된 문제가 발생하거나 성능이 저하될 수 있다.
배열을 가지고 연습하기.
arr.slice(0,1).concat(arr.slice(2,5))
[...arr.slice(0,1), ...arr.slice(2,5)]
arr.filter(nums => num !== 3);
handleRemove = (id) => {
const { information } = this.state;
this.setState({
information: information.filter(info => info.id !== id)
})
}
handleUpdate = (id, data) => {
const { information } = this.state;
this.setState({
information: information.map(
info => id === info.id
? { ...info, ...data } // 새 객체를 만들어서 기존의 값과 전달받은 data 을 덮어씀
: info // 기존의 값을 그대로 유지
)
})
}