위 그림과 같이 App컴포넌트 안에 Form컴포넌트를 넣어 작업하는 것을 전제로 한다.
리액트에서 프론트 화면을 구성할 때 보통 input태그를 활용하며,
submit을 통해 백엔드서버로 보내게 된다.
<script type="text/babel">
class Form extends React.Component{
render(){
return(
<form>
내용 : <input type="text" value="" />
<input type="submit" value="확인" />
</form>
)
}
}
</script>
state를 사용하면 실시간 검색 등을 구현할 수 있다.
위 제작된 form 내 두가지 이벤트를 생성한다.
체크하기!
input에 변경된 값을 넣어주기 위해서는 state를 ''로 두는 것이 아니라 setState로 state를 아예 변경해야한다. (매개변수 e에 대해 상태변경 값이 바로 출력된다.)
<script type="text/babel">
class Form extends React.Component{
state = {
value : "",
}
handleChange = (e) => {
console.log(e.target.value)//상태 value값이 아님 input의 value값임
this.setState({
...this.state,
value : e.target.value
})
}
handleSubmit = (e) => {
e.preventDefault()
console.log(this.state.value)
}
render(){
// const {state:{value}} = this
return(
<form onSubmit={this.handleSubmit}>
내용 : <input type="text" value={this.state.value} onChange={this.handleChange}/>
//변경된 값 넣어줘야한다!!!!! 안그럼 이벤트는 발생하는데 받아오지 못한다.
<input type="submit" value="확인" />
<h3>{this.state.value}</h3>
</form>
)
}
}
</script>
결과물은 다음과 같이 나온다.
혹, 부모 컴포넌트에서 자식컴포넌트에게 값을 보내 출력하고 싶은 경우 props를 활용한다.
지면상 간단하게 표시한다
<script>
class App extends React.Component {
render(){
return(
<div>
<Form color = {"red"}/>
</div>
)
}
}
</script>
Form 컴포넌트에 {this.props.color} 값만 넣어주면 원하는대로 출력된다.
react deverper tools을 설치하면 컴포넌트 간 공유, 상속되는 props, state 값을 조회할 수 있다.
리액트는 부모-자식 컴포넌트 간 값을 공유할 수 있지만,
같은 부모컴포넌트를 둔 또다른 형제 컴포넌트 간 값의 공유는 불가능하다.
따라서, 변경상태를 공유하기 위해서는
부모컴포넌트가 자식컴포넌트에서 값을 끌어올려서 반영한 후 다시 자식컴포넌트들에게 보내야 한다.
몹시 불편하지만 나중에 쉽게(?!) 값을 공유할 수 있는 리덕스라는 친구가 나온다.
<script>
class App extends React.Component {
state ={
value : "",
}
changeValue = (v) => {
this.setState ({
...this.state,
value : v
})
}
render(){
return(
<div>
<Form vlaue ={this.state.value} change={this.changeValue}/>
<Value vlaue={this.state.value} />
</div>
)
}
}
</script>
<script>
class Form extends React.Component{
handleChange = (e) => {
const {target:{value}} = e
this.props.change(value)
//부모 컴포넌트가 보낸 함수가 props 들어오면 그것을 change값으로 변경함
}
handleSubmit = (e) => {
e.preventDefault()
}
render(){
const {props:{
value
},
handleChange,
handleSubmit
} = this
return(
<form onSubmit={handleSubmit}>
내용 : <input type="text" value={value} onChange={handleChange}/>
<input type="submit" value="확인" />
</form>
)
}
}
</script>
자식컴포넌트는 부모로부터 받은 함수가 props로 들어오면 그것을 change값으로 변경하게 되는데, 자식에 의해 부모 컴포넌트가 변경된 값이 반영되면 그 값을 또 다른 컴포넌트로 공유할 수 있게 된다.
참고로 부모로부터 state값을 props로 받아오기 때문에 form의 state는 필요없어졌다.
<script>
class Value extends React.Component {
render(){
return(
<div>
<h1>{this.props.value}</h1>
</div>
)
}
}
</script>
혹시?
그렇다면, 부모와 자식/형제 컴포넌트들에 값을 더욱 편하게 옮기기 위해서는
최상단 컴포넌트에 state를 작성하는 것이 좋은 것이 아닐까?