React - 배열에 데이터 삽입하기
자식 컴포넌트가 부모한테 값을 전달하려면 app 컴포넌트 내에서 handleCreate라는 메소드를 만든 후 자식 컴포넌트에 props로 전달해주고 호출시켜서 데이터가 app한테 들어가게끔 한다.
App.js
import React, {Component} from 'react';
import logo from './logo.svg';
import './App.css';
import PhoneForm from './components/PhoneForm';
class App extends Component{
id = 0; //렌더링 되는 값이 아니라 state에 넣을 필요 없음. 넣었던 값이 수정되면 리렌더링을 위해 하지만 필요 없음.
state = {
information: [],
}
handleCreate = (data) => {
console.log(data);
//this.state.information.push(data)안됨
//this.setState() 뭐뭐뭐 안됨.
//리액트에서는 불변성을 유지해야 함. 내부의 배열이나 객체를 바꿀 때는 새로운 배열. 객체를 만들어서 주입해야 함.
const {information} = this.state;
this.setState({
information: information.concat({
...data,
id: this.id++
}) //배열 내장 함수 사용
});
}
render(){
return (
<div classname="App">
뭐양
<PhoneForm onCreate={this.handleCreate}/>
{JSON.stringify(this.state.information)}
</div>
)
}
}
export default App;
PhoneForm.js
//rcc, rcs
import React, { Component } from 'react';
class PhoneForm extends Component {
state = {
name : '',
phone: '',
}
handleChange = (e) =>{ //e는 이벤트 객체
this.setState({
[e.target.name]: e.target.value //input이 event.target
})
}
handleSubmit = (e)=>{ //새로고침되는거 방지함.
e.preventDefault();
this.props.onCreate(this.state); //props로 받은 거를 호출하는 거임.
this.setState({
name: '',
phone: '',
})
}
render() {
return (
<div>
이것은 PhoneForm 이라네.
<form onSubmit={this.handleSubmit}>
<input
name="name"
placeholder="기본값.이름"
onChange={this.handleChange}
value={this.state.name}
/>
<input
name="phone"
placeholder="전화번호"
onChange={this.handleChange}
value={this.state.phone}
/>
<button type="submit">등록</button>
</form>
</div>
);
}
}
export default PhoneForm;