ES6 ์์ด ์ฌ์ฉํ๋ React
These docs are old and wonโt be updated. Go to react.dev for the new React docs.
๋ณดํต React ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ ๋ JavaScript์ class๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ด์ ๊ฐ์ ๊ฒ๋๋ค.
class Greeting extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
์์ง ES6๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด, ๊ทธ ๋์ create-react-class
๋ชจ๋์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
var createReactClass = require('create-react-class');
var Greeting = createReactClass({
render: function() {
return <h1>Hello, {this.props.name}</h1>;
}
});
ES6 class์ API๋ ๋ช๋ช ์ฐจ์ด์ ์ ์ ์ธํ๊ณ ๋ createReactClass()
์ ๋น์ทํฉ๋๋ค.
Props ๊ธฐ๋ณธ๊ฐ ์ ์ธ
ํจ์์ ES6์ class๋ฅผ ํตํด defaultProps
๋ฅผ ์ปดํฌ๋ํธ ๊ทธ ์์ฒด์ ์์ฑ์ผ๋ก์ ์ ์ํ ์ ์์ต๋๋ค.
class Greeting extends React.Component {
// ...
}
Greeting.defaultProps = {
name: 'Mary'
};
createReactClass()
๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์ธ์๋ก ๋๊ฒจ์ง๋ ๊ฐ์ฒด ๋ด์์ getDefaultProps()
๋ฅผ ํจ์๋ก ์ ์ํด์ผ ํฉ๋๋ค.
var Greeting = createReactClass({
getDefaultProps: function() {
return {
name: 'Mary'
};
},
// ...
});
์ด๊ธฐ State ์ ์
ES6 class์ ์์ฑ์์์ this.state
์ ๊ฐ์ ํ ๋นํ๋ฉด state์ ์ด๊ธฐ๊ฐ์ ์ ์ํ ์ ์์ต๋๋ค.
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {count: props.initialCount};
}
// ...
}
createReactClass()
๋ฅผ ์ฌ์ฉํ ๋๋ง๋ค ์ด๊ธฐ state๋ฅผ ๋ฐํํ๋ getInitialState
๋ฉ์๋๋ฅผ ์ ๊ณตํด์ผ๋ง ํฉ๋๋ค.
var Counter = createReactClass({
getInitialState: function() {
return {count: this.props.initialCount};
},
// ...
});
์๋ ๋ฐ์ธ๋ฉ
ES6 class๋ก์ ์ ์ธ๋ React ์ปดํฌ๋ํธ์์ ๋ฉ์๋๋ ์ผ๋ฐ์ ์ธ ES6 class์ผ ๋์ ๋น์ทํฉ๋๋ค. ์ฆ, this
๋ฅผ ์ธ์คํด์ค์ ์๋์ผ๋ก ๋ฐ์ธ๋ฉํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๊ฒฝ์ฐ์๋ ์์ฑ์์์ ๋ณ๋๋ก .bind(this)
๋ฅผ ์ฌ์ฉํด ์ฃผ์ด์ผ ํฉ๋๋ค.
class SayHello extends React.Component {
constructor(props) {
super(props);
this.state = {message: 'Hello!'};
// ์ด ๋ถ๋ถ์ด ์ค์ํฉ๋๋ค!
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
alert(this.state.message);
}
render() {
// `this.handleClick`์ด ๋ฐ์ธ๋ฉ ๋์๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
return (
<button onClick={this.handleClick}>
Say hello
</button>
);
}
}
๋ฐ๋ฉด์ createReactClass()
๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์์์ ๋ชจ๋ ๋ฉ์๋๋ฅผ ๋ฐ์ธ๋ฉํ๊ธฐ ๋๋ฌธ์ ์์ ๊ณผ์ ์ด ํ์ํ์ง๋ ์์ต๋๋ค.
var SayHello = createReactClass({
getInitialState: function() {
return {message: 'Hello!'};
},
handleClick: function() {
alert(this.state.message);
},
render: function() {
return (
<button onClick={this.handleClick}>
Say hello
</button>
);
}
});
์ด๋ ES6์ class๋ฅผ ์ฌ์ฉํด ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ฒ๋ฆฌํ ๋ ๋ณด๋ค ๋ฐ๋ณต๋๋ ์ฝ๋๊ฐ ๋ง์์ง๋ค๋ ๋ป์ ๋๋ค. ํ์ง๋ง ํฐ ๊ท๋ชจ์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ class๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ์ฑ๋ฅ์ด ์กฐ๊ธ ๋ ์ข์์ง๋๋ค.
๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ ์ฐ๊ธฐ ์ซ๋ค๋ฉด, ES2022 Class Properties ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
class SayHello extends React.Component {
constructor(props) {
super(props);
this.state = {message: 'Hello!'};
}
// ํ์ดํ ํจ์๋ฅผ ํตํด ๋ฉ์๋๋ฅผ ๋ฐ์ธ๋ฉํฉ๋๋ค.
handleClick = () => {
alert(this.state.message);
};
render() {
return (
<button onClick={this.handleClick}>
Say hello
</button>
);
}
}
๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ๋ค๋ฅธ ์ ํ์ง๋ ์์ต๋๋ค.
- ์์ฑ์์์ ๋ฉ์๋๋ค์ ๋ฐ์ธ๋ฉํฉ๋๋ค.
onClick={(e) => this.handleClick(e)}
์ ๊ฐ์ด ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.createReactClass
๋ฅผ ๊ณ์ ์ฌ์ฉํฉ๋๋ค.
Mixins
์ฃผ์
ES6์์๋ ์ฒ์๋ถํฐ mixin์ ๋ํ ์ด๋ ํ ์ง์๋ ์์์ต๋๋ค. ๋ฐ๋ผ์, React์์ ES6 class๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ์๋ mixin์ ๋ํ ๋ณ๋์ ์ง์์ ์์ต๋๋ค.
๋ํ ์ ํฌ ํ์ mixin์ ์ฌ์ฉํ Codebase์์ ์ ๋ง์ ๋ฌธ์ ์ ๋ค์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด์ ๋ฐ๋ผ ์ ํฌ๋ ์๋ก ์์ฑํ๋ ์ฝ๋์์๋ mixin์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค.
ํด๋น ๊ธ์ ์ฐธ๊ณ ๋ชฉ์ ์ผ๋ก๋ง ๋ณด์๊ธธ ๋ฐ๋๋๋ค.
๊ฐ๋์ ์ ํ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ค์ด ์ด๋ ์ ๋ ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ณต์ ํ ์๋ ์์ต๋๋ค. ๊ฐํน ๋ฐ์ํ๋ ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ๋ฒ์ญ๊ณผ ๋งํฌ์ ๊ดํ ํก๋จ ๊ด์ฌ์ฌ๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ๋์ฒ๋ฒ์ผ๋ก์ createReactClass
๋ฅผ ํตํด ๋ ์ด์ ์ฐ์ด์ง ์๋ ์ฝ๋์ธ mixins
์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
mixin์ ์ฌ์ฉํ๋ ํํ ์๋ก๋ ์๊ฐ ๊ฐ๊ฒฉ์ ๋๊ณ ๋ฐ๋ณต์ ์ผ๋ก ์ค์ค๋ก ๋ด์ฉ์ ๊ฐฑ์ ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ ์ ํ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด๋ setInterval()
์ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ๋ง๋ค ์ ์์ง๋ง, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๊ธฐ ์ํด์ ์ปดํฌ๋ํธ๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ ๋ ์ด๋ฅผ ์ทจ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. React๋ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋๊ฑฐ๋ ํ๊ดด๋๊ธฐ ์ง์ ์ ์ด๋ฅผ ์๋ ค์ฃผ๋ ์ญํ ์ ํฉ๋๋ค. ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ ๊ฐ๋จํ mixin์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ด mixin์ ์ปดํฌ๋ํธ๊ฐ ํ๊ดด๋ ๋ ์๋์ผ๋ก ์ ๋ฆฌ๋๋ setInterval()
ํจ์ ๊ธฐ๋ฅ์ ์ ๊ณตํด ์ค๋๋ค.
var SetIntervalMixin = {
componentWillMount: function() {
this.intervals = [];
},
setInterval: function() {
this.intervals.push(setInterval.apply(null, arguments));
},
componentWillUnmount: function() {
this.intervals.forEach(clearInterval);
}
};
var createReactClass = require('create-react-class');
var TickTock = createReactClass({
mixins: [SetIntervalMixin], // mixin์ ์ฌ์ฉ
getInitialState: function() {
return {seconds: 0};
},
componentDidMount: function() {
this.setInterval(this.tick, 1000); // mixin์์ ๋ฉ์๋๋ฅผ ํธ์ถ
},
tick: function() {
this.setState({seconds: this.state.seconds + 1});
},
render: function() {
return (
<p>
React has been running for {this.state.seconds} seconds.
</p>
);
}
});
const root = ReactDOM.createRoot(document.getElementById('example'));
root.render(<TickTock />);
ํ๋์ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ์ ์ํ ์ฌ๋ฌ mixin์ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํด๋ด ์๋ค. ์๋ฅผ ๋ ๋ค๋ฉด, mixin๋ค์ด ์ปดํฌ๋ํธ๊ฐ ํ๊ดด๋ ๋ ์ด๋ ํ ์ ๋ฆฌ ๋์์ ํ๋ ค๊ณ ํ ์๋ ์์ต๋๋ค. ์ด ๋๋ ๋ชจ๋ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋์ ํธ์ถ์ด ๋ณด์ฅ๋ฉ๋๋ค. mixin์์ ์ ์๋ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ค์ mixin์ด ๋์ด๋ ์์๋๋ก ์๋๋๋ฉฐ ๊ทธ ๋ค์ ์ปดํฌ๋ํธ์ ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค.