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;
