React ์ฑ ์์ ๋ค๋ฅธ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ผ๋ง๋ ์ง ํฌํจ์ํฌ ์ ์๋ค.
React๋ React์ ์ธ๋ถ DOM์์ ์ผ์ด๋๋ ๋ณํ๋ฅผ ์ธ์ํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ DOM ๋ ธ๋๋ฅผ ๋ค๋ฃฌ๋ค๋ฉด ํผ๋์ค๋ฌ์ธ ๊ฒ์ด๋ค. ์ด ์ถฉ๋์ ํผํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ React ์ปดํฌ๋ํธ๊ฐ ์ ๋ฐ์ดํธ๋์ง ์๊ฒ ๋ง๋ ๊ฒ์ด๋ค.
jQuery ํ๋ฌ๊ทธ์ธ์ด DOM์ ์ผ๋ถ์ ์์ ๋กญ๊ฒ ์ ๊ทผํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ wrapper๋ฅผ ์ ์ํ ์ ์๋ค.
class SomePlugin extends React.Component {
componentDidMount() {
this.$el = $(this.el);
this.$el.somePlugin();
}
componentWillUnmount() {
this.$el.somePlugin('destroy');
}
render() {
return <div ref={(el) => (this.el = el)} />;
}
}
- ์ต์์ DOM ์๋ฆฌ๋จผํธ์ ref๋ฅผ ๋ถ์ธ๋ค.
render()
๋ฉ์๋์์ ๋น<div />
๋ฅผ ๋ฐํํจ์ผ๋ก์จ React ์ปดํฌ๋ํธ๊ฐ ์ ๋ฐ์ดํธ๋์ง ์๋๋ก ๋ง๋๋ค.componentDidMount
,componentWillUnmount
์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ์ ์ํ์ฌ jQuery ํ๋ฌ๊ทธ์ธ์ด DOM์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํ๊ณ , ํด์ ํ๋๋ก ํ๋ค. (๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํ๋ฌ๊ทธ์ธ์ด ๋ฑ๋กํ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ํ์! - ํด์ ํ๋ ๋ฉ์๋ ์์ผ๋ฉด ๋ง๋ค์ด์๋ผ๋)
function Example() {
return (
<Chosen onChange={(value) => console.log(value)}>
<option>vanilla</option>
<option>chocolate</option>
<option>strawberry</option>
</Chosen>
);
}
class Chosen extends React.Component {
componentDidMount() {
this.$el = $(this.el);
this.$el.chosen();
this.handleChange = this.handleChange.bind(this);
this.$el.on('change', this.handleChange);
}
componentDidUpdate(prevProps) {
if (prevProps.children !== this.props.children) {
this.$el.trigger('chosen:updated');
}
}
componentWillUnmount() {
this.$el.off('change', this.handleChange);
this.$el.chosen('destroy');
}
handleChange(e) {
this.props.onChange(e.target.value);
}
render() {
return (
<div>
<select className="Chosen-select" ref={(el) => (this.el = el)}>
{this.props.children}
</select>
</div>
);
}
}
- React๊ฐ ๊ด์ฌํ๋ ํ
<div>
๋ ํญ์ ๋จ์ผ ์์๋ง ๊ฐ์ง๋ฉฐ, React ์ ๋ฐ์ดํธ๋ Chosen์ ์ํด ์ถ๊ฐ๋ ์ธ๋ถ DOM ๋ ธ๋์ ์ถฉ๋ํ์ง ์๋๋ค. componentDidMount
์์<select>
๋ ธ๋์ ref๋ฅผ ํตํด Chosen์ ์ด๊ธฐํํ๊ณ ,componentWillUnmount
์์ ํด์ ํ๋ค.- ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋ฆผ์ ๋ฐ๊ธฐ ์ํด Chosen์ด ๊ด๋ฆฌํ๋
<select>
์์ jQuery change ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ๋ค.this.props.onChange
๋ฅผ ํธ์ถํ๋handleChange()
๋ฉ์๋๋ฅผ ์ ์ธํ๊ณ jQuery change ์ด๋ฒคํธ๋ก ๊ตฌ๋ ํ๋ค. (DidMount
์์on
,WillUnmount
์์off
) - React๊ฐ DOM์ ๊ด๋ฆฌํ์ง ์์ผ๋ฏ๋ก, props๊ฐ ์
๋ฐ์ดํธ๋ ๋๋ง๋ค ์๋์ผ๋ก DOM์ ์
๋ฐ์ดํธํด์ค์ผ ํ๋ค.
componentDidUpdate
์์ props๋ฅผ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ๋์์ ๊ฒฝ์ฐ Chosen์๊ฒtrigger()
API๋ฅผ ํตํด ์๋ ค์ค๋ค.
ReactDOM.render()
๋ฉ์๋๋ ๋
๋ฆฝ์ ์ธ UI์ ๋ํด ์ฌ๋ฌ ๋ฒ ํธ์ถ๋ ์ ์๋๋ฐ, ์ด ์ ์ฐ์ฑ ๋๋ถ์ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์
์ React๋ฅผ ํฌํจ์ํฌ ์ ์๋ค.
์ด์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ $el.html(htmlString)
์ฒ๋ผ DOM์ ์ผ๋ถ๋ถ์ ๋ฌธ์์ด๋ก์ DOM์ ์ฝ์
ํ๋ ๋ฐฉ์์ด์๋ค. ์ด๋ฅผ React ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ ์์ฑํ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ jQuery ๊ตฌํ์
$('#container').html('<button id="btn">Say Hello</button>');
$('#btn').click(function () {
alert('Hello!');
});
๋ค์๊ณผ ๊ฐ์ด React ์ปดํฌ๋ํธ๋ฅผ ํตํด ์ฌ์์ฑํ ์ ์๋ค.
function Button() {
return <button id="btn">Say Hello</button>;
}
ReactDOM.render(<Button />, document.getElementById('container'), function () {
$('#btn').click(function () {
alert('Hello!');
});
});
๋ค๋ง, ์ ์ฝ๋์์๋ ๋์ผํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ ๋๋งํ ์ ์์ผ๋ฏ๋ก ID๋ฅผ ํตํ ๋ฐฉ์์ด ์๋ React ์ด๋ฒคํธ ์์คํ ์ ํตํด ํด๋ฆญ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ๋ ๊ฒ์ด ๋ ์ข๋ค.
function Button(props) {
return <button onClick={props.onClick}>Say Hello</button>;
}
function HelloButton() {
function handleClick() {
alert('Hello!');
}
return <Button onClick={handleClick} />;
}
ReactDOM.render(<HelloButton />, document.getElementById('container'));
Backbone ๋ทฐ๋ ๋ฌธ์์ด์ ํตํด DOM ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ๋ค. ์ด ํ๋ก์ธ์ค๋ฅผ ReactDOM.render()
๋ฉ์๋๋ฅผ ์ฌ์ฉํด React ์ปดํฌ๋ํธ ๋ ๋๋ง์ผ๋ก ๋์ฒดํ ์ ์๋ค.
function Paragraph(props) {
return <p>{props.text}</p>;
}
const ParagraphView = Backbone.View.extend({
render() {
// Backbone์ render() ํจ์ ์ค๋ฒ๋ผ์ด๋
const text = this.model.get('text');
// `this.el`์ด ์ ๊ณตํ๋ DOM ์์์ <Paragraph /> ์ปดํฌ๋ํธ ๋ ๋๋ง
ReactDOM.render(<Paragraph text={text} />, this.el);
return this;
},
remove() {
// React ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๊ธฐํ ์์๋ค์ ๋ฑ๋ก ํด์
ReactDOM.unmountComponentAtNode(this.el);
Backbone.View.prototype.remove.call(this);
},
});
์ด ์ด์์ ๋ด์ฉ๋ค์ ๋์ค์ ์ฐพ์๋ณด๋ ๊ฒ์ด ๋ ์ ์ตํ ๊ฒ ๊ฐ์์ ์ด ์ ๋๋ก๋ง ์ ๋ฆฌํ๊ฒ ๋ค. ์ด๋ฒ ๋ฌธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํตํฉํ๊ธฐ์ ๋ํ ๋ง๋ณด๊ธฐ์ฉ !! (Backbone์ ์จ๋ณธ ๊ฒฝํ์ด ์๊ณ ์ ๋ชจ๋ฆ, ๋์ค์ ์ธ ์ผ์ด ์๊ธธ ๋ ์ฐพ์๋ณด๋ ๊ฒ์ด ๋ ์ข์ ๊ฒ ๊ฐ์)