์ค๋์ ref์ ๋ํด์ ๊ณต๋ถํด๋ณด์๋ค.
๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ ์ฑ ์ ๋ณด๋ฉด์ ๊ณต๋ถ๋ฅผ ํ๋ค๊ฐ ref์ ๋ํด์ ์ดํด๊ฐ ๋ถ์กฑํด์ ๊ณต์๋ฌธ์๋ฅผ ์ฐพ์๋ณด๊ฒ ๋์๋ค.
ko.reactjs.org/docs/refs-and-the-dom.html
ref(Reference)
ref๋ ๋ ํผ๋ฐ์ค๋ผ๋ ๋ป์ธ๋ฐ, ์ด๋ฅผ ๋ฒ์ญํ๋ฉด ์ฐธ์กฐ๋ผ๋ ๋ง์ด๋ค.
๊ณผ์ฐ ์ฝ๋ฉ์์ ์ฐธ์กฐ๋ผ๋ ๊ฒ์ ์ด๋ค ๊ฒ์ ๋ปํ๋ ๊ฒ์ผ๊น?
์๋ ๋ค๋ฅธ ์ธ์ด๋ฅผ ๋ฐฐ์ธ ๋, ์ฐธ์กฐ๋ ๋ณต์ ์ ๋น๊ต๊ฐ ๋์์๋ค.
๋ณต์ ๋ ํ์ผ์ ๋ณต์ฌํ๋ ๊ฒ์ด๋ผ๋ฉด, ์ฐธ์กฐ๋ ๋ฐ๋ก๊ฐ๊ธฐ๋ฅผ ๋ง๋๋ ๊ฒ๊ณผ ๊ฐ๋ค๊ณ ๋น์ ๋์๋ค.
์ฐธ์กฐ๋ ์๋ณธ ํ์ผ์ ๋ํ ์ฃผ์ ๊ฐ์ด ๋ด๊ฒจ์์ด์ ๋๊ตฐ๊ฐ๊ฐ ์ด ๋ฐ๋ก๊ฐ๊ธฐ์ ์ ๊ทผํ๋ค๋ฉด ์ฌ๊ธฐ์ ์ ์ฅ๋ ์๋ณธ์ ์ฃผ์๋ฅผ ์ฐธ์กฐํด์ ์๋ณธ์ ์์น๋ฅผ ์์๋ด๊ณ ์๋ณธ์ ๋ํ ์์ ์ ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ฝ๊ฒ ๋งํ๋ฉด, ์๊ฒฉ์ผ๋ก ์ ์ดํ ์ ์๊ฒ ๋ง๋๋ ๊ฒ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค๐ค
ref๋ฅผ ์ฌ์ฉํ๋ ์ด์ !
DOM์ ๊ผญ ์ง์ ์ ์ผ๋ก ๊ฑด๋๋ ค์ผ ํ ๋
- ํฌ์ปค์ค, ํ ์คํธ ์ ํ์์ญ, ๋ฏธ๋์ด์ ์ฌ์ ๊ด๋ฆฌ ์
- ์ ๋๋ฉ์ด์ ์ ์ง์ ์ ์ผ๋ก ์คํํ ๋
- ์๋ ํํฐ DOM ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ React์ ๊ฐ์ด ์ฌ์ฉํ ๋
- ํน์ input์ ํฌ์ปค์ค ์ฃผ๊ธฐ
- ์คํฌ๋กค ๋ฐ์ค ์กฐ์ํ๊ธฐ
- Canvas ์์์ ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ
state๋ฅผ ์ฌ์ฉํด์ ํ์ํ ๊ธฐ๋ฅ์ ๊ตฌํํ์ง๋ง, state๋ง์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ค.
์ฌ๊ธฐ์ input์ ํฌ์ปค์ค๋ฅผ ์ฃผ๋ ์์ ๋ฅผ ํด๋ณผ๊ฑด๋ฐ, ๋๋ input์ ํฌ์ปค์ค๋ฅผ ์ค๋ค๋ ๋ง์ ์๋ฏธ๋ฅผ ์ฒ์์ ๋ชฐ๋๋ค.
input์ ํฌ์ปค์ค๋ฅผ ์ค๋ค๋ ๋ง์!
๋ณดํต input์ฐฝ์ ๊ตฌํํด์ ๋ฐ์ดํฐ๋ฅผ ์ง์ด๋ฃ๊ณ ์์ ์ ๋ ฅ๋ฒํผ์ ๋๋ฅด๊ฒ ๋๋ฉด ์ปค์๊ฐ ๊น๋นก์ด๋ ํจ๊ณผ๊ฐ ์ฌ๋ผ์ ธ ๋ค์ input๊ฐ์ ๋ฃ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ๋ค์ input์ฐฝ์ ๋๋ฅด๊ณ ์์ฑํด์ผ๋๋ค๋ ์ ์ ๋๋ค.
๋ฐ๋ผ์, input์ฐฝ์ ํฌ์ปค์ค๋ฅผ ์ฃผ๊ฒ ๋๋ฉด ์์ ์์์ '๊ฒ์ ํ๊ธฐ'๋ฒํผ์ ๋๋ฅด๊ณ ๋ ๋ฐ๋ก ๋ค๋ฅธ ๊ฐ์ ๊ฒ์ ํด๋ณผ ์ ์๋ค!!
//ref ์ฌ์ฉ ์ ์ฝ๋
import React, { Component } from 'react';
import './ValidationSample.css';
class ValidationSample extends Component {
state = {
password: '',
clicked: false,
validated: false
}
handleChange = (e) => {
this.setState({
password: e.target.value
});
}
handleButtonClick = () => {
this.setState({
clicked: true,
validated: this.state.password === '0000', //password๊ฐ 0000์ผ๋ true๋ก ๋ฐํ
password: ''
})
}
onKeyPress = (e) => {
if (e.key === 'Enter') {
this.handleButtonClick();
}
}
render() {
return (
<div>
<input
type='password'
value={this.state.password}
onChange={this.handleChange}
className={this.state.clicked ? (this.state.validated ? 'success' : 'failure') : ''}
{/*ํด๋ฆญ์ ํ๋๋ฐ, ๋น๋ฐ๋ฒํธ๊ฐ 0000์ผ ๊ฒฝ์ฐ success๋ฅผ ๋ฐํ!*/}
onKeyPress={this.onKeyPress}
/>
<button onClick={this.handleButtonClick}>๊ฒ์ฆํ๊ธฐ</button>
</div>
);
}
}
export default ValidationSample;
์ด ์ฝ๋์์ ์ธํ์ ํฌ์ปค์ค๋ฅผ ์ค๋ณด๊ฒ ์ต๋๋ค!
<input
ref = {(ref) => this.input=ref}
type='password'
value={this.state.password}
onChange={this.handleChange}
className={this.state.clicked ? (this.state.validated ? 'success' : 'failure') : ''}
{/*ํด๋ฆญ์ ํ๋๋ฐ, ๋น๋ฐ๋ฒํธ๊ฐ 0000์ผ ๊ฒฝ์ฐ success๋ฅผ ๋ฐํ!*/}
onKeyPress={this.onKeyPress}
/>
input ํ๊ทธ ์์ ref๋ฅผ ๋ฌ์๋ณด์์ต๋๋ค!
์ฌ๊ธฐ์ ์ฃผ์ํ ์ !!
ref๋ฅผ ๋ฌ์์ผ๋ฉด ์ ์ธ์ ํด์ค์ผ๊ฒ ์ฃ ?
renderํจ์ ์ ์ input; ์ผ๋ก ํธ์ถํ๊ฑฐ๋ ๋ง์ง๋ง ๋์์ธ handleButtonClick ํจ์ ์์ this.input.focus();๋ก ์คํ ์์ผ์ค๋๋ฉ๋๋ค.
handleButtonClick = () => {
this.setState({
clicked: true,
validated: this.state.password === '0000', //password๊ฐ 0000์ผ๋ true๋ก ๋ฐํํ๋ผ๋ ๊ฑด๊ฐ?
password: ''
})
//๋๋ฒ์งธ ๋ฐฉ๋ฒ
this.input.focus();
}
//์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ
input;
}
๊ณต๋ถํ๋ค๋ณด๋ ref๋ ๋ฒ๊ฑฐ๋ก์์ ์ค์ฌ์ฃผ๋ ๊ธฐ๋ฅ์ธ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐ์ด ๋ค์๋ค.
๊ทธ ๋ถ๋ถ์ ์๊ฒฉ์ผ๋ก ์ง์ ํ ์ ์๋๋ก(?) ๋์์ฃผ๋ ๊ฒ ๊ฐ๋ค๊ณ ๋๋ ์ดํด๋ฅผ ํ๋ค!
์ด๋ฐ ๊ฑธ ๋ณด๋ ๊ฒ์ผ๋ฅธ ์ฌ๋์ด ์๋น์ค๋ฅผ ๋ง๋ค์ด๋ธ๋ค๋ ๊ฒ์ด ๋ ์๋ฟ๋ ๊ฒ ๊ฐ์๋ค
๋ ํธํ ์๋น์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ๋๋ ๊ณ์ ๊ณต๋ถํด์ผ๊ฒ ๋ค!!
'WEB > REACT' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] ํ (Hooks) (0) | 2021.01.06 |
---|---|
[React] ์คํฌ๋กค๋ฐ์ค ์ฝ๋์ ์์๋ ์ด๋ ๊ธฐ๋ฅ ๊ตฌํ (0) | 2021.01.02 |
[React] render() ํจ์ (0) | 2020.12.30 |
[React] ํจ์ํ ์ปดํฌ๋ํธ VS ํด๋์คํ ์ปดํฌ๋ํธ (0) | 2020.12.29 |
[React] JSX (0) | 2020.12.23 |