January 08, 2021
input ํ๊ทธ์ onChange ์ด๋ฒคํธ ํจ์๋ฅผ ์ง์ ์คํ ํ๋ฉด์ setState ๋ฅผ ํธ์ถํ๊ฒ ํ์ฌ ์ํ๋ฅผ ๋ณ๊ฒฝ์ํจ๋ค.
๊ทธ๋ฐ๋ฐ input ์ value ์์ฑ์ this.state.message ๋ฅผ ํ๊ธฐํด์ฃผ์ด์ผ ํ๋์ง๋ ์์ง ํ์ธ ์งํ ์ค์ด๋ค.
button ํ๊ทธ์๋ onClick ์ด๋ฒคํธ ํจ์๋ฅผ ์ ์ฉํด์ message ์ ์ํ๋ฅผ ๋น์ฐ๊ณ input ์ id ๋ฅผ ์ค์, DOM ์์ ๋ฅผ ์ ํํ๊ฒ ํด์
์ ๋ ฅ๊ฐ์ ์ด๊ธฐํํ๊ฒ ํ๋ค.
import React, { Component } from 'react'
class EventPractice extends Component {
constructor(props) {
super(props)
this.state = {
message: '',
}
}
render() {
return (
<div>
<h1>๋ด์ธ์์ ์ด๋ฒคํธ๋ ์ธ์ ์ค๋</h1>
<input
id="msg"
type="text"
name="message"
value={this.state.message}
placeholder="์ํด์๋ง์์
๋ ฅํ์ธ์"
onChange={e => this.setState({ message: e.target.value })}
/>
<button
onClick={() => {
alert(this.state.message)
document.querySelector('#msg').value = ''
this.setState({ message: '' })
}}
>
ํ์ธ
</button>
</div>
)
}
}
export default EventPractice
ํจ์๊ฐ ํธ์ถ๋ ๋ this ๋ ํธ์ถ๋ถ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ฏ๋ก, ํด๋์ค์ ์์ ๋ฉ์๋๊ฐ ํน์ HTML ์์์ ์ด๋ฒคํธ๋ก ๋ฑ๋ก๋๋ ๊ณผ์ ์์ ๋ฉ์๋์ this ์ ๊ด๊ณ๊ฐ ๋์ด์ ธ ๋ฒ๋ฆฐ๋ค๊ณ ํ๋ค.
์ด ๋๋ฌธ์ ์์ ๋ฉ์๋๊ฐ ์ด๋ฒคํธ๋ก ๋ฑ๋ก๋์ด๋ this ๋ฅผ ์ปดํฌ๋ํธ ์์ ์ผ๋ก ์ ๋๋ก ๊ฐ๋ฆฌํค๊ธฐ ์ํด์๋ ๋ฉ์๋๋ฅผ this ์ ๋ฐ์ธ๋ฉ (binding) ํ๋ ์์ ์ด ํ์ํ๋ค.
import React, { Component } from 'react'
class EventPractice extends Component {
constructor(props) {
super(props)
this.state = {
message: '',
}
this.handleChange = this.handleChange.bind(this)
this.handleClick = this.handleClick.bind(this)
}
handleChange(event) {
this.setState({
message: event.target.value,
})
}
handleClick() {
alert(this.state.message)
document.querySelector('#msg').value = ''
this.setState({
message: '',
})
}
render() {
return (
<div>
<h1>๋ด์ธ์์ ์ด๋ฒคํธ๋ ์ธ์ ์ค๋</h1>
<input
id="msg"
type="text"
name="message"
value={this.state.message}
placeholder="์ํด์๋ง์์
๋ ฅํ์ธ์"
onChange={this.handleChange}
/>
<button onClick={this.handleClick}>ํ์ธ</button>
</div>
)
}
}
export default EventPractice
๋ง์ฝ ๋ฐ์ธ๋ฉํ์ง ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด this ๊ฐ undefined ๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
๋ด๊ฐ ํ์ฌ ์์ฑํ ์ฝ๋๋ constructor ํจ์์์ ํจ์๋ฅผ ๋ฐ์ธ๋ฉ ํ๋ ์์ ์ด ์ด๋ฃจ์ด์ง๊ณ ์๋ค.
๊ทธ๋ฐ๋ฐ bind ๋ฅผ ์จ์ฃผ๊ธฐ๊ฐ ๋๋ฌด ๊ท์ฐฎ๊ณ ์ซ๋ค๋ฉด?
๋ฐ๋ก ์๊ฐํ ์ฒซ๋ฒ์งธ ๋ฐฉ์์ผ๋ก ์ด๋ฒคํธ ํจ์๋ฅผ ์ง์ ์ต๋ช ํจ์๋ก ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ด ์์ง๋ง ๋ ์์ด์ ์ธ ๋ฐฉ๋ฒ์ด ์๋ค.
Property Initializer Syntax ๋ผ๋๋ฐ ์ด๋ฐ ์ด๋ ค์ด ์ฉ์ด ๋ ์ ์ด๋๊ณ ์ ์ด์ ํจ์๋ฅผ ํ์ดํ ํจ์ ํํ๋ก ๋ง๋ค์ด ์ ์ํด๋ฒ๋ฆฌ๋ฉด,
๋ฉ์๋๋ฅผ ์๋ก ๋ง๋ค๋๋ง๋ค constructor ์ bind(this) ์ ์ด์ฃผ๊ณ ์์ ํ ํ์๊ฐ ์์ด์ง๋ค.
handleChange = event => {
this.setState({
message: event.target.value,
})
}
handleClick = () => {
alert(this.state.message)
document.querySelector('#msg').value = ''
this.setState({
message: '',
})
}