์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์๊ณ ์์ผ๋ฉฐ ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋์ง ์ ํํ ์๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ํ์ง๋ง ํ์ฌ ์ํคํ
์ฒ์์ _์ด๋ ค์ด ๋ฌธ์ _์
๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ํ ์๊ตฌ๋ฅผ ํํํ๋ ์ถ๊ฐ ์๊ฒฌ์ ๋์์ด ๋์ง ์์ต๋๋ค. ์์ ๋กญ๊ฒ ๋ฌธ์ ๋ฅผ ๊ตฌ๋
ํ ์ ์์ง๋ง(์ค๋ฅธ์ชฝ ์ด์ ๋ฒํผ์ด ์์) ํ ๋ก ์ ๊ฐ์น๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ๋๊ธ์ ๋ฌ์ง ๋ง์ญ์์ค. "Me too" ๋ฐ "+1"์ ๊ฐ์น๊ฐ ์์ผ๋ฉฐ ์ด๋ฏธ ์ฃผ์์ ์์ฑ๋ ์ฌ์ฉ ์ฌ๋ก๋ ์๋๋๋ค(์: <tr>
๋๋ <dd>
์์๋ฅผ ๋ฃ์ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. <div>
).
๋ค์์ ๊ณ ๋ คํ์ธ์:
var ManagePost = React.createClass({
render: function() {
var posts = this.props.posts
var something;
var somethingelse;
var row = posts.map(function(post){
return(
<div>
<div className="col-md-8">
</div>
<div className="cold-md-4">
</div>
</div>
)
});
return (
{row}
);
}
});
map
<div></div>
๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. _์ธ์ XJS ์์๋ ๋๋ฌ์ธ๋ ํ๊ทธ๋ก ๋ํ๋์ด์ผ ํฉ๋๋ค_
๋ฌธ์ ์์ด ์ปดํ์ผ๋๋ ์ฃผ๋ณ ๋ฐ ์คํ๋ ค ๋ฌด์๋ฏธํ div๋ฅผ ๋ค์ ์ถ๊ฐํ ๋๊น์ง๋ ์๋๋๋ค. ๋๋ 0.11.1 ์ ์คํ ์ค์ ๋๋ค
์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๊ณ ์์ต๋๊น? ๊ทธ๊ฒ์ ํ์ด์ง์ ์ธ๋ชจ์๊ณ ๋ฌด์๋ฏธํ html์ ์ถ๊ฐํ๊ณ ๋ค์ ์ถ๊ฐํฉ๋๋ค. ํ์ด์ง์ ์๋ฌด๋ฐ ํด๋ฅผ ๋ผ์น ์ง ์์ผ๋ฉด์๋ ์ง์ ๋ถํ๊ณ ๋น์ ๋ฌธ์ ์ผ๋ก ๋ณด์ ๋๋ค. ์ ๊ฐ ๋ญ๊ฐ ์๋ชปํ๊ณ ์๋ ๊ฒ์ผ ์๋ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ฐ๋ฅด์ณ ์ฃผ์ธ์.
๋ํผ๋ฅผ ๋ฃ์ง ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์คํ์ด ์ ๊ฑฐ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
return React.DOM.div(...)React.DOM.div(...)
๊ตฌ๋ฌธ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์๊ฐ์ ๋งคํ์ด ํ์ํ ๊ฒฝ์ฐ jsx ์ปดํ์ผ๋ฌ ํ์ด์ง๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ฆ, ์ด๊ฒ์ ๋์ [div, div]
๋ก ๋์ค๊ฑฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๊ฒ์ ์ด๋ ต๊ณ ๋ค์ ๋
ผ์์ ์ฌ์ง๊ฐ ์์ผ๋ฉฐ ๊ฐ๊น์ด ์ฅ๋์ ๊ตฌํ๋์ง ์์ ๊ฒ์
๋๋ค.
(ํน๋ณํ ๋ ผ๋์ ์ฌ์ง๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ง๋ง ์ฝ๋ ๋ณต์ก์ฑ์ ์ถ๊ฐํ๊ณ ์์ง ์๋ฃ๋์ง ์์์ต๋๋ค.)
IIRC @syranide ์๋ ์ด์ ๋ํ ๋ช ๊ฐ์ง ์๊ฒฌ์ด ์์ต๋๋ค.
@์ฒญ๋ฃจ ํํ .
๋๋ ์กฐ๊ธ ์ ์ ๊ทธ๊ฒ์ ๋ํด chenglou์ ์งง์ ๋ํ๋ฅผ ๋๋ด์ต๋๋ค. ์ ๋ ํ์ฌ ์ด๋ ์ชฝ์ผ๋ก๋ ๊ธฐ์ธ์ด์ง์ง ์์ต๋๋ค. ๋ณตํฉ ๊ตฌ์ฑ ์์๊ฐ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐํํ๋๋ก ํ์ฉํ๋ ๋ฐ๋ ๋ง์ ์จ๊ฒจ์ง ์ํ์ด ์์ผ๋ฉฐ ์ง๊ด์ ์ธ ๊ฐ์ ์ด ๋ง์ด ๊นจ์ ธ ์์ง๋ง ๋ถ๋ช ํ ์ด์ ์ ์ป์ ์ ์๋ (ํ์ฌ) ๋ชจ๋ฒ ์ฌ๋ก ์ฌ์ฉ ์ฌ๋ก๋ ์์ง ๋ชปํฉ๋๋ค.
์ต๋ ํ๋์ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐํํ๋ ๋จ์ํจ์ ๋ณด์ด๋ ๊ฒ์ ๋ํด ์ถ๋ก ํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ <table><TableHeader /></table>
๋ ์ค์ ๋ก ์ํ๋ ์์ ํ์ ๋ ๋๋งํ ์ ์์ต๋๋ค TableHeader
๋ฅผ ๊ฒ์ฌํ๋ ๊ฒ ์ธ์๋ ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ฌ๋ฌ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐํํ ์ ์๋ค๋ ๊ฒ์ "๋ณตํฉ ๊ตฌ์ฑ ์์"์์ "๋ณตํฉ ๊ตฌ์ฑ ์์ ๋ ๋๋ง"์ผ๋ก ํ์ํ ๋งํผ๋ง ๊ตฌ์ฑ ์์๋ฅผ ๋ํํ๋ ์ฑ ์์ ์ฎ๊ธฐ๋ ๊ฒ ๊ฐ์ต๋๋ค. "๋ณตํฉ ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋งํ๋" ๊ตฌ์ฑ ์์๋ ํฉ์ฑ ๊ตฌ์ฑ ์์๋ฅผ ๋ํํ ์ง ์ฌ๋ถ์ ๋ํ ์ง์์ ๊ฑฐ์ ๊ฐ๊ณ ์์ง ์๊ฑฐ๋ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ ๋ฐ๋ฉด, ์์์ ๋ถ๋ชจ์ ๋ํ ์ง์์ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ๋ ํฝ๋๋ค.
๊ทธ๋ฌ๋ ์๋ง๋ ๊ทธ๊ฒ์ ๋จ์ํ ๊ฐ๋ฐ์ ์ฑ ์์ ๊ฒฝ์ฐ์ผ ๊ฒ์ ๋๋ค. ๋ ๋ค ์ข์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ ์ ์์ผ๋ฉฐ ๋ถ๊ฐํผํ ์ค์ฉ์ ์ง๋์ณ์ผ ํฉ๋๋ค.
@sebmarkbage ์๋ง ๋๊ธ๋ ๋ช ๊ฐ ์์ ๊ฒ๋๋ค :)
์ฐ๋ฆฌ๋ ์๋ง๋ ๊ทธ ๊ตฌ๋ฌธ์ ์์์ ์ผ๋ก ํ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ํผ๊ฐ ํ์ํฉ๋๋ค.
<>
<div className="col-md-8">
</div>
<div className="cold-md-4">
</div>
</>
๋๋
[
<div className="col-md-8">
</div>,
<div className="cold-md-4">
</div>
]
๊ทธ๋ฌ๋ ์ด๋ง์ ๋ ์๋ํ์ง ์์ต๋๋ค. ์ข ์ข ๊ทธ๊ฒ์ ์๋ง๋ ์ต์ ์ผ ๊ฒ์ ๋๋ค. ์์์ด ์ฌ๋ฌ ์์๋ก ํ์ฅ๋ ์ ์๋ ๊ฒฝ์ฐ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํผ๋์ค๋ฌ์ธ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ค์ ๋ก ์ง๊ธ ์ง์ํ์ง ์๋ ์ ์ผํ ์ด์ ๋ ๊ตฌํํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ๊ฑด๋, ์ฐ๋ฆฌ๋ ๋ฏธ๋์ ๊ทธ๊ฒ์ ์ง์ํ ์ ์์ง๋ง ์๋ง๋ ๋จ๊ธฐ๊ฐ์ ์๋ ๊ฒ์ ๋๋ค. ์ฃ์กํฉ๋๋ค. :/
์ด๊ฒ์ jquery ๋๋ ํน์ ์์๋ฅผ ๋์์ผ๋ก ํ๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ ๊ฒ์ ์ํฅ์ ๋ฏธ์น์ง ์์ ์ ์์ต๋๊น? ๋ฐ๋ผ์ $('#id-name').children()
์ ๊ฐ์ ์์
์ ์ํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<div id="id-name">
<div>
<div class="class-name">
</div>
</div>
</div>
์ด ๊ฒฝ์ฐ <div>
๋ฐ <div class="class-name">
๊ฐ ์ ํ๋ฉ๋๋ค. (์ ๊ฐ ์ ๋๋ก ์ดํดํ๋ค๋ฉด)
@AdamKyle ์ด ์ด์ ์ ๊ฒ์ํ ๊ฒ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก CSS ์ ํ์์๋ ์ํฅ์ ์ค๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
๋ด ๊ตฌ์ฑ ์์๊ฐ ์๋ํ์ง ์๋ ์ด์ ๋ฅผ ์ดํดํ๋ ๋ฐ ๋ช ๋ถ์ ๋ณด๋์ต๋๋ค. ์ด๋๊ฐ์ ๊ณต์ง๊ฐ ์์ด์ผ ํ ๊ฒ ๊ฐ์๋ฐ, ๋์น ๊ฑด ์๋๊น? ์๋ํ๋ ๊ฒ์ด ๋ถ๋ช ํ ์๋ชป๋ ๊ฒ์ผ ์ ์์ต๋๋ค.
var Optimistic = React.createClass({
render: function() {
return (
<h1>{this.props.name} loves React</h1>
<p>React doesnโt. Idea: sprinkle some divs here and there.</p>
);
}
});
React.render(
<Optimistic name="Peter" />,
document.getElementById('myContainer')
);
@gabssnake "์ธ์ ํ XJS ์์๋ ๋๋ฌ์ธ๋ ํ๊ทธ๋ก ๋ํ๋์ด์ผ ํฉ๋๋ค"๋ผ๋ ์ค๋ฅ์ ํจ๊ป JSX ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ด์ผ ํฉ๋๋ค. ์ค๋ฅ๋ฅผ ๋ณด์ง ๋ชปํ๊ฑฐ๋ ์ค๋ช ์์ ๋ช ํํ์ง ์์์ต๋๊น?
@spicyj ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค. ๊ธ์์, ๋๋ React ๋ฌธ์์ ์๋ ๊ณต์ง๋ฅผ ์๋ฏธํ์ต๋๋ค. ์, ์ฝ์์ ์ค๋ฅ๊ฐ ํ์๋์์ง๋ง ์ฒ์์๋ ๋ฉํ์ ํ์์ฑ์ด ์ดํด๋์ง ์์์ต๋๋ค. ๊ทธ๋์ ๊ฒ์ํด์ ์ฌ๊ธฐ๊น์ง ์์ต๋๋ค.
์ ๋ ์ด ๊ณ ํต์ ๊ฒช์์ต๋๋ค. ์ฌ์ค ์ ๋์์ด๋์๊ฒ ํนํ ๊ณ ํต์ค๋ฌ์ ์ต๋๋ค. ๊ตฌ์ฑ ์์๊ฐ ์์ ๋์ ๋ ธ๋(๋ฐ๋ผ์ ๋ ธ๋ ๋ชฉ๋ก ๋๋ ์กฐ๊ฐ)๋ฅผ ์ถ๋ ฅํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๊ทธ๋ฅ .. ๊ตฌ์ฑ ์์์์ ์ฌ๋ฌ ์์์ ๋ฐํํ๋ ๊ฒ์ ์นํธํ๋ ๊ฒ์ด ์๋๋๋ค. ํ์ง๋ง render
์์ ์ถ์ถํ render*
๋ฉ์๋์์ ๊ทธ๋ ๊ฒ ํ๊ณ ์ถ์ต๋๋ค.
render: function () {
return (
<div className={this.getClassName()}
style={{
color: this.props.color,
backgroundColor: this.props.backgroundColor
}}>
{condition ?
this.renderSomething() :
this.renderOtherThing()
}
</div>
);
},
renderSomething() {
return (
<>
<div className='AboutSection-header'>
<h1>{this.props.title}</h1>
{this.props.subtitle &&
<h4>{this.props.subtitle}</h4>
}
</div>,
{hasChildren &&
<div className='AboutSection-extra'>
{this.props.children}
</div>
}
</>
);
}
ํ์ง๋ง ๋๋ ์๋ง ๊ทธ๋ฅ ๋ฅ์น๊ณ key
๋ฅผ ์ฌ์ฉํด์ผ ํ ๊ฒ์
๋๋ค.
@gaearon ๋น์ ์ ์ด๋ฏธ ๊ทธ๊ฒ์ ํ ์ ์์ง๋ง, ๋น์ ์ ์ง๊ธ ๋ฐฐ์ด์ ๋ฐํํด์ผํฉ๋๋ค (๊ทธ๋๋ ์ฝ๊ฐ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค) ... buuuuut, ๋น์ ์ ๊ทธ๊ฒ์ ํด๊ฒฐํ ์ ์์ต๋๋ค, ๋๋ ๋ด ์์ ์ <Frag>
๊ตฌ์ฑ ์์๋ฅผ ํดํนํ์ต๋๋ค ์ด๊ฒ์ ๋ฐฐ์ด๋ก ๋ณํ๋ฉ๋๋ค(overloaded React.render
) ... ํดํน์ ํผํ๊ณ ์ถ๋ค๋ฉด return <NoopComp>...</NoopComp>.props.children
ํ ์๋ ์์ต๋๋ค.
ํธ์ง: ๋ด ๋์, ๋๋ React.render
React.createElement
๋ฅผ ์ค๋ฒ๋ก๋ํ์ต๋๋ค.
๋ฐฐ์ด์ ๋ฌธ์ ๋ ๋์์ด๋๋ฅผ ๋์ด์ง๊ฒ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ผํ, ๋ช ์์ ํค๊ฐ ํ์ํฉ๋๋ค.
@gaearon ์, ์ง๊ธ์ ๋ ๊ฐ์ง ํด๊ฒฐ ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ผํ๋ฅผ ํผํ ์ ์์ต๋๋ค.
๋ฐฐ์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฐ ์์์ key
๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ ์ด๋ ต๋ค๋ ๊ฒ ์๋๋ผ, ๋ณํ์ง ์๋๋ค๋ ๊ฑธ ์๊ธฐ์ ์ด์ํ๊ฒ ๋๊ปด์ ธ์.
@gaearon ์ ์, ์ง๊ธ์ ๊ทธ ๊ฒฝ๊ณ ๋ฅผ ์ ์ ์ ์ผ๋ก ๋ฌด์ํ๊ธฐ๋ก ์ ํํ์ต๋๋ค. :), ์ ๋ง๋ก ๊ทธ๊ฒ์ ํผํ๊ณ ์ถ๋ค๋ฉด <MyComp children={this.renderWhatever()} />
๋ฅผ ์ฌ์ฉํ์ฌ ํผํ ์ ์์ต๋๋ค( ํธ์ง: ๋ถ๋ช
ํ ๊ทธ๊ฒ์ ์ฌ์ฉํ ์๋ ์์ง๋ง ์ธ์ ํ ์๋
๊ฐ ์๋ ๊ฒฝ์ฐ ํํํ๊ฒ ํ๋ ๋์ฐ๋ฏธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ง๋ง ์).
UI ํคํธ์ ๊ด๋ จ๋ ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ์ ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ๊ณ ์ ์คํฌ๋กค ๊ฐ๋ฅ ์ปจํ ์ด๋ ์์ ์์์ ๋ฐฐ์นํ ๋:
return (
<div style={{
position: fixed
top: 0;
left: 0;
right: 0;
bottom: 0;
overflow-y: scroll;
}}>
{this.props.children}
</div>
);
์ด์ ์์์ ๋ฐฐ์ด๋ก ์ ๋ฌ๋์ด์ผ ํ์ง๋ง ๋ณตํฉ ํด๋์ค๊ฐ ์ ๋ฌ๋๋ ๊ฒฝ์ฐ ํด๋์ค๊ฐ ์์๋์ง ์๋๋ก ํด๋น ์คํ์ผ๋ ๊ตฌํํด์ผ ํฉ๋๋ค. ๋ณต์ก์ฑ์ ๋ ์ด์ด๋ฅผ ์ถ๊ฐํ ๋ฟ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ณ๊ฒฝ์ ์ํํ๋ ๊ฒ์ด ์ผ๋ง๋ ๋ณต์กํ์ง ์ถฉ๋ถํ ์ดํดํ ์ ์์ต๋๋ค. ์ง์์ ์ํด ๋ชจ์๋ฅผ ๋์ง ๋ฟ์ ๋๋ค.
์ฌ๊ธฐ #3415์์ ์์ธํ ์ค๋ช ํ ๋ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ง๊ธ์ ํด๊ฒฐํ ์ ์์ผ๋ฉฐ ๊ตฌํํ๊ธฐ ์ด๋ ต๊ณ ๋๋ฌผ๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค.
๋๋ (์์ง) ๋ด๋ถ ๋ฐ์์ ๋ํด ์๋ฌด ๊ฒ๋ ๋ชจ๋ฅด์ง๋ง DOM์์ ์ด๋ฌํ ๊ฐ์ ๋ถ๋ชจ ์์/์กฐ๊ฐ์ ํ์ํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ๊ฒ ์ต๋๋ค. ์
<A>
<B></B>
<Fragment>
<C></C>
<D></D>
</Fragment>
<E></E>
</A>
๋ ๋๋ง ํ ๊ฒ์ ๋๋ค
<a>
<b></b>
<!--<fragment data-reactid="">-->
<c></c>
<d></d>
<!--</fragment>-->
<e></e>
</a>
์ด๊ฒ์ c์ d๊ฐ sth์ ์์์ผ๋ก ์ทจ๊ธ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. (b ๋ฐ e์ ์ถฉ๋ํ์ง ์๋ ์ค์ฒฉ ๋ฐ์ ID ํฌํจ). ๋๋ ์ด๋ฌํ ์ข ๋ฅ์ ์๋ฏธ๋ก ์ ์์ ์ ๋ํด ๋ค๋ฅธ ํ๋ ์์ํฌ๊ฐ "์ค์ฉ" ์ค๋ช ์ ํ๋ ๊ฒ์ ๋ณด์์ต๋๋ค.
@Prinzhorn DOM ์ถ๋ ฅ์ React์ JSX์ ํผ๋ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ์ฉํ ๊ฒฝ์ฐ: "์กฐ๊ฐ ๊ตฌ์ฑ ์์"๋ฅผ DOM์ ๋งคํํ๊ธฐ ์ํด HTML ์ฃผ์์ ์ฌ์ฉ ํ๋ผ๋ @Prinzhorn ์ ์ ์์ Knockout์ด ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ๋ น์์์ ์ด๋ฌํ "๊ฐ์ ์์"๋ฅผ ํธ์ถํฉ๋๋ค.
<!-- ko component: "message-editor" -->
<!-- /ko -->
( ๋ น์์ ๋ฌธ์ ์์)
๋ํ ์ด์ ๋ํ ๋ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก - flexbox๋ฅผ ์ฌ์ฉํ ๋ ์ถ๊ฐ ๋ํ ์์๊ฐ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค.
@aldendaniels ๋ ์ ๋์ ์ผ๋ก ๋์ํฉ๋๋ค. ์ ๋ ์ด๋ฏธ flexbox ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค.
์ข ์ ๋๋กญ๋ค์ด์ด ์๋ flexbox๋ก ์ด ๋ฌธ์ ์ ๋ถ๋ช์ณค์ต๋๋ค. ์ฌ๊ธฐ์ A๋ ์ฒซ ๋ฒ์งธ ๋๋กญ๋ค์ด์ ๋ ๋๋งํ๊ณ ๊ด๋ฆฌํ๊ณ A์ ๋๋กญ๋ค์ด ๊ฐ์ ๋ฐ๋ผ B ๋๋ C ๋๋ D๊ฐ ๋ค๋ฐ๋ฆ ๋๋ค. ๊ฐ ๋๋กญ๋ค์ด์ ์ ์ ํ ์์ ๋๋กญ๋ค์ด์ ๋ ๋๋งํฉ๋๋ค.
<A>
<Drop />
<C><Drop /><Drop /></C>
</A>
A, B, C, D๋ stateless ์ด๋ฏ๋ก class B {render(){ this.props }}
์์ function B(props){ return [...]; }
๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
์ด ๊ฒฝ์ฐ ์ฌ๋ฌ ์์์ด ๋ ๋๋ง๋๋ ๊ฒ์ ๋ถ๋ชจ์๊ฒ๋ณ๋ก ์ค์ํ์ง ์์ผ๋ฉฐ ๋ด CSS๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ์ฌ์ฌ์ฉํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ค๋ฅด๊ฒ ์ํํ ์์ ์ด ์์ต๋๋ค(๋ค๋ฅธ ๊ตฌ์ฑ ์์์๋ B, C ๋ฐ D๊ฐ ํ์ํจ).
๋์์ผ๋ก ๋ถ๋ชจ๋ก๋ถํฐ ๊ทธ๊ฒ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น์? ์ด๋ป๊ฒ ๋ณด์ผ์ง์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์์ด๋์ด๊ฐ ์์ต๋๋ค.
์ ๋ ์ค๋ ์ด ๊ธฐ๋ฅ์ ์ข์ ์ฌ์ฉ ์ฌ๋ก๋ผ๊ณ ์๊ฐํ๋ ์๋๋ฆฌ์ค๋ฅผ ๋ณด์์ต๋๋ค. ์ฌ๋ฌ <script>
์์๋ฅผ ๋ ๋๋งํ๋ ๊ตฌ์ฑ ์์๋ก, ํ์ด์ง์ <head>
์์๋ก ๋ ๋๋ง๋ ์ ์์ต๋๋ค. ๊ฑฐ๊ธฐ์ ์๋ ๋ชจ๋ ๋ํผ ์์๋ ๋์ ๊ฒ์
๋๋ค.
๋ด ์๋๋ฆฌ์ค๋ ํ์ด์ง์ ํ์ํ ๋ฐํ์ ์ฝ๋์ ๋ํ <script>
ํ๊ทธ์ ์ฌ์ฉํ ํ์งํ ๋ฌธ์์ด์ ์ ๋ฌํ๋ ๋ ๋ค๋ฅธ <script>
$ ํ๊ทธ ๋ชจ๋์ ๋ํ ๋ ๋๋ง์ ๋ด๋นํ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ํฉ๋๋ค. ๋ฐํ์ ์ฝ๋. ์๋ฅผ ๋ค์ด:
<html>
<head>
<script language="runtime.resources.en-us.js"></script>
<script language="runtime.js"></script>
</head>
<body>
...
</body>
</html>
์ด ๊ฒฝ์ฐ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๊ณ ์ถ์ต๋๋ค.
var RuntimeScripts = require('./Runtime')
...
return (
<html>
<head>
<RuntimeScripts language="en-us" />
</head>
</html>
)
...
๋๋ ๋ํ ๋ช ๊ฐ์ง flexbox ๋ฌธ์ ์ ๋ถ๋ช์ณค์ต๋๋ค. CSS์์ ํด๊ฒฐํ ์ ์๋ ๊ฒ์ ์์ง๋ง flexbox์ "์๋ฆ๋ค์" ์ค ํ๋๋ ๋ ์ด์์์ด ์๋ํ๋๋ก ํ๊ธฐ ์ํด ๋ชจ๋ ๊ณณ์์ "๋ํผ" ์์๊ฐ ๋ ํ์ํ์ง๋ง React๋ฅผ ์ฌ์ฉํ ๋ ์ฌ์ ํ ๋ชจ๋ ๊ณณ์์ ๋ํผ ์์๋ก ๋๋ฉ๋๋ค. ์ปจํ ์ด๋๋ฅผ ๊ฐ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด์ง ์๋ ํ ํญ์ div/div ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ผ๋ก ๋ฐํํ๋ ๋ชจ๋ ๊ฒ์ ๋ํํฉ๋๋ค.
์ฌ๊ธฐ์ ์ ์๋ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด <BunchOfComponents />
๋ฅผ {getBunchOfComponents()}
๋ก ๋ฐ๊ฟ ์ ์์ผ๋ฉฐ ์๊ฐ์ ์ถ๋ ฅ์ ๊ตฌ์ฑ ์์์ ๊ด๋ จ๋ ์ค์ฉ์ ์ด๊ณ ๊ธฐ์ ์ ์ธ ๋ฌธ์ ๋ฅผ ๋์
ํ์ง ์๊ณ ๋์ผํ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ๋ฃจํธ๋ก ์กฐ๊ฐ.
@syranide ํ์ง๋ง ๊ตฌ์ฑ ์์ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ชจ๋ ํ์ ๋ ๋ค์ ๊ณ์ฐํด์ผ ํฉ๋๋ค...
๋ํ ์ผ๋ฐ coffeescript๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฐฐ์ด์ ๋ฐํํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ jsx ํํ์์ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ์ญ์์ค.
๋ฐํ๋ ์์ ๋ฐฐ์ด์ ์ฒ๋ฆฌํ๊ธฐ ์ฌ์ด ๊ฒฝ์ฐ jsx๊ฐ ๋ฐ๋ผ์ก์ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ๋ง์ญ์์ค.
@syranide ํ์ง๋ง ๊ตฌ์ฑ ์์ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ชจ๋ ํ์ ๋ ๋ค์ ๊ณ์ฐํด์ผ ํฉ๋๋ค...
@wmertens ์, ํ์ง๋ง ๋ถ๋ชจ๊ฐ ๋ค๋ฅธ ์ด์ ๋ก ๋ค์ ๋ ๋๋งํด์ผ ํ๊ฑฐ๋ ๋จ์ํ props๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๋ฒ ์ด์จ๋ ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์, ๊ทธ๊ฒ์ ์ฐจ์ด์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ด ์ ๊ทผ ๋ฐฉ์์ด ์ณ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฒ์ ์๋๋ฉฐ ์ต์ ํ์ด๋ฉฐ ์ด๋ฅผ ๋ฌ์ฑํ๋ ๋ง์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋ํ ์ผ๋ฐ coffeescript๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฐฐ์ด์ ๋ฐํํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ jsx ํํ์์ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ์ญ์์ค.
๊ทธ๊ฒ์ ๊ด๋ จ์ด ์์ผ๋ฉฐ ์ด๊ฒ์ JSX์ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ํฐ ๋ฌธ์ ๋ ํ๋์ ๊ตฌ์ฑ ์์ = ํ๋์ ์์/๋ ธ๋ ๋ผ๋ ๊ธฐ์ ์ ์ด๊ณ ์ค์ฉ์ ์ด๋ฉฐ ์ง๊ด์ ์ธ ๊ฐ์ ์ ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๊ฐ๋ฐ์๋ฅผ ๋๋ณํ ์๋ ์์ง๋ง ๊ธฐ๊บผ์ด ํฌ๊ธฐํ์ง๋ ์์ ๊ฒ์ ๋๋ค. ์ด๋ ๋งค์ฐ ์ ์ฉํ ๊ฐ์ ์ ๋๋ค. ์ต์ ํ๊ฐ ์ฌ๋๋ค์ด ์ด๊ฒ์ ์ํ๋ ์ ์ผํ ์ด์ ๋ผ๋ฉด ์ค๊ณํ ์ ์๋ ๋๋ฑํ๊ฒ ์ข๊ฑฐ๋ ๋ ๋์ ์ต์ ํ๊ฐ ์๋ค๊ณ ํ์ ํฉ๋๋ค.
@syranide ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ํญ์ ๋ํ์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
ํ
์ด๋ธ, ๋ชฉ๋ก, ํ๋ ์ค๋ฐ์ค, ํค๋์ ๊ฐ์ html์ ์์...
๊ทธ๊ฒ์ ์ถ์
ํ ์ฝ๋๋ก ์ด์ด์ง๋๋ค.
๋ ๋๋ง๋ง ํ๋ ๊ฐ์ ๋ํผ ์์๋ก ์๋ฒฝํ๊ฒ ๋ง์กฑํ ๊ฒ์
๋๋ค.
์ด์ ์ ์ ์๋ ๋๋ก ์๊ฒฌ.
2015๋
5์ 29์ผ ๊ธ์์ผ ์คํ 3์ 56๋ถ Andreas Svensson [email protected]
์ผ๋ค:
@syranide https://github.com/syranide ํ์ง๋ง ๋งค๋ฒ
๊ตฌ์ฑ ์์๋ ๋ชจ๋ ํ์ ๋ฅผ ๋ณ๊ฒฝํ์ฌ ๋ค์ ๊ณ์ฐํด์ผ ํฉ๋๋ค...@wmertens https://github.com/wmertens ์, ํ์ง๋ง ์ฌ๋ฌ ๋ฒ
๋ถ๋ชจ๊ฐ ๋ค๋ฅธ ์ฌ๋์ ์ํด ๋ค์ ๋ ๋๋งํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด์จ๋ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ด์ ๋๋ ๋จ์ํ props๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ง๋ง
์, ์ฐจ์ด๊ฐ ์์ง๋ง ์ด ์ ๊ทผ ๋ฐฉ์์ด ์ณ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
๊ทธ๊ฒ์ ์ต์ ํ์ด๋ฉฐ ์ด๋ฅผ ๋ฌ์ฑํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค.๋ํ ์ผ๋ฐ ์ปคํผ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐฐ์ด์ ์ฝ๊ฒ ๋ฐํํ ์ ์์ผ๋ฏ๋ก
jsx ํํ์์ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํฉ๋๋ค.๊ทธ๊ฒ์ ๊ด๋ จ์ด ์์ผ๋ฉฐ ์ด๊ฒ์ JSX์ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ํฐ ๋ฌธ์ ๋
๋น์ ์ _one์ ๊ธฐ์ ์ ์ด๊ณ ์ค์ฉ์ ์ด๋ฉฐ ์ง๊ด์ ์ธ ๊ฐ์ ์ ์์ต๋๋ค.
๊ตฌ์ฑ ์์ = ํ๋์ ์์/๋ ธ๋_. ๋๋ ๊ฐ๋ฐ์๋ฅผ ์ํด ๋งํ ์ ์์ง๋ง ๋๋ํ์ง ์์ ๊ฒ์ ๋๋ค
๊ทธ๊ฒ์ ๊ธฐ๊บผ์ด ํฌ๊ธฐํ๋ ๊ฒ์ ๋งค์ฐ ์ ์ฉํ ๊ฐ์ ์ ๋๋ค. ํ์คํด
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ์ค๊ณํ ์ ์๋ ๋๋ฑํ๊ฒ ์ฐ์ํ๊ฑฐ๋ ๋ ๋์ ์ต์ ํ๊ฐ ์์ต๋๋ค.
์ต์ ํ๋ ์ฌ๋๋ค์ด ์ด๊ฒ์ ์ํ๋ ์ ์ผํ ์ด์ ์ ๋๋ค.โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/facebook/react/issues/2127#issuecomment -106810565.
fwiw, React์์ ์์์ ๋ฐฐ์ด๋ก ์ทจ๊ธ๋๋ "fragment" ์ปดํฌ๋ํธ๋ฅผ React๋ก ํดํนํ๋ ๊ฒ์ ๋น๊ต์ ์ฝ์ต๋๋ค . ํค๋ฅผ ์๋ ์์ฑํ์ง๋ง ๊ตฌ์ฑ ์์์ ์ด๊ธฐ ์ ํจ์ฑ ๊ฒ์ฌ ํ์ ๋ฐ์ํ๋ฏ๋ก ์ผ๋ฐ์ ์ธ "ํค๊ฐ ์ ๊ณต๋์ง ์์" ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
์ฆ, ๊ทธ ํดํน์ @gaearon ์ด ์์์ ๋งํ ๊ฒ๋ง ํด๊ฒฐํฉ๋๋ค. JSX์์ ๋ชป์๊ธด ๋ฐฐ์ด ๊ตฌ๋ฌธ์ ์ฒ๋ฆฌํ๊ฑฐ๋ ์์์ ํค๋ฅผ ์ค์ ํ ํ์๊ฐ ์์ผ๋ฉฐ ๊ตฌ์ฑ ์์์ ๋ ๋๋ง ๋ฉ์๋ ๋ฃจํธ์์ ์ฌ๋ฌ ๋ ธ๋๋ฅผ ๋ฐํํ๋ ๋ฌธ์ ๋ ์๋๋๋ค.
๊ตฌ์ฑ ์์๊ฐ ํ๋์ "์์/๋ ธ๋"๋ฅผ ๋ฐํํด์ผ ํ๋ค๋ ์์ด๋์ด์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋์๊ฒ๋ ๋ค์๊ณผ ๊ฐ์ JSX ๊ตฌ์กฐ์ ๋ํด ์๋ฒฝํ๊ฒ ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ ๋๋ค.
<Main>
<Foo />
<Fragment>
<Bar />
<Baz />
</Fragment>
</Main>
DOM์ผ๋ก ๋๋ด๋ ค๋ฉด:
<div>
<div>Foo</div>
<div>Bar</div>
<div>Baz</div>
</div>
๊ตฌ์ฑ ์์๊ฐ ์ด๋ฏธ ์๋ช ์ฃผ๊ธฐ ํํฌ๋ฅผ ์ฌ์ฉํ์ฌ DOM์์ ๋ชจ๋ ์ข ๋ฅ์ "๋๋ผ์ด ์ผ"์ ์ํํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ต์ํ์ ๋๋ผ์์ ์์น ์๋ฐ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค(์ผ๋ฐ์ ์ธ ์ํ ํจํด ์ฐธ์กฐ). ์ผ๋ฐ์ ์ผ๋ก ๊ตฌ์ฑ ์์๊ฐ ๋จ์ผ ์์๋ฅผ ์์ฑํ์ง ์์๋ ๋๋ค๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ธ์ ๋๋ฉฐ DOM๊ณผ ํจ๊ป ์๋ํ๋ ค๋ฉด ๋ช ๊ฐ์ง ํํ์ด ์ด๋ฃจ์ด์ ธ์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ด์ฐฎ์ต๋๋ค.
์ด๊ฒ์ "์ต์ ํ"์ ๊ดํ ๊ฒ์ด๊ฑฐ๋ ๋ฐฐ์ด ๊ตฌ๋ฌธ์ ์ข์ํ์ง ์๋ ๊ฒ์ ๊ดํ ๊ฒ์ด ์๋๋๋ค. ๋ง์ ์ฌ์ฉ์๊ฐ ์ธ๊ธํ๋ฏ์ด _wrapper ์์๋ ์คํ์ผ๊ณผ ๋ ์ด์์์ ์ฌ๊ฐํ ๋ฐฉ์์ผ๋ก ๊นจ๋จ๋ฆฝ๋๋ค_. ํ ์ด๋ธ์ด ๊ฐ์ฅ ๋ถ๋ช ํ์ง๋ง Flexbox๋ ์ฃผ์ ๋ฌธ์ ์ ๋๋ค. ๋๋ ์ด๋ฏธ React ๋๋ฌธ์ ์กด์ฌํ๋ ๋ํผ ์์์ ํ๋ ์ค ๊ท์น์ ๋ค์ ์ ์ฉํ๋ CSS๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ, ๊ฝค ๋ณด๊ธฐ ํํฉ๋๋ค.
์ฌ๊ธฐ์ ์ ์๋ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ๋ค์์ ๋์ฒดํ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค.
{getBunchOfComponents()}๋ฅผ ์ฌ์ฉํ๋ฉด ์กฐ๊ฐ์ด ์๋ ๊ตฌ์ฑ ์์๋ฅผ ๋ฃจํธ๋ก ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ์ค์ฉ์ ์ด๊ณ ๊ธฐ์ ์ ์ธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๊ณ ์๊ฐ์ ์ถ๋ ฅ์ด ๋์ผํฉ๋๋ค.
์ด๋ฅผ ์ํด์๋ ๊ฐ๋ฐ์๊ฐ ๊ฒฉ๋ฆฌ๋๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋๋ ๋ฐ ํํํด์ผ ํฉ๋๋ค. React์ ๊ธฐ๋ณธ ๊ตฌํ ๋ฌธ์ ๋ก ์ธํด ๊ตฌ์ฑ ์์๋ฅผ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ ํ๋์ด ๋์์ค๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ฐ์๋ค์ฌ์ ธ์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์๋๋ค.
@thomasboyt
ํธ์ง : ๋ด ์ค์๋ ์์ ํ
์ด๋ธ ํ ๋ก ๊ณผ ๊ทํ์ ์ฃผ์ฅ ์ค ์ผ๋ถ๋ฅผ ํตํฉํ์ผ๋ฉฐ ๊ทํ๊ฐ ์๊ฐํ๋ ๋ฐ์ ๋์ฒด๋ก ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ถํฌ๋ช
ํ ๊ตฌ์ฑ ์์์๋ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ์ ์ฉํ ํฌ๋ช
๋ํผ๋ก ์๋๋ ๊ฒ์ด ๋ถ๋ชจ์๊ฒ ๋ถํฌ๋ช
ํ๊ฒ ๋ฉ๋๋ค. <Wrapper1><Wrapper2>...</Wrapper2></Wrapper1>
, Wrapper1
๊ฐ Wrapper2
์ ์์์ ๋ณผ ์ ์๋ค๊ณ ์์ํด๋ณด์ญ์์ค. ๋ฐ๋ผ์ wrapMyElements(...)
๋ ์ฌ์ ํ ๋ชจ๋ ๋ฉด์์ ๋ ๋์ ์๋ฃจ์
์
๋๋ค(๋ค๋ฅธ ํ์ํ ์ง์ ๊ธฐ๋ฅ ํฌํจ).
๊ตฌ์ฑ ์์๊ฐ ํ๋์ "์์/๋ ธ๋"๋ฅผ ๋ฐํํด์ผ ํ๋ค๋ ์์ด๋์ด์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋์๊ฒ๋ ๋ค์๊ณผ ๊ฐ์ JSX ๊ตฌ์กฐ์ ๋ํด ์๋ฒฝํ๊ฒ ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ ๋๋ค.
๊ตฌ์ฑ ์์๋ ๋จ์ํ ๋ํผ ์ด์์ด๋ฉฐ ๋ชฉ์ ์ด ์์ต๋๋ค. IMHO ์ฌ๋ฌ ์์๋ฅผ ๋ฐํํ๋ฉด ๋งค์ฐ ์ ์ฉํ ๊ธฐ๋๊ฐ ์ฐจ๋จ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด, React.render
๋ ๋ฏธ๋์ ์์๋ฅผ ๋ ๋๋งํ๊ณ ๋
ธ๋๋ฅผ ๋ฐํํ๋ ์ปดํจ๋์ธ์ ์ป๊ฒ ๋๋ฉฐ, ์ด์ ๋์ ๋
ธ๋ ๋ฐฐ์ด์ ์์ฑํด์ผ ํฉ๋๋ค.
ํ์ง๋ง IMHO๊ฐ React์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ธ ๊ฐ๋ ์ฑ์ด ๋งค์ฐ ์ค์ํ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ด ๋ช ์์ ์ ๋๋ค.
<table>
<tr>
<td />
<td />
<td />
</tr>
<tr>
<Columns1 />
<Columns2 />
</tr>
</table>
๋ง๋ ์ ๋๋ ๊ฑธ ๋ณด๋ 3์ฐจ ์ ์ง๋ ์ด๋์์ ์ค๋ ๊ฑธ๊น์? ์๋ง๋ ๊ทธ๊ฒ์ ์ค์ ๋ก ์๋ชป๋์๊ณ 2๊ฐ ๋๋ 4๊ฐ์ ์
์ ๋ ๋๋งํ๊ณ ์์ ๊ฒ์
๋๋ค. ๋๊ฐ ์๊ฒ ์ต๋๊น? ์ค์ ๋ก ๋์ ์ด๋ฉฐ ์ํ ๋๋ ์ธ๋ถ ์ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ๋ช
์์ ์ธ ๊ธฐ๋์น๋ฅผ ๊ฐ์ง ์ ์๋ ๋ค๋ฅธ ๋น HTMLDOM ํ๋ฐํธ์๋๋ฅผ ๊ณ ๋ คํ ๋๋ง ๋ ์ด๋ ค์์ง๋ ์ด ๋ฌธ์ ์ ๋ง์ ๋ณํ์ด ์์ต๋๋ค. ๊ณ ๋ คํด์ผ ํ ๋ ๋ค๋ฅธ ์ฌํญ์ ์์๊ฐ ๋ถํฌ๋ช
ํ๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ <tr />
๋ฅผ <MyMagicalTr />
๋ก ๋ฐ๊พธ๋ฉด ๊ฐ๋ณ ์
๊ณผ ์ํธ ์์ฉํ ์ ์๊ฑฐ๋ ์
์๋ฅผ ์ถ๋ก ํ ์ ์์ผ๋ฏ๋ก <MyMagicalTr />
๋ <MyMagicalTd />
๋ง ์๋ฝํ ์ ์์ผ๋ฉฐ ์ค์ ๋ก ์ํธ ์์ฉํ ์ ์๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค.
์ด๋ฅผ ์ํด์๋ ๊ฐ๋ฐ์๊ฐ ๊ฒฉ๋ฆฌ๋๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋๋ ๋ฐ ํํํด์ผ ํฉ๋๋ค. React์ ๊ธฐ๋ณธ ๊ตฌํ ๋ฌธ์ ๋ก ์ธํด ๊ตฌ์ฑ ์์๋ฅผ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ ํ๋์ด ๋์์ค๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ฐ์๋ค์ฌ์ ธ์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์๋๋ค.
"์ด๊ฒ์ ๊ฐ๋ฐ์๊ฐ ๊ฒฉ๋ฆฌ๋ฅผ ๋ง๋๋ ๋ฐ ํํํด์ผ ํฉ๋๋ค..." ๊ทธ๋ฌ๋ ๊ตฌ์ฑ ์์๊ฐ ์ฌ๋ฌ ์์๋ฅผ ๋ฐํํ ์ ์์ผ๋ฉด ๋ ์ด์ ๊ฒฉ๋ฆฌ๋์ง ์๊ณ ๋์ฒด๋๋ฉฐ ๊ตฌ์ฑ ์์๊ฐ ์์ ์์๋ก ๋์ถ๋๊ณ ์๋ ๊ฒ์ ๋๋ค.
๋ง์น, ๋ชป. ๊ทผ๋ณธ์ ์ธ ๊ตฌํ ๋ฌธ์ ๋ ์ด๊ฒ์ด ์ค์ ๋ก ์ํ๋์ด์ผ ํ๋์ง ์ฌ๋ถ์ ๋ณ๊ฐ์ ๋ฌธ์ ์ ๋๋ค. ๋ด ๊ฒฐ์ ์ ์๋์ง๋ง, ๊ทธ์ ์๋ฐ๋๋ ์ ์ถฉ์์ด๋ ๋ค๋ฅธ ๋์ ์๋ฃจ์ ์ ๊ณ ๋ คํ์ง ์๊ณ ๋๋ฌธ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์ผ๋ง๋ ์ค๋๋ ฅ ์๋ ์ฃผ์ฅ์ธ์ง ์ ์ ์์ต๋๋ค.
IMHO ๋๋ {getBunchOfComponents()}
์ ๋ฌธ์ ๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค. ๋ช
์์ ์ด๋ฉฐ ์ ์ฉํ ๊ธฐ๋์น๋ฅผ ์ ์งํ ์ ์์ต๋๋ค. ์ฑ๋ฅ์ด ๋ฌธ์ ์ธ ๊ฒฝ์ฐ React.createSmartFragment()
(๋๋ w/e)๋ฅผ ์ฌ์ฉํ์ฌ ํฌ๋ช
์ด๋ ์ด/๊ฐ์ฒด์ ์ ์ฌํ ์ ํ์ด์ง๋ง ์์ ํญ๋ชฉ๊ณผ ๋
๋ฆฝ์ ์ผ๋ก ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค.
๋ค์ ๋งํ์ง๋ง, React ๊ฐ๋ฐ์๊ฐ ๊ถ์์์ ๋๋ค(์ ๊ฐ ์๋๋๋ค). ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์์ ๋ค์ํ ๋ถ์์ฉ์ ๊ณ ๋ คํ ๋ ์ค๋๋ ฅ ์๋ ์ฃผ์ฅ์ ๋ณผ ์ ์์ต๋๋ค. ๋๋ ์ ์๋ ์๋ฃจ์ ์ด ์ง์๋๋๋ผ๋ ์ข์ ํจํด์ด๋ผ๋ ๋ฐ ๋์ํ๋์ง ํ์ ํ ์ ์์ต๋๋ค.
ํธ์ง: ๋ช ํํ ํ์๋ฉด, ๋ค๋ฅธ ๋ถ๋ช ํ ์ ์ตํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋ง๋ ๊ตฌ์ฑ ์์๊ฐ ๋ฏธ๋์ ์ฌ๋ฌ ์์๋ฅผ ๋ฐํํ ์ ์์ ๊ฒ์ ๋๋ค. ํนํ @thomasboyt๋ฅผ ํ์ํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์์์ ํต๊ณผํ๋ ๋งฅ๋ฝ์์ ๊ฐ๋ ์ฑ์ด ์ ์ง๋ฉ๋๋ค.
์ด ๋ํ์ ์ฒ ํ์ ์ธก๋ฉด์ ์๋ตํ๊ธฐ ์ ์ ์ปคํผ๊ฐ ์กฐ๊ธ ๋ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ๋ฒ์์ ์คํ ๊ฐ๋ฅํ ๋ณ๊ฒฝ์ ์ด ์คํ์ดํฌ๋ก ์ด์ด์ง๋๋ค. https://github.com/facebook/react/compare/master...thomasboyt :fragment
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์ฝ๊ฐ์ ๋ฐ๋ชจ๋ฅผ ๋์ก์ต๋๋ค: http://www.thomasboyt.com/react-fragment-demo/
์ฌ๋ฌผ์ ๊ตฌํ ์ธก๋ฉด์ ๋ํ ๋ช ๊ฐ์ง ๊ด์ฐฐ:
ReactMultiChild
์์ฑ๋ ๋ณํ ๋ช
๋ น์ด ๋์ผํ๊ฒ ์ ์ง๋๊ณ ๋ค๋ฅธ ๋
ธ๋์ฒ๋ผ ์กฐ๊ฐ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ ค๊ณ ์๊ฐํ์ต๋๋ค. ๋
ธ๋ ์/์ด๋ค ๋
ธ๋๊ฐ ์กฐ๊ฐ์ธ์ง์ ๋ํ ์ํ๋ฅผ DOM ์ํ ์ถ์ ์ ์ถ๊ฐํ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๊ฐ๋์ง ์์์ต๋๋ค. @Prinzhorn ์ด ์ธ๊ธํ ์ฃผ์ ํ์ฑ๊ณผ ๊ฐ์ ๊ฒ์ด ์๋ํ ์ ์์ง๋ง ์๋ ๋น์ฉ์ ๊ณ ๋ คํ๋ฉด DOM ์กฐํ๊ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ ์ฃผ์ํฉ๋๋ค.ReactMultiChild
๊ตฌ์ฑ ์์์ ๋ชจ๋ ์์์ _nodeCount
ํ๋๋ฅผ ์ถ๊ฐํ์ฌ ์กฐ๊ฐ์ ์ค์ ๋ก ํฌํจ๋ ๋ฃจํธ ๋
ธ๋ ์๋ฅผ ์ถ์ ํ ์ ์์ต๋๋ค.๋ฌธ์ ๋ ์ด๊ฒ์ด ์ด๊ธฐ ๋ ๋์์ ๋จํธ์ ์์์ ๊ณ์ฐํ์ฌ ์ํํ ์ ์์ ๋งํผ ์ฝ์ง๋ง ํ์ ๋์ฐ๋ณ์ด์์ ๋จํธ์ ๋ ธ๋ ์๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด ๋ ๊น๋ค๋ก์ ๋ณด์ธ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ฌ์ ํ โโ๋ด ์ง์ ์์ ์ํ๋์ง ์์ต๋๋ค(https://github.com/thomasboyt/react/issues/2 ์ฐธ์กฐ).
ReactMultiChild
์ updateComponent ์ฃผ๊ธฐ๋ ์ด ID๋ฅผ ์ ๋ฌํ๋ ์ญํ ์ ํ๋ฏ๋ก DOM ๋
ธ๋๊ฐ ์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ถ๋ชจ๋ฅผ ์กฐํํ๋๋ก ๋ณ๊ฒฝํ ์ ์์ง๋ง ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค. ๋๋ "์ค์ ๋
ธ๋" ํค์ ๋ํ ์กฐ๊ฐ ํค์ ๋ด๋ถ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.๋๋ ์ฌ์ ํ ๋ฃจํธ ๋ ธ๋์ ์๋ฅผ ์ ์งํ๊ธฐ ์ํด ์กฐ๊ฐ์ ์๊ตฌํ๋ ๊ฒ์ด ์ด๊ฒ์ ์ํํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ์ ํ์ง ๋ชปํฉ๋๋ค(์ต์ํ ๋ฐ๋ชจ์ ์ฐธ์ฌํ๊ฒ ๋์์ง๋ง). ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๋ชจ๋ ์์ฃผ ๋น ๋ฅด๊ณ ์์ฃผ ๋ฆ์ ๋ฐค์ ํจ๊ป ํดํน๋์์ต๋๋ค. , ๋ฐ๋ผ์ ๋ค๋ฅธ ์ฌ๋์ด ๊ตฌํ์ ๋ํ ์ ์ ์ฌํญ์ด ์์ผ๋ฉด ์ธ์ ๋ ์ง ์๋ ค์ฃผ์ธ์.>
@thomasboyt IIRC ์ฃผ์ ๊ตฌํ ์ฅ์ ๋ฌผ์ mountIndex
๋ก ์์ ๋
ธ๋๋ฅผ ์ฐธ์กฐํ๋ React์์ ๋ฐ์ํฉ๋๋ค. ํ๋์ "๋
ธ๋"๊ฐ ๊ฐ์๊ธฐ ์์์ ์์ ๋
ธ๋๊ฐ ๋ ์ ์๊ณ ์ด๋ ๋ถ๋ชจ๋ฅผ ํธ์ถํ์ง ์๊ณ ๋ฐ์ํ ์ ์์ผ๋ฉฐ ๋ฐ์ํ ์๋ ์๋ ๊ฒฝ์ฐ์๋ ์๋ํ์ง ์์ต๋๋ค. ์ฌ๋ฌ ๊ตฌ์ฑ ์์ ๊น์ด(๋ํ). ๋ด๊ฐ ์ค์ํ ๊ฒ์ด ์๋๋ผ๋ฉด ์ซ์๊ฐ ์ ๋ ๋ณ๊ฒฝ๋์ง ์๋ ํ React๊ฐ ์ฌ๋ฌ ๋ฃจํธ ์์๋ฅผ ์ง์ํ๋๋ก ํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
๋ฐ๋ผ์ React์์ ์๋ํ๊ฒ ํ๋ ๊ฒ์ด ํนํ ์ด๋ ค์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ง๋ง ์ง์ ์ผ๋ก ์ ์ ํ ์๋ฃจ์
์ ๋ ๋ฌธ์ ๊ฐ ๋ง์ผ๋ฉฐ ์๋ง๋ mountIndex
์ญ์ ๋ฅผ ํฌํจํด์ผ ํ ๊ฒ์
๋๋ค.
@syranide ์ค๋ฅธ์ชฝ; ๋ด๊ฐ ์์
ํ๊ณ ์๋ ์๋ฃจ์
์ ์ค์ ๋ก ๋
ธ๋์ "์ค์ ์คํ์
"์ด ๋์ด์ผ ํ๋ ์๋ก์ด nodeIndex
๋ฅผ ์๊ฐํฉ๋๋ค(์ด๋ ๋ด๊ฐ ๋์๊ฐ์ mountIndex
๋ฅผ ์ ๊ฑฐํด์ผ ํจ์ ์๊ธฐ์์ผ์ค๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ง๊ธ ๋ด ์ง์ ์์ ์ฌ์ฉ๋์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค).
๊ทธ๋ฌ๋ ์ด์ ํ์ ๊ตฌ์ฑ ์์์ ๋
ธ๋ ์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๊ตฌ์ฑ ์์์ nodeIndex
๋ฅผ ์
๋ฐ์ดํธํด์ผ ํ๋ฏ๋ก ๋ฃจํธ ์์ ์๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. ์ฌ์ ํ ์ด์ ๋ํ ํด๊ฒฐ์ฑ
์ ์ฐพ์์ผ ํฉ๋๋ค.
flexbox ๋ฌธ์ ๋ ๊ฒช์์ต๋๋ค. @syranide "getBunchOfComponents" ์ ์ ์๋ฃจ์ ์ ๋ํด ์ข ๋ ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น? React๊ฐ ์ฒ์์ด๊ธฐ์ ์ด ํจ์๋ฅผ ์ ์ํ ์์น/์ ์ฉ ๋ฐฉ๋ฒ์ ์์ ํ ์ดํดํ๊ธฐ ์ด๋ ต์ต๋๋ค.
@landabaso
function getBunchOfComponents(...) {
return [<ColumnA key="a" />, <ColumnB key="b" />];
}
์ด๋ด,
์ ์ฒด ์ค๋ ๋๋ฅผ ์ฝ์ง๋ ์์์ง๋ง ๋ค์์ ์ด ๊ธฐ๋ฅ์ด ํ์ํ ์ ์๋ ๋ ๋ ์ต์ ํ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค.
์ด ๊ธฐ๋ฅ์ด ์ถ์๋๋ฉด ReactCSSTransitionGroup์ ๋ ์ด์ ๋ํผ ๋ ธ๋๊ฐ ํ์ํ์ง ์๊ฒ ์ฃ ?
@slorber ์, ์๋ง๋ ์ฌ์ค์ผ ๊ฒ์ ๋๋ค.
๋งค์ผ ์ด ๊ธฐ๋ฅ์ด ํ์ํฉ๋๋ค.
๋ง์ ์์ ๊ตฌ์ฑ ์์๊ฐ ์๋ ๊ฒฝ์ฐ(์ฆ, ๋งค์ฐ ๋ชจ๋์์ผ๋ก ์ค๊ณ), ๋ชจ๋ ์ข ๋ฅ์ ํญ๋ชฉ์ div์ ํฌํจํด์๋ ์ ๋๋ ๋ชจ๋ ํญ๋ชฉ์ ๋ํํด์ผ ํฉ๋๋ค. ์์ํด ํ ์ ์์ง๋ง ์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
<div>
์ ๊ฒฝ์ฐ <div>
๋ก ๋ํํ ์ ์์ง๋ง ํ
์ด๋ธ ํ <tr>
์์์ ๊ฒฝ์ฐ ์ฝ์ง ์์ต๋๋ค. <tr>
in <tbody>
๋ก ๋ํํ ์ ์์ง๋ง <tbody>
์ ์ฌ๋ฌ ๋ ์ด์ด๋ฅผ <tr>
์ ์ฌ๋ฌ ๋ ์ด์ด๋ก ๋ํํ๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์์ ์ ์์ต๋๋ค.
๋ด๊ฐ ๋งํ ์๋๋ฆฌ์ค๋ ์์ ํ <head>
๋ ๋๋ฌ๊ฐ ๋์ง ์๊ณ ๋ <link>
๋ฐ <script>
์์๋ฅผ ์ ๊ณตํ๋ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ง๋ ค๊ณ ํ์ต๋๋ค.
์ด ๋ฌธ์ ์ ๋งจ ์์ ๋ฉ๋ชจ๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ๋๊ธ์ ์ฝ๊ธฐ ์ ์ ์ฝ์ด์ฃผ์ธ์. https://github.com/facebook/react/issues/2127#issue -41668009
๋ฒํ ... ์๋ฒ ์ธก์์ ํฌ๊ฒ ํ์ํฉ๋๋ค. <head>
์น์
๋๋ฌธ์ ์กฐ๊ฐ์ ๋ ๋๋งํ ์ ์๋ ๊ธฐ๋ฅ ์์ด ์ ์ฒด ์น ํ์ด์ง(doctype ์ ์ธ)๋ฅผ ๋ ๋๋งํ๋ ๊ฒ์ ๋งค์ฐ ๋ณต์กํฉ๋๋ค. ํ์ฌ ์ต์ข
๋ ๋๋ง์์ ๋ฏน์ค์ธ๊ณผ ์ฝ๊ฐ์ ๋
ผ๋ฆฌ๋ฅผ ํตํด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ง๋ง ์ฌ๋ฌ ๊ตฌ์ฑ ์์ ๋ ๋๋ง์ ๋ํ ์ง์์ด ์๋ค๋ฉด ํจ์ฌ ๊ฐ๋จํ ๊ฒ์
๋๋ค.
@impinball ๋น์ ์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฐ์ ๋ถ์์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ ๋ฌธ์ ์ ๋ชฉ ๊ณผ ์ ์ฌํ ๊ฒ์ ์์ฑํ๋ ค๊ณ ์๋ํ ์ ์์ต๋๋ค. ๋ฉํ ํ๊ทธ, ํค๋, ์ ๋ชฉ ๋ฐ ๋๋๋ก ๋ฆฌ๋๋ ์ ์ ๋ํด ๋์ผํ ์์ ์ ์ํํ ์ ์์์ต๋๋ค.
์ ๋ ์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋๋ฐ ๋น๋ถ๊ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์๊น์? ์ ์ํ ๋๋ก {getBunchOfComponents()}
์(๋ฅผ) ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ฏธ ์ธ๊ธ๋ ๊ฒ ์ธ์๋ ์์ต๋๋ค.
@jonchay ์์๋ง ๋ ๋๋งํ๋ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
function statelessWrapper(props) {
return props.children;
}
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ค๋ฉด:
render() {
return (
<statelessWrapper>
{renderABunchOfComponents()}
</statelessWrapper>
);
}
@whatknight return renderABunchOfComponents();
๊ฐ ์ด๋ฏธ ์๋ํ๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ์๋ํ์ง ์์ต๋๋ค.
render () {
let user = this.state.user
let profile = user.get('data')
let view = null
if (user.get('status') === 'fetched') {
view = (
<h1>{profile.get('login')}</h1>
<img src={profile.get('avatar_url')} />
<dl>
<dt>email</dt>
<dd>{profile.get('email')}</dd>
</dl>
)
} else if (user.get('status') === 'fetching') {
view = <h1>fetching</h1>
} else if (user.get('status') === 'error') {
view = <h1>{profile.message}</h1>
}
return (
<div className={className}>
{view}
</div>
)
}
๋ณด๊ฐ ๋ฐ "์ด์ ๋ธ๋ฆฌ"๋ฅผ ์ํํ๋ ๋์ ์ฌ๋ฌ ์กฐ๊ฐ์ ๋ฐํํ๋ ๋ฐฉ๋ฒ์ด ์ต์ํ ์์ด์ผ ํฉ๋๋ค. ์์ ์๋ img์ h1์ด ๋จํธํ๋ค๊ณ ๋ถํํ์ง๋ง ์ด์จ๋ ๋ฉ์ธ ๋ํผ ์์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ด๊ฐ ์ ๊ฑฐํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ํ๋์ ๋ํผ ์์์ ๋๋ค.
@kilianc ์ด ๊ฒฝ์ฐ ๊ฐ๋จํ ์์ฑํ ์ ์์ต๋๋ค.
view = [
<h1 key={0}>{profile.get('login')}</h1>,
<img key={1} src={profile.get('avatar_url')} />,
<dl key={2}>
<dt>email</dt>
<dd>{profile.get('email')}</dd>
</dl>,
]
์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์ต๋๋ค.
์ด๋ฏธ ์ธ๊ธํ ์ด์ ๋ก ์ด ๊ธฐ๋ฅ์ด ํ์ํ๋ฏ๋ก https://github.com/mwiencek/react/tree/frag-component ์์ <frag></frag>
์ปจํ
์ด๋ ๊ตฌํ์ ์๋ํ์ต๋๋ค.
๊ตฌํ์ ๊ทธ๋ค์ง ์๋ฆ๋ต์ง ์์ง๋ง ์ฌ๋๋ค์๊ฒ ํจ๊ณผ๊ฐ ์๋ค๋ฉด PR์ ์ ์ถํ๊ณ React ๊ฐ๋ฐ์๊ฐ ๊ทธ๊ฒ์ ๋ถํดํ๋๋ก ํ ์ ์์ต๋๋ค.
@mwiencek ์ ๋ฐ์ดํธ์์ ์กฐ๊ฐ์ ์์ ์๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ตฌํ์ด ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค(_nestedChildCount๋ mountComponent์์๋ง ์ค์ ๋จ)? ๋ชจ๋ ๊ฒ์ด ์ ์๋ํ๋๋ก ํ๋ ค๋ฉด ์ฝ๊ฐ์ ๊ต๋ฌํจ์ด ์์ต๋๋ค. ๊ทธ๋๋ ์์์ ์ ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์ค์ ๋ก ์ต๊ทผ์ ์ด๊ฒ์ ๋ํด ๋ค์ ์๊ฐํ๊ณ ์์ผ๋ฉฐ ์ด๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์์๋์ ์๋ ์์ต๋๋ค. ์ฑ๊ณตํ๋ฉด ๋ค์ ๋ณด๊ณ ํ๊ฒ ์ต๋๋ค.
@spicyj ๋ค ๋ง์์ ๊ทธ๊ฑด ์ข ์กฐ์ฌํด๋ด์ผ๊ฒ ๋ค์...
๊ทธ๋ฌ๋ ๊ณง ์ ์ ํ ๊ตฌํ์ ๋ณผ ์ ์๋ค๋ ์ฌ์ค์ ๋งค์ฐ ๊ธฐ๋ปํ์ต๋๋ค. :) ์ ์ฉํ๋ค๋ฉด ํด๋น ๋ถ๊ธฐ์์ ํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๋ณต์ฌํ์ญ์์ค.
@spicyj createFragment
๋ฅผ ์ฌ์ฉํ๊ณ JSX๋ฅผ ๊ทธ๋ ๊ฒ ๋ณํํ๋ ๋ฐฉ๋ฒ์ด ์๋๊ฐ์? ์๋๋ฉด ์ ๋ง๋ก ์กฐ๊ฐ์ด ์์๊ฐ ๋๊ธฐ๋ฅผ ์ํ๋๊ฐ?
@syranide ์ ๋ง์ง๋ง ์ฃผ์์ ๋น๋ํ๊ณ ํ์ฅํ๊ธฐ ์ํด render๊ฐ ๋ฐํ ๊ฐ์ผ๋ก ๋ฐฐ์ด์ ํ์ฉํ๋ค๋ฉด ์ถ๊ฐ "Fragment API"๊ฐ ํ์ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. JSX๋ ์ฌ๋ฌ ๋ฃจํธ ์์๋ฅผ ๋ฐฐ์ด๋ก ๋ณํํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ค๋ฅธ ํจ์์ ๋ฐํ ๊ฐ์์๋ ์๋ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ฌธ์ํ ๋ฐ ํ์ต์ด ํ์ํ ์ถ๊ฐ API ํ๋ฉด์ ๋์ ํ๋ ๋์ React์ ์ ํ ์ฌํญ ์ค ํ๋๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ต์ํ babel-plugin-transform-react-jsx
(๊ตฌํ) ๋ฐ babel-plugin-syntax-jsx
(์ธ์ ๋ฃจํธ ์์์ ๋ํ ๊ตฌ๋ฌธ ๋ถ์ ์ค๋ฅ ์ ๊ฑฐ)์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ ์๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋นํ ์์ ํ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ํ์์ ๋ฒ์/์ฉ๋ ๋ฐ ์ ์๋ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ํ๋ก์ ํธ์ ๋ฏธ์น๋ ์ํฅ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ฌ๋ฌ ์์๊ฐ ์๋ ์กฐ๊ฑด๋ถ์ ์ฌ์ฉ ์ฌ๋ก๋ ์ฌ์ ํ ๋ค๋ฃจ์ง ์์ต๋๋ค. ๋๋ "๋ฐฐ์ด์ ์ฌ์ฉํ๊ณ ๊ฐ ์์์ ์์์ key={...}
๋ฅผ ์๋์ผ๋ก ์ถ๊ฐ"ํ๋ ๊ฒ์ด ์ฅ๊ธฐ์ ์ธ ํด๊ฒฐ์ฑ
์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
@dantman ์ ๋์
๋ค, ์ข์ ์ง์ ์ ๋๋ค. ์๋ ํค ์์ฑ์ ๋ณํ์ ํตํด ๋ด์ฅ๋์ด์ผ ํฉ๋๋ค. ํญ๋ชฉ์ด ๋ณ๊ฒฝ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ฅผ ํค๋ก ์ฌ์ฉํ๋ฉด ์ถฉ๋ถํฉ๋๋ค.
์กฐ๊ฑด๋ถ์ ๊ฒฝ์ฐ ์ด๋ ๋ณํ์ ๋น๋ํ๊ฑฐ๋ JSX-Control-Statements ๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์ด๋ฐ ์์ผ๋ก ๊ตฌํํ์ผ๋ฏ๋ก ์์ด๋์ด์ ๋๋ค.
์
๋ฐ์ดํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด @spicyj ๊ฐ #5753์ ๋ํด ์๊ฐํ ์๋ฃจ์
์ด ์กฐ๊ฐ์์๋ ์๋ํ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค(๋ด์ฉ์ <!-- react-frag: 1 --><!-- /react-frag: 1 -->
์ ๊ฐ์ ๊ฒ์ผ๋ก ๋ํ). ๋ค, ๋๊ธ์ด ์ฝ๊ฐ ๋ชป์๊ฒผ์ง๋ง _nestedChildCount
๋ก ํ๋ ค๊ณ ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์์ ์ ์
๋๋ค. ๊ทธ ์ ๊ทผ ๋ฐฉ์์ ์ด์ https://github.com/mwiencek/react/tree/frag-component ์์ ์ฌ์ฉ๋๋ ๊ฒ์
๋๋ค.
์ง๊ธ๊น์ง ์ค๋ ๋์์ ์ธ๊ธํ ๊ฒ์ ๋ณธ ์ ์ด ์์ง๋ง ์ด๋ฅผ ํด๊ฒฐํ๋ฉด ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ๋ ํฅ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ด ํน์ ์์๋ก ํ๋ ค์ง๊ธฐ๋ฅผ ์ํ๋ ๊ทธ๋ฆฌ๋๊ฐ ์๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ์ด์์ ์ผ๋ก๋ ์ฌ๊ธฐ์ ๋ ๊ฐ์ง ๊ตฌ์ฑ ์์๊ฐ ์์ด์ผ ํฉ๋๋ค. ํ๋๋ ๋ ์ด์์์ ์ฒ๋ฆฌํ๊ณ ๋ค๋ฅธ ํ๋๋ ์ ๋๋ฉ์ด์ ์ ์ฒ๋ฆฌํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ API๊ฐ ์์ต๋๋ค.
<GridLayout
columns = { 3 }
>
<FadeAnimator
springConfig = { springConfig }
>
{ ...cells }
</FadeAnimator>
</GridLayout>
์ด๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ ์ชฝ์ ๊ตฌํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ ํ์ ์์ด ๋ค๋ฅธ ๋ ์ด์์์ด๋ ๋ค๋ฅธ ์ ๋๋ฉ์ด์
์ผ๋ก ์ ํํ ์ ์์ต๋๋ค. GridLayout
๋ ์๋
๋ชฉ๋ก์ ๋ฐ์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. FadeAnimator
๋ ํด๋น ๋ชฉ๋ก์ ๊ฐ๋ก์ฑ์ ์ ์ ํ ์คํ์ผ ๋ฐ/๋๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฝ์
ํ๊ณ GridLayout
๊ฐ ์ฌ์ฉํ ์ ๋ชฉ๋ก์ ๋ฐํํฉ๋๋ค. React ์์๊ฐ ๋ ๋๋ง์์ ๋ฐฐ์ด์ ๋ฐํํ ์ ์๋ค๋ ์ ์ ์ ์ธํ๊ณ FadeAnimator
๊ฐ ๊ทธ๋ฆฌ๋ ๋ ์ด์์์ ๊ด์ฌ์ ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ ๊ทธ๋ฆฌ๋๋ฅผ ์์กฐ ๋ ์ด์์์ผ๋ก ๊ต์ฒดํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ์๋ํ๋ฉด FadeAnimator
๋ ์์์ ์ํ ์ปจํ
์ด๋ ์ญํ ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
ํ์ฌ ์ ํ ์ฌํญ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
<FadeAnimator
wrapper = {
<GridLayout
columns = { 3 }
/>
}
springConfig = { springConfig }
>
{ ...cells }
</FadeAnimator>
// FadeAnimator
render() {
return React.cloneElement(
props.wrapper,
null,
props.children
);
}
๊ทธ๋ฌ๋ ์ด๋ ์ฝ๋๋ฅผ ๋ ๋ช ํํ๊ณ ๋ณต์กํ๋ฉฐ ์์ฑํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
๋ ๋์์ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐํํ ์ ์๋๋ก ํ๋๊ทธ๋จผํธ API ์ถ๊ฐ!
๋ ๋์์ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐํํ ์ ์๋๋ก ํ๋๊ทธ๋จผํธ API ์ถ๊ฐ!
๋ ๋์์ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐํํ ์ ์๋๋ก ํ๋๊ทธ๋จผํธ API ์ถ๊ฐ!
๋ ๋์์ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐํํ ์ ์๋๋ก ํ๋๊ทธ๋จผํธ API ์ถ๊ฐ!
๋ ๋์์ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐํํ ์ ์๋๋ก ํ๋๊ทธ๋จผํธ API ์ถ๊ฐ!
๋ ๋์์ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐํํ ์ ์๋๋ก ํ๋๊ทธ๋จผํธ API ์ถ๊ฐ!
๋ ๋์์ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐํํ ์ ์๋๋ก ํ๋๊ทธ๋จผํธ API ์ถ๊ฐ!
๋ ๋์์ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐํํ ์ ์๋๋ก ํ๋๊ทธ๋จผํธ API ์ถ๊ฐ!
@texttechne ์ ์์ด ๋ ์ข์ต๋๋ค. ์ถ๊ฐ API๋ฅผ ๋์ ํ๋ ๋์ react๋ ๋ ๋๋ง์์ ์ฌ๋ฌ ๋ฃจํธ ์์๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
๋ ๋์์ ์ฌ๋ฌ ๋ฃจํธ ์์๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ด๋ ค์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
https://github.com/facebook/react/blob/master/src/renderers/shared/reconciler/ReactCompositeComponent.js#L1089
์์๊ฐ ์๋ ์์์ ๋ฐฐ์ด์ด ์์ต๋๋ค.
์ด ๋๋ฌธ์ ๋ด๊ฐ ์ดํดํ๋ ํ ์ฌ๋ฌ React ์์๋ฅผ ์ธ์คํด์คํํด์ผ ํฉ๋๋ค. https://github.com/facebook/react/blob/master/src/renderers/shared/reconciler/ReactCompositeComponent.js# L471
๊ทธ๋ฐ ๋ค์ ์ฌ๋ฌ ์ธ์คํด์คํ๋ React ์์๋ฅผ ๋ง์ดํธํฉ๋๋ค. https://github.com/facebook/react/blob/master/src/renderers/shared/reconciler/ReactCompositeComponent.js#L471
๊ทธ๋ฆฌ๊ณ ์ข์ ์์๋ก ์์ฑ๋ ๋ชจ๋ ๋งํฌ์ ์ ์กฐ์ ํฉ๋๋ค.
ํํด ๊ณผ์ ์ ์ฐํํ๊ณ ์ถ์ดํ์ง ์๋ ๋จ์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์กฐ๊ฐ์ ์์๋ก ์ฌ์ฉํ๊ณ ์ถ์ต๋๊น, ์๋๋ฉด ๋ณํ์ ๋ํ ์คํ ๊ตฌ๋ฌธ์ผ๋ก ์กฐ๊ฐ์ ์ํฉ๋๊น?
์์๋ก์์ ํ๋๊ทธ๋จผํธ๋ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ ์คํธ ๋ ธ๋๋ ๋น ๋ ธ๋์ ์ ์ฌํ ์๋ก์ด ์ ํ์ ๋ด๋ถ ๋ ธ๋๋ฅผ ์์ฑํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ ์ฃ ? ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ค์ ์ด๋ป๊ฒ ๊ด๋ฆฌํ ์ง ๋ชจ๋ฅด์ง๋ง.
์๋ฅผ ๋ค์ด, ๋ฃจํธ ์ค ํ๋๊ฐ ๋ง์ดํธ ํด์ ๋๋ฉด ์ด๋ป๊ฒ ์ฒ๋ฆฌํฉ๋๊น? ์
๋ฐ์ดํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น?
๋๋ DevTools ๋ด์์ ์ฌ๋ฌ ๋ฃจํธ๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํฉ๋๊น? (๋ช
๋ฐฑํ ๋ต๋ณ: DevTools ์์ ...)
ํ๋๊ทธ๋จผํธ๋ ๋ณตํฉ ๊ตฌ์ฑ ์์๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฐจ์ด์ ์ ์ ํํ ์ด๋์ ์์ต๋๊น?
์กฐ๊ฐ์ ๊ตฌํํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ๋ณต์ ํ๊ฒ ๋๋ฉด React ๋ด๋ถ๋ฅผ "์๋" ์ํ๋ก ์ ์งํ๊ธฐ ์ํด ์คํ ๊ตฌ๋ฌธ์ ๊ตฌํํ๋ ๊ฒ์ด ๋ ๋ซ์ต๋๊น?
๊ถ๊ธํด์, ๋๋ Subtree ์ง๋ฌธ(renderSubtreeIntoContainer)๊ณผ ๊ด๋ จํ์ฌ React ๋ด๋ถ๋ฅผ ๊ฐ์ง๊ณ ๋์๊ณ ๊ทธ๊ฒ์ด ๋ค์ ๊ด๋ จ์ด ์๋ค๊ณ ๋๋๋๋ค. ์ ํ์ ํธ๋ฆฌ๋ก ๋ ๋๋งํ๋ ค๋ฉด ์ค์ ๋ก ์ ๋ฃจํธ๋ฅผ ๋ ๋๋งํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ํธ๋ฆฌ ์์ค์์ ์ฌ๋ฌ ๋ฃจํธ๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ ๋งค๋ฒ ์ ๋ฃจํธ๋ฅผ ๋ ๋๋งํฉ๋๊น?
<p>Hi</p>
<p>There</p>
๋ ๊ฐ์ "render into new root" ํธ์ถ์ด ๋ฐ์ํฉ๋๋ค.
๋ํผ๋ฅผ ์ฌ์ฉํ๋ฉด ํ ๋ฒ ํธ์ถํ๋ ๊ฒ๋ณด๋ค ๊ทธ๋ ์ง ์์ต๋๊น? ์ฑ๋ฅ์ ์ด๋ป์ต๋๊น? ๊ฐ๋จ? ์์งํ ๋งํด์, ๋ด ๋๋์: ์ฐ๋ฆฌ๋ ์ด ์ํฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด React ๋ด๋ถ๋ฅผ ๊ฑด๋๋ ค์๋ ์ ๋ฉ๋๋ค. ์คํ๋ ค JSX๋ก ์ด ์์ ์ ๋์ด๋ผ ์ ์์ต๋๊น? JSX ๊ตฌ๋ฌธ์ ๊ฐ์ ํ ์ ์์ต๋๊น?
(_๋ฉด์ฑ ์กฐํญ_: ์ ๋ React ๋ด๋ถ์ ์์ ํ ์ต์ํ์ง ์์ผ๋ฉฐ, ์์ ํ ์ดํดํ์ง ๋ชปํ๊ฑฐ๋ ์ดํดํ์ง ๋ชปํ ๋ถ๋ถ์ด ์์ ์ ์์ต๋๋ค. ์คํด์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค.)
ํธ์ง: ์์ /๋ช ํํ ๊ฒ. ๋ํ GitHub๋ ์ด์ํ๊ฒ ์ด๋ฉ์ผ ์คํ์ผ์ ์ด์ํ๊ฒ ์ง์ ํ๋ฏ๋ก ์ฝ๋ ๋ธ๋ก์ ๋ค์ ํฌ๋งทํด์ผ ํ์ต๋๋ค... :-(
์๋ ํ์ธ์, ํต์ฌ Mithril ๊ธฐ์ฌ์/์ปค๋ฏธํฐ์ ๋๋ค.
TL;DR: ํ๋๊ทธ๋จผํธ๋ API์ ๋ด๋ถ๊ฐ
๋จ์ํ.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ๊ฒฝํ์ ํตํด ๊ตฌํํ๊ธฐ๊ฐ _๋งค์ฐ_ ์ด๋ ต๋ค๋ ๊ฒ์ ์๋๋ค. ์ด
๋ํ Mithril์ ๋ํด ์ฌ๋ฌ ๋ฒ ์์ฒญ๋์์ง๋ง ๋ค์์ผ๋ก ์ธํด ๊ฑฐ๋ถ๋์์ต๋๋ค.
์์ ํ ์ด๋ ค์. ๊ตฌํํ๋ ค๋ ๋ชจ๋ ์๋๊ฐ ์์ ์คํจํ์ต๋๋ค.
ํ
์คํธ ์ค์ํธ์ 1/3 ์ด์์ด ์คํจํฉ๋๋ค.
๋๋ ์ฌ์ ํ ์์ฑํ ๊ณํ์ธ vdom ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ธ๋ถ ์ฌํญ์ ์์
์ค์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ชจ๋ ๊ฒ์ ์กฐ๊ฐ์ผ๋ก ์ทจ๊ธํ ๊ฒ์ด์ง๋ง ์ด๊ฒ์ ๋น์ ์ด ๊ฐ์ง๊ณ ์๋ ๊ฒ์
๋๋ค
๋ง ๊ทธ๋๋ก ์ฒ์๋ถํฐ ๋ ๋๋ง ๋ถ๋ถ์ (๋ค์) ์์ฑํฉ๋๋ค. ๋ฆฌ์กํธ์ฒ๋ผ,
DOM์์ ๋ถ๋ฆฌ๋์ง๋ง API๋ ํฌ๊ฒ ๋ค๋ฆ
๋๋ค.
๊ฐ๋
์ ์ผ๋ก ๋ ๋๋งํฉ๋๋ค.
๋ค์์ ํ๋๊ทธ๋จผํธ์ ๋ฌธ์ ์ ์
๋๋ค. ์์ ํ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
๋ด๋ถ์ ์ผ๋ก ๋๋ ์ ๋๋ก ๊ตฌ๋ถํ์ง ์์ต๋๋ค. ์กฐ์ฐจ
document.createContextualFragment
๋ ์ธ๋ชจ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์๋ฉด
๋ ํธ๋ฆฌ ๋ณํ, ๋ ๋๋ง ์๋ต:
// Before
A {}
fragment {
ย ย B[class="foo"] {}
ย ย B[class="bar"] {}
}
C {}
D {}
// After
A {}
B[class="foo"] {}
fragment {
ย ย C {}
}
D {}
์ด์ ๋ํ ์ฌ๋ฐ๋ฅธ ๋ณํ์ B
์์์ C
์์๋ฅผ ๋ชจ๋ ๊ต์ฒดํ๊ณ ๋๋จธ์ง๋ ๊ทธ๋๋ก ๋๋ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ ์์๋ด๋ ๊ฒ์ ์ฌ์ํ ์ผ์ด ์๋๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์กฐ๊ฐ์ ์์์ด ์กฐ๊ฐ์ ์๋ค๋ ์ฌ์ค์ ๋ฌด์ํ๋ฉด์ ๊ธฐ๋ณธ์ ์ผ๋ก ์กฐ๊ฐ์ ์์์ ๋ฐ๋ณตํด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์กฐ๊ฐ์ด ์ฌ๋ผ์ง๋ฉด ๋ค์๊ณผ ๊ฐ์ ํํฌ ์๋ฏธ๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
shouldComponentUpdate
(๊ทธ ํํฌ์ ๋ํ React์ ์ด๋ฆ์ด ๊ธฐ์ต๋์ง ์์ต๋๋ค). ๊ทธ๋์
์ฌ์ ํ ์กฐ๊ฐ์ ๋
๋ฆฝ์ ์ผ๋ก ์ถ์ ํด์ผ ํฉ๋๋ค. ๋น์ ์ ๊ทธ๋ค์
๋ด์ฉ์ด ๋ง์น ๋ถ๋ชจ ์กฐ๊ฐ์ ์ผ๋ถ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ฌ์ ํ
๊ตฌ์ฑ ์์๋ฅผ ์ํด ํด๋น ์กฐ๊ฐ์ ์์น๋ฅผ โโ์ถ์ ํฉ๋๋ค.
์ฆ, ๊ตฌ์ฑ ์์๋ ๋ ์ด์ ๋ณธ์ง์ ์ผ๋ก ํด๋น ๊ตฌ์ฑ ์์์ ์ฐ๊ฒฐ๋์ด ์์ง ์์ต๋๋ค.
DOM ๋
ธ๋. ๋์ ํด๋น ์กฐ๊ฐ์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๋๋ถ๋ถ์ ๋ค๋ฅธ vdom ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ๋ ์์ํฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก React๋ ์์ ์ ํ์ด ์๋๋ผ๋ ๋ณธ์ง์ ์ผ๋ก ๊ตฌ์ฑ ์์๋ฅผ ํธ๋ฆฌ ํํ์ ์ฐ๊ฒฐํฉ๋๋ค. ์ด๊ฒ์ diff ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์
๋๋ค.
๊ตฌ์ฑ ์์๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๋ถ๋ฆฌ๋๋ฉด ๋ฐ๋ก ์์
์ ํด์ผ ํฉ๋๋ค.
๋ ๋ค์ ๋ํ ๋ถ๊ธฐ. ์ด๊ธฐํํ ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ด๊ธฐํํ์ง ์์ต๋๋ค.
๋
ธ๋. ์ด์ ์์ ํ ๋ณ๊ฐ์ ๋ ํ๋ก์ธ์ค๊ฐ ๋์์ต๋๋ค. ํ๊ธฐ ์ด๋ ต๋ค
์ฒ์์๋ ์ง์์ ์ถ๊ฐํ๊ธฐ๊ฐ ๋ ์ด๋ ต์ต๋๋ค.
๋ชจ๋ ๋ง์ ๊ฐ์ฌํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ์ด๋ ต๋ค๋ ๊ฒ์ ์๊ณ ์ฌ์ ํ ์ฐ๋ฆฌ์ ํ ์ผ ๋ชฉ๋ก์ ์์ต๋๋ค. (์ด์ฌํ ๊ตฌํ๋ค๊ณ ํด์ ๋นจ๋ฆฌ ๋์ง๋ ์์ต๋๋ค @janryWang.)
@isiahmeadows GitHub๊ฐ ๊ทํ์ ์๊ฒฌ์ ์ผ๋ถ ๋จน์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฝ๋ ๋ธ๋ก์ด ๊นจ์ ธ <D />
์ ์ฒซ ๋ฒ์งธ ์ธ์คํด์ค๊ฐ ์ ๋ฌ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋๋ ์ด๋ฉ์ผ๋ก๋ ๊ด์ฐฎ์ ๋ณด์ ๋๋ค. GitHub์์ ๋ฒ๊ทธ๋ฅผ ์ฐพ์๋์?
๋ถํํ๋ GitHub์ ๋งํฌ๋ค์ด ์ฒ๋ฆฌ๋ ์ด๋ฉ์ผ์์ ๋๊ธ์ด ์ฌ ๋ ๋ค๋ฅด๊ฒ ์๋ํฉ๋๋ค. ์ฃผ์์ ํธ์งํ์ฌ ๋น ์ค์ ์ ๊ฑฐํ๋๋ฐ ์ด์ ํ์๋ฉ๋๋ค.
์๋ณธ ์ด๋ฉ์ผ์ support@github๋ก ์ ๋ฌํ์ต๋๋ค. ๋ฐ๋ผ๊ฑด๋, ๊ทธ๋ค์ ํ์๋ฅผ ๊ณ ์น ์ ์์ต๋๋ค. ๐
@lhorie ์กฐ๊ฐ์ ๋ฐฐ์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๊น?
DocumentFragment์ ๋ํ ํด๋ฆฌํ์ด ์์ต๋๊น?
HTML ์ฃผ์๊ณผ ๊ฐ์ "์์ฌ" ๋ํผ ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ต์ ์ด ์๋๊ฐ์? ๋๋ ๊ทธ๊ฒ์ด "ํด๊ฒฐ ๋"ํ ์คํธ ๋ ธ๋๋ผ๊ณ ์๊ฐํ์ต๋๋ค ...
@spicyj ๋๊ธ์ ์์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
@isiahmeadows ๊ฐ ๊ทธ์ ์์์ ์ ๊ธฐํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด: ์๋ก์ด Mithril ์์ง์ @isiahmeadows ๊ฐ ๋ช ๊ฐ์ง ์ด์ ๋ก ์ ์ํ ์๋ฏธ ์ฒด๊ณ๋ฅผ ๋ฐ๋ฅด์ง _์์ต๋๋ค_:
B.bar
๊ฐ ์ ๊ฑฐ๋์ง๋ง ์กฐ๊ฐ๋ ์ ๊ฑฐ๋๊ณ C๋ฅผ ๋ํํ๊ธฐ ์ํด ์ ์กฐ๊ฐ์ด ์์ฑ๋จ). ์ด๋ ์๋ช
์ฃผ๊ธฐ๊ฐ "๊ณ๋จ์"์ด๋ผ๋ ์ผ๋ฐ ์์น์ ์๋ฐฐ๋ฉ๋๋ค. ์ฆ, ์ฃผ์ด์ง ๋ถ๋ชจ ๋
ธ๋๊ฐ ์ ๊ฑฐ๋๋ฉด ์์ ๋
ธ๋๊ฐ ์ ๊ฑฐ๋๋์ง ๋ ์ด์ ํ์ ํ ์ ์์ต๋๋ค. ์ด์ ์์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ ๊ตฌ์ฑ ์์์ ์บก์ํ ๊ธฐ๋ฅ์ ๋์๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.ํต์ฌ ํ์ด ๋งจ ์์ ์๋ ๋ฉ๋ชจ๋ฅผ ํ์ฅํ ์ ์๋์ง ๊ด์ฌ์ด ์์ต๋๋ค. _์ด์ ๋ ํ์ฌ ์ํคํ ์ฒ์์๋ ์ด๋ ต์ต๋๋ค. React์ Mithril์ ๋ ๋๋ง ์์ง์ด ๊ทผ๋ณธ์ ์ผ๋ก ๋์ผํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์๊ณ Mithril์ด ์ด์ ์คํ ๊ฐ๋ฅํ๊ณ ์ ์ฉํ๋ค๊ณ ์๊ฐํ๋ ์ ๋๋ก ๋จํธ์ ์ง์ํ๋ค๋ ๊ฒ์ ์๋ฉด ์๋ฏธ๋ก ์ ๋ค๋ฅธ ์ธก๋ฉด์ด ์๋ ๊ฒฝ์ฐ React์์ ๊ตฌํํ๋ ๊ฒ์ด ๋ ์คํ ๊ฐ๋ฅํ ์ ์์ต๋๋ค. Mithril์์์ ๊ฐ์ด ๊ฐ๋ณ์ ์ผ๋ก ํ๊ฐ๋๊ณ ์ ์ฌ์ ์ผ๋ก ๊ฑฐ๋ถ๋ฉ๋๋ค.
๋ด ์๊ฒฌ์ ์์ ํ์ต๋๋ค. ๋๋ ๋ช ๊ฐ์ง ์ค์๋ฅผ ์ ์ง๋ ๊ณ GitHub๋ ์ด๋ฉ์ผ ์๋ต์ ์ ์คํ์ผ๋งํ์ง ๋ชปํ์ต๋๋ค... : ์ธ์์ ์ฐํธ๋ฆฌ๋ฉฐ:
@Primajin ์ ๋ ๊ทธ๊ฒ ๊ถ๊ธํ๋๋ฐ ํ๋์ ์์๋ก ์ ๋ฌ๋์์ ๊ฒ ๊ฐ์์. ์กฐ๊ฐ์ ๊ตฌ์ฑ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๊ฒ์ด ์ค์ํฉ๋๋ค(์์ ์ ์ฐธ์กฐ ). ๊ทธ๋ฌ๋ ๊ทธ๊ฒ๋ค์ ํ๋์ ๋จ์๋ก ์ทจ๊ธํ๊ณ ์ถ์ ๋๊ฐ ์์ ๊ฒ์ ๋๋ค.
์๋ง๋ React.Children.map
๋ ์กฐ๊ฐ์ ํ์ฅํด์ผ ํฉ๋๋ค. ๋ชจ๋ ์์(์์ ์กฐ๊ฐ์ ์์ ํฌํจ)์ ๋ฐ๋ณตํ๋ ค๋ฉด Children.map
๋ฅผ ์ฌ์ฉํ์ญ์์ค. ํ๋๊ทธ๋จผํธ๋ฅผ ๋ถํฌ๋ช
ํ ์์๋ก ์ฒ๋ฆฌํ๋ ค๋ฉด props.children์ {array, element}๋ก ์ง์ ์ฌ์ฉํ์ธ์.
@lhorie ๋๋ ์ฌ์์ฑ์ ๊ด์ฌํ์ง ์์๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ณต์ก์ฑ์ ์ต์ํ์ง ์์ต๋๋ค. ์ด๋ฒ ์ฃผ์ ๊ธฐ๋ง๊ณ ์ฌ๊ฐ 1ํ, ๋ค์ ์ฃผ์ 3ํ๊ฐ ์๋ค๋ ์ฌ์ค๋ก ๋ฐ๋นด์ต๋๋ค. ๊ฒ๋ค๊ฐ ๋ํ์์ ์๊ตฌํ๋ ์ธํด์ญ์ ์ค๋นํ๊ธฐ ์ํด ๋๊ตฐ๊ฐ์ ํจ๊ป ์ผํ๊ณ ์์ต๋๋ค. ๋๋ ๋ํ _๊ฑฐ์_ CLI๋ฅผ ์๋ฃํ Techtonic์ ๋ง๋ฌด๋ฆฌํ๋ ๋ฐ ์ง์คํ์ต๋๋ค(ํ ์คํธ๊ฐ ์ค๋จ๋์ด์๋ ์ ๋ฉ๋๋ค).
@isiahmeadows ์ฃผ์ ์ ๋ํ ์น์ ํ ์๋ฆผ์ ๋๋ค. ๋ค๋ฅธ ์ฃผ์ ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์ถ๋ค๋ฉด mithril gitter room์ ์์ ๋กญ๊ฒ ์ด์ฉํ์ธ์.
@appforartists
์๋ง๋ React.Children.map์ ์กฐ๊ฐ์ ํ์ฅํด์ผ ํฉ๋๋ค.
Mithril stable์ ๋ด๋ถ์ ์ผ๋ก ์ ์ฌํ ์์ ์ ์ํํ์ง๋ง(์ฆ, ํ์ ๋ฐฐ์ด ๋ณํฉ) ์ฑ๋ฅ์์ ์ด์ ๋ก ํด๋น ๋ชจ๋ธ์์ ๋ฉ์ด์ง๊ณ ์์ต๋๋ค. ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ผ ์ ์์ต๋๋ค.
HTML ์ฃผ์๊ณผ ๊ฐ์ "์์ฌ" ๋ํผ ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ต์ ์ด ์๋๊ฐ์? ๋๋ ๊ทธ๊ฒ์ด "ํด๊ฒฐ ๋"ํ ์คํธ ๋ ธ๋๋ผ๊ณ ์๊ฐํ์ต๋๋ค ...
์ฐ๋ฆฌ๋ ๋ช ๋ฌ ๋์ ํ๋ก๋์ ์์ https://github.com/mwiencek/react-packages ๋ฅผ ์ฌ์ฉํด ์์ต๋๋ค. ์ด ์ฃผ์ ๋ํผ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฏ๋ก ์กฐ๊ฐ์ ๋ช ํํ๊ฒ ์ค์ฒฉํ ์ ์์ต๋๋ค.
@mwiencek ๋ง์ถคํ ๋ฐ์ ํจํค์ง ์์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ต๋๊น?
@mwiencek ์ฃผ์ ๋ํผ๊ฐ ํ์ํฉ๋๊น? ๋๋ ์กฐ๊ฐ์์ ์๋ฆฌํ ๊ฒ์ ๊ธฐ๋ํ์ง ์์ ๊ฒ์ ๋๋ค. ์กฐ๊ฐ์์ ์์๋ฅผ ํ์ ์กฐ๊ฐ์ด๋ ๋ฃจํธ ์์๋ก ์ด๋ํ๋ฉด ๋ค์ ๋ง๋ค ์ ์์ต๋๋ค.
๋ฐ๋ผ์ vdom ํธ๋ฆฌ๋ฅผ ์์๋๋ก ๋ฐ๋ฅด๋ฉด ์ฃผ์์ด ํ์ํ์ง ์์ต๋๊น?
์ด์จ๋ , ๊ทํ์ ์๋ฃจ์ ์ ์ธ๋ป ๋ณด๊ธฐ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํ์ํ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๐
์๊ฒฉํ๊ฒ๋ ์๋์ง๋ง ์ด ๊ฒฝ์ฐ ๊ตฌํ์ ๋ ๊ฐ๋จํ๊ฒ ๋ง๋ค์์ต๋๋ค.
๋ฐ๋ผ์ ๋ณธ์ง์ ์ผ๋ก ํ์ฌ React๋ก ์ ์ ํ ์ค๋ช
๋ชฉ๋ก <dl>
์ ๋ง๋๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๊น?
<dl>
<dt>Def 1</dt>
<dd>Some description</dd>
<dt>Def 2</dt>
<dd>Some other description</dd>
</dl>
@KaiStapel ์ด ๋ฌธ์ ๋ render()
์์ ์ฌ๋ฌ ๊ตฌ์ฑ ์์(๋๋ ๋ด๊ฐ ์ถ์ธกํ๋ ์์)๋ฅผ ๋ฐํํ๋ ๊ฒ์ ๊ดํ ๊ฒ์
๋๋ค. render
ํจ์๊ฐ ํ๋์ ๋ฃจํธ ์์/๊ตฌ์ฑ ์์๋ง ๋ฐํํ๋ ํ ์๋ํด์ผ ํฉ๋๋ค.
์ข์์:
render() {
return (
<dl>
<dt>Def 1</dt>
<dd>Some description</dd>
<dt>Def 2</dt>
<dd>Some other description</dd>
</dl>
)
}
์ ์์ด ์๋:
render() {
return (
<h2>my list</h2>
<dl>
<dt>Def 1</dt>
<dd>Some description</dd>
<dt>Def 2</dt>
<dd>Some other description</dd>
</dl>
)
}
@GGAlanSmithee ํ๋ ์ฝ๋ฉ๋์ด ์์ง๋ง ํ ์๋ ์์ต๋๋ค.
<dl>
loop here and print out dt/dd pairs
</dl>
๋งค์ฐ ์ฌํ๋ค. ํ ๋ฒ์ ๋ ๊ฐ์ <tr>
์์๋ฅผ ๋ ๋๋งํ ์ ์๊ธฐ ๋๋ฌธ์ rowspan์ด ์๋ ํ
์ด๋ธ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
์๋จ์์:
"Me too" ๋ฐ "+1"์ ๊ฐ์น๊ฐ ์์ผ๋ฉฐ ์ด๋ฏธ ์ฃผ์์ ์์ฑ๋ ์ฌ์ฉ ์ฌ๋ก๋ ์๋๋๋ค(์: <tr> ๋๋ <dd> ์์๋ฅผ <div>์ ํจ๊ป ๋ฃ์ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค). .
https://github.com/mwiencek/react-packages ์ ์๋ํ๋ ์๋ฃจ์ ์ด ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ด๊ฒ์ด ๊ณง React์ ์ผ๋ถ๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๊น? ์๋๋ฉด ์๋ก์ด ์กฐ์ ์๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๊น?
https://github.com/mwiencek/react-packages ์ ์๋ํ๋ ์๋ฃจ์ ์ด ์๋ค๊ณ ๊ฐ์ ํ๋ฉด
์ค์ ํ๋ก์ ํธ์์ ์ฑ๊ณต์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๊น?
@mwiencek
๊ตฌํ์ ๊ทธ๋ค์ง ์๋ฆ๋ต์ง ์์ง๋ง ์ฌ๋๋ค์๊ฒ ํจ๊ณผ๊ฐ ์๋ค๋ฉด PR์ ์ ์ถํ๊ณ React ๊ฐ๋ฐ์๊ฐ ๊ทธ๊ฒ์ ๋ถํดํ๋๋ก ํ ์ ์์ต๋๋ค.
๋ฌผ๋ก , PR์ ๋ณด๋ด์ฃผ์ธ์!
PR ์ ์ถ์ ๊ดํด @spicyj ๋ก๋ถํฐ ๋ง์ง๋ง์ผ๋ก ๋ค์ ๊ฒ์ ๊ทธ๋ค์ด ์๋ก์ด ํต์ฌ ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ๊ณ ์ด์ ์ ์ ํ ์๋ฃจ์ ์ ํ๊ณ ์ถ๋ค๋ ๊ฒ์ด์์ต๋๋ค. ์๋ํ๋ฉด ์ฃผ์ ๋ ธ๋๋ React Native์์ ์ค์ ๋ก ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋๋ ๊ทธ ์ํ๋ฅผ ๋ฐ๋ฅด์ง ์์์ง๋ง ๊ทธ ๊ณํ์ด ๋ณ๊ฒฝ๋์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ ๋์ ์ฌ๋๋ค์ด ํจํค์ง๊ฐ ์ ์ฉํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
์๋ก์ด ์๊ณ ๋ฆฌ์ฆ ์ ์์ ์ค์ด๋ฉฐ ๋จํธ์ ์ง์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ด ์์ผ๋ก ๋ช ๋ฌ ๋์ ์์ฐ ์ค๋น๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ React DOM์ ๋จผ์ ์ถ๊ฐํ๊ณ ๋์ค์ React Native์ ์ถ๊ฐํ๋ ๊ฒ์ด ๋๋ฌด ๋์ ๊ฒ์ธ์ง ๊ถ๊ธํฉ๋๋ค. ๋จ์ ์ ์ํ๊ณ๋ฅผ ์ฝ๊ฐ ์กฐ๊ฐํํ๋ค๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ค๋ ํ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋ ์ ์ดํดํ ์๊ฐ์ด ์์ผ๋ฉด ์ด ์ง๋ฌธ์ ์ ๊ธฐํ๊ฒ ์ต๋๋ค.
@gaearon ์ง์ํ๋ ํ๋๊ทธ๋จผํธ๊ฐ ๋งค์ฐ ๊ฐ๋จํ๊ณ ์คํ์ผ ๋ฟ์ด๋ผ๋ ์ ์ ์ง์ ํ ์ ์์ต๋๊น? ์ ๋ ํ์ฌ ์์ ์ฌ์ํ ๋ํผ๋ฅผ ํตํด ์ง์ <frag>
๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ฌ๋ฌ ์์์ ๊ตฌ์ฑ ์์ ๋ฃจํธ๋ก ๋ฐํํ๋ ๊ฒ์ด ์ค์ ๋ก ๊ทธ๋ ๊ฒ ์ค์ํ๊ฐ์?
@syranide ๋ฒ ํ ํ๊ฒฝ์์ frag์ ํจ๊ป ์ฌ์ฉ์ ์ ์ ๋น๋๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง ๋์ ๊ณต์ React ๋น๋๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค. <frag>
๋ํผ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น? :) ๊ฐ์ฌ ํด์
@amertak
import React from 'react';
import createFragment from 'react-addons-create-fragment';
let nativeCreateElement = React.createElement;
React.createElement = function() {
if (arguments[0] !== 'frag') {
return nativeCreateElement.apply(this, arguments);
}
let length = arguments.length;
if (length <= 2) {
return null;
}
let children = {};
for (let i = 2; i < length; i++) {
children['~' + (i - 2)] = arguments[i];
}
return createFragment(children);
};
์ฐ๋ฆฌ๋ ์ง๋ ํ ํ์์์ ์ด์ ๋ํด ๋ ๋ง์ด ์ด์ผ๊ธฐํ์ต๋๋ค. ํฉ์๋ ์ฐ๋ฆฌ๊ฐ ์ด ํน์ ๊ตฌํ์ ์ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๊ธฐ๋ฅ์ ์ฅ๊ธฐ์ ์ธ ํต์ฌ ์ฌ์์ฑ์์ ์ง์๋ ๊ฒ์ ๋๋ค(ํ์ฌ๋ก์๋ ์ด์ ๋ํ ์ผ์ ์์).
๋ํ ๋ค์ ์์ฑํ๋ ๋ฐ ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๊ฑฐ๋ ์ ๋๋ก ์๋ํ์ง ์์ ๊ฒฝ์ฐ ์ฌํด ํ๋ฐ๊ธฐ์ ์์ ํ ์ ์๋ ์์ ์ค ํ๋๋ก ๋ค์ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค. ๋ชฉ๋ก์ ํฌํจ๋ ๊ฒ์ด๋ผ๋ ๋ณด์ฅ์ ์์ง๋ง ์ฌ๋ผ์ค๋ฉด ๊ณ์ ์ ๋ฐ์ดํธํ๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ฌด์์ ํ๊ณ ์๋์ง ๋ ์ ์ดํดํ๋ ค๋ฉด ํ์๋ก ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ฐธ์กฐํ์ธ์! https://github.com/reactjs/core-notes/blob/master/2016-07/july-07.md์์ ์ด์ ๋ํ ์ต์ ํ ๋ก ์ ์ฐพ์ ์ ์์ต๋๋ค.
@gaearon ์ ์ด๋ ๊ณต์์ ์ธ frag-syntax๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ํฅ๋ฏธ๋ก์ธ ๊ฒ์ ๋๋ค.
@syranide ์ฝ๋ ๊ฐ์ฌํฉ๋๋ค. ํ์ง๋ง ๋ถํํ๋ ReactDOM.render
๋ฉ์๋๋ก ๋ ๋๋ฌ๋๋ ๋ฃจํธ ์ฑ ๊ตฌ์ฑ ์์๋ก frag
๊ฐ ํ์ํ๊ณ ์ด ๋ฉ์๋๋ ํ๋๊ทธ๋จผํธ๋ฅผ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. .
์ด์จ๋ ๊ฐ์ฌํฉ๋๋ค. frag
์ฑ ๋ฃจํธ๊ฐ ํ์ํ์ง ์์ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ์ ์ฉํ ๊ฒ์
๋๋ค.
@amertak ์, ์กฐ๊ฐ์ ์์ฑํ๊ธฐ ์ํ ๋ณด๋ค ํฉ๋ฆฌ์ ์ธ ๊ตฌ๋ฌธ์ ํ์ฑํํ๊ธฐ ์ํ ๊ฒ์ผ ๋ฟ์ด๋ฉฐ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
@syranide
์๋์ผ๋ก ์ฃผ์์ ๋ ๋๋งํ๊ณ ์ฒ๋ฆฌ๊ฐ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๋ก ๊ฐ์ฃผ๋๋ ๊ฒฝ์ฐ(ํ์ํ์ง ์์ ์ ์์) ์๊ฐํ๊ณ ์์์ต๋๋ค.
๋ด๋ถ์ ์ผ๋ก ์ฃผ์์ #comment
์ ํ์ผ๋ก ์ฒ๋ฆฌ๋๋ฏ๋ก ํธ์ถํ ์ ์์ต๋๋ค.
React.createComponent('#comment', { ... }, children)
?
๊ทธ๋ฅ ์์ด๋์ด์
๋๋ค. ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ.
์ฌ๊ธฐ์ ๋น ์ง ํต์ฌ์ comment
๋
ธ๋๋ฅผ ๋ ๋๋งํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ง์ต๋๊น? :)
@gaearon ์ด๊ฒ ๋นจ๋ฆฌ ์ค์ง ์์ ์กฐ๊ธ ์์ฝ๊ธด ํ์ง๋ง ํฌ๋ช ํ๊ฒ ๋ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ ์ฐ์ธ์!
์
๋ฐ์ดํธ๊น์ง ๋์ฒด ์๋ฃจ์
?
๋๋ฅผ ์ํด Botstraap ์ ๋๋กญ๋ค์ด ๋ฉ๋ด๋ฅผ ๋ ๋๋งํด์ผ ํฉ๋๋ค.
render(){
return (
<ButtonNotification/>
<ul className="dropdown-menu">
{this.state.items.map(this.addItem)}
</ul>
);
}
ReactDOM.render(
React.createElement(NotificationHandler, null),
document.getElementById("listNotification")
);
๊ทธ๋ฌ๋ ๋ถ๊ฐ๋ฅํ๋ค, ์์ด๋์ด?
๊ฐ์ฌ ํด์,
http://getbootstrap.com/components/#btn -dropdowns-single
๋ฌธ์์ ํ์๋ ๋๋ก ๋จ์ผ <div class="btn-group">
๋ก ๋ช
ํํ๊ฒ ๋ํ๋ฉ๋๋ค.
์, ํ์ง๋ง <div class="btn-group">
์ ๋ํ๋ ๋ ๊ฐ์ ์์๊ฐ ์์ต๋๋ค.
render(){
return (
<ButtonNotification/> //ELEMENT 1
<ul className="dropdown-menu"> //ELEMENT 2
{this.state.items.map(this.addItem)}
</ul>
);
}
ReactDOM.render(
React.createElement(NotificationHandler, null),
document.getElementById("listNotification") //is DIV#listNotification
);
<div id="listNotification" class="btn-group"><!--wrap-->
<a href="#">button notification</a> <!--ELEMENT1-->
<ul> <!--ELEMENT2-->
<li></li>
<li></li>
</ul>
</div>
๊ทธ๋ฆฌ๊ณ ๋จ์ผ ์์์ ๋ ๊ฐ์ ์์๋ฅผ ๋ํํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ฉฐ,
์๊ฐ ๋ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค @Primajin
๋ชจ๋ ๊ฒ์ ํ ๋จ๊ณ ์ด๋ํ์ญ์์ค.
render(){
return (
<div className="btn-group"> //WRAP
<ButtonNotification/> //ELEMENT 1
<ul className="dropdown-menu"> //ELEMENT 2
{this.state.items.map(this.addItem)}
</ul>
</div>
);
}
ReactDOM.render(
React.createElement(NotificationHandler, null),
document.getElementById("listWrapper") //or whatever your list is called
);
์๊ฒ ์ต๋๋ค. ํ์ง๋ง ์์ ํญ๋ชฉ์ ๋ค๋ฅธ ํญ๋ชฉ์ด ์์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ฌธ์ ๋ง ์ด๋ํฉ๋๋ค.
<div ...> <--!listWrapper-->
<div class="btn-group">....</>
<div class="btn-group">....</>
<--!React-->
<div class="btn-group"> //WRAP
<ButtonNotification/> //ELEMENT 1
<ul className="dropdown-menu"> //ELEMENT 2
{this.state.items.map(this.addItem)}
</ul>
</div>
<--!React-->
<div class="btn-group">....</>
</div>
๊ทธ๋ฆฌ๊ณ ์ด ๊ฒฝ์ฐ React๋ ํฌํจ๋ ๋ชจ๋ ๊ฒ์ ๋์ฒดํฉ๋๋ค.
๋ค๋ฅธ ์์๋ฅผ ๊ต์ฒดํ์ง ์๊ณ "์ถ๊ฐ"๋ฅผ ์ํํ ์ ์์ต๋๊น?
๊ฐ์ฌ ํด์,
@rifton007 ์๋ ๋ฐฉ์์ด ์๋๋๋ค. ์ปจํ
์ด๋์ ๋ํ๋ ์ฌ๋ฌ ์์/๊ตฌ์ฑ ์์๋ฅผ ํ์ ๋ก ๊ฐ์ง ์ ์์ต๋๋ค. ์ ํ ์ฌํญ์ ๊ตฌ์ฑ ์์๊ฐ ์ฌ๋ฌ ์์๋ฅผ return
ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ฐฉ๊ธ ๊ฒ์ํ ์ฝ๋๊ฐ ์๋ํฉ๋๋ค.
์ฆ, ์๋ํ์ง ์๋ ์์ ๋ฅผ ์๊ฐํด ๋๋ค๋ฉด ์ ์ฒด ์ค๋ ๋๋ฅผ ์ฝ๊ณ _new_ ์์ ๋ฅผ ์ถ๊ฐํ ์ง ์๋๋ฉด ์ด๋ฏธ ํ์ธ๋ ๋์ผํ ๋ฌธ์ ๋ฅผ ๋ฐ๋ณตํ ์ง ์ฌ๋ถ๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์์์ ๋๋ค. ์ด๊ฒ์ ์๋ ค์ง ์ ํ ์ฌํญ์ด๋ฉฐ ์ด ์ค๋ ๋์๋ ์ ํ ์ฌํญ์ ๋ํ ์์ธํ ๋ด์ฉ๊ณผ ์ถ๋ก ์ด ํฌํจ๋์ด ์์ต๋๋ค. Dan์ ๋ํ ๊ถ๊ทน์ ์ผ๋ก ์ด ์ง์์ ์์ ํ ๊ณํ์ด๋ผ๊ณ ๋ฐํ์ต๋๋ค. ํ์ธ๋ ๋ฌธ์ ์ ๋ํ ๋ค๋ฅธ ์๋ฅผ ์ง์ ํ์ฌ ๋ฌด์์ ๋ฌ์ฑํ๋ ค๊ณ ํฉ๋๊น?
์ฃ์กํฉ๋๋ค. ๊ทธ๋์ ๋ค๋ฅธ ์๋ฃจ์
์ด ์์ผ์ ๋ถ์ด ์๋์ง ์๊ณ ์ถ์์ต๋๋ค.
ํ์ํ ๊ฒฝ์ฐ ๋ด ๊ฒ์๋ฌผ์ ์ญ์ ํ ์ ์์ต๋๋ค.
Framework7 ๋ฐ React๋ก ์ฑ์ ์์ฑํ์ง๋ง framework7 html ํ์์ ๊ณ ์ ๋์ด ์์ต๋๋ค.
<div class="page"><div class="navbar"></div><div class="searchbar"></div><div class="page-content"></div><div class="toolbar"></div></div>
'ํ์ด์ง' ํด๋์ค๊ฐ ์๋ ๋ค๋ฅธ div์ ์ฒซ ๋ฒ์งธ ์์ค ํ์ ์์(navbar, searchbar)๋ฅผ ๋ํํ ์ ์์ต๋๋ค.
ํ ๋ชฉ๋ก์ ๋ฐํํ๋ ๊ตฌ์ฑ ์์๊ฐ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก, ์ฐ๋ฆฌ๊ฐ ์์ ์ค์ธ ์ฌ์์ฑ(#6170)์ ์ด๋ฏธ ์กฐ๊ฐ์ ์ง์ํฉ๋๋ค. #7925 ๋ฐ http://isfiberreadyyet.com์์ ์งํ ์ํฉ์ ์ถ์ ํ ์ ์์ต๋๋ค.
<table>
์์๊ฐ ํน์ ์์๋ฅผ ๋ ๋๋งํ ์ ์๋ค๋ ์ฌ์ค๋ง์ผ๋ก๋ Web API์ ํธํ๋๋๋ก ์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
ํธ์ง: ์, ํํธ! ๊ทธ๋ค์ ๊ธฐ๋ํฉ๋๋ค.
@trusktr
์ด ์ค๋ ๋์ ์ฒซ ๋ฒ์งธ ๊ฒ์๋ฌผ์์ ์ธ๊ธํ๋ฏ์ด:
์ ์ง ๊ด๋ฆฌ์์ ์ฐธ๊ณ ์ฌํญ:
์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์๊ณ ์์ผ๋ฉฐ ์ด๋ค ๋ฌธ์ ์ธํธ๋ฅผ ํด๊ฒฐํ ์ ์๋์ง ์ ํํ ์๊ณ ์์ต๋๋ค . ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ํ์ง๋ง ํ์ฌ ์ํคํ ์ฒ์์๋ ์ด๋ ค์ด ๋ฌธ์ ์ ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ํ ์๊ตฌ๋ฅผ ํํํ๋ ์ถ๊ฐ ์๊ฒฌ์ ๋์์ด ๋์ง ์์ต๋๋ค.
๐
์ ์ฅ, ๊ทธ๋งํด์ผ๊ฒ ์ด.
๋๋ ์ด๊ฒ์ ์ฐฌ์ฑํ์ง๋ง ์ ํจํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ณต์ ํ๊ณ ์ถ์์ต๋๋ค. CSS ์ ๋ ๋ ์ด์์(์ผ์ชฝ, ๊ฐ์ด๋ฐ, ์ค๋ฅธ์ชฝ)์ ์ํ๋ 3๊ฐ์ ๋ฒํผ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ผ์ชฝ ๋ฒํผ์ ํญ์ ํ์๋์ง๋ง ๋ค๋ฅธ ๋ ๋ฒํผ์ ์กฐ๊ฑด๋ถ๋ก ํ์๋ฉ๋๋ค. React(ํนํ React Native)์์ flexbox๋ฅผ ์ฌ์ฉํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ๋ ๋๋งํฉ๋๋ค.
[ Left ] { renderCenterAndRightButtons(this.state.someFlag) }
์ค์ ๋ฐ ์ค๋ฅธ์ชฝ ๋ฒํผ์ ๋จ์ผ ๋ณด๊ธฐ๋ก ๋ํ๋๊ธฐ ๋๋ฌธ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐฐ์น๋์ง ์์ต๋๋ค.
์, ์ค์ ๋ฐ ์ค๋ฅธ์ชฝ ๋ฒํผ์ ๊ณ ์ ํ ๋ฐฉ๋ฒ์ผ๋ก ๋ถํ ํ ์ ์์ง๋ง ๋ง์ ๋์์ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ์ค๋ณต ์ฝ๋๊ฐ ๋ง์ด ๋ฐ์ํฉ๋๋ค.
[ Left ] { renderCenterButton(this.state.someFlag) } { renderRightButton(this.state.someFlag) }
์์์ ๋งํ๋ฏ์ด ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์๊ณ ์์ผ๋ฉฐ ์ง์ํ๊ธฐ ์ํด ์ด์ฌํ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. (์์์ ์ด๋ฏธ 6๋ช ์ ์ฌ๋๋ค์ด ํ๋ ์ค๋ฐ์ค ๋ฌธ์ ๋ฅผ ์ธ๊ธํ๊ณ ์์ต๋๋ค.) ๋ ์ด์์ ๋ ผ์๊ฐ ์์ฐ์ ์ด์ง ์์ ๊ฒ ๊ฐ์์ ์ ๊ทธ๊ณ ์์ต๋๋ค. ์๋ก์ด ๊ตฌํ์ ๋ํ ์์์ด ์์ผ๋ฉด ์ ๋ฐ์ดํธํ๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ๋ซ์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ตฌ์ฑ ์์์์ ๋ฐฐ์ด์ ๋ฐํํ๋ ๊ฒ์ ์ง๊ธ ์๋ํ ์ ์๋ React 16 Beta 1 ๋ถํฐ ์ง์๋ฉ๋๋ค.
์์ง ๋ช ๊ฐ์ง ์ ํ ์ฌํญ(SSR ์ง์์ด ์ค๋น๋์ง ์์)์ด ์์ง๋ง #8854์์ ์ด๋ฅผ ์ถ์ ํ๊ณ ์์ผ๋ฉฐ ์ต์ข 16 ๋ฆด๋ฆฌ์ค ์ ์ ์์ ๋ ๊ฒ์ ๋๋ค.
ํผ๋๋ฐฑ์ ์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
๋ ๊ฐ์ฌํฉ๋๋ค
๐พ๐พ๐พ
๐ฆ
@gaearon ๋ฉ์ง ๊ฐ์ ! ์์ ํ ์คํธ ๋ ธ๋๋ฅผ ์ง์ํฉ๋๊น?
์, ๋ฐํ ๋ฌธ์์ด๋ ์ง์ํฉ๋๋ค.
์ด๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ฌ์ญค๋ด๋ ๋ ๊น์?
2๊ฐ์ ์ธ์ ํ XJS ์์๋ฅผ ๋ ๋๋งํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋์ง๋ง return ["foo", "bar"]
(๋ ์ ์ฉํ ๊ฒ ;)๋ฅผ ์ํํ๋ฉด ์์๋๋ bundle.js:66656 Warning: Each child in an array or iterator should have a unique "key" prop.
๋ฅผ ์ป์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ๊ธฐ๋ฅ์ ์ธ๋ถ ์์๋ก ์ค์ ๋ชฉ๋ก์ ๋๋ฌ์ธ์ง ์๋ ๋ฐฉ๋ฒ์ด์์ต๋๊น?
๊ทธ๋ ๋ค๋ฉด ์ด ๊ธฐ๋ฅ์ ์ธ๋ถ ์์๋ก ์ค์ ๋ชฉ๋ก์ ๋๋ฌ์ธ์ง ์๋ ๋ฐฉ๋ฒ์ด์์ต๋๊น?
์, ํ๋์ ๋ ๋์์ ์ฌ๋ฌ ์์๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. (์์ธํ ๋ด์ฉ์ ์ด๊ธฐ ๋ฐํ ๊ฒ์๋ฌผ์ ์ฐธ์กฐํ์ญ์์ค.)
๋ชจ๋ ๋ฐฐ์ด ํญ๋ชฉ์ด ๋ฌธ์์ด๋ก ์๋ ค์ ธ ์๋ ๊ฒฝ์ฐ์๋ ์ด๋ค์ ๊ฒฐํฉํ๊ณ ๋จ์ผ ๋ฌธ์์ด์ ๋ฐํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ด ๊ฒฝ๊ณ ๋ฅผ ํ์ธํ๊ฑฐ๋ JSX์ ๋ค๋ฅธ ์์ ๋ด๋ถ์ ๋ฌธ์์ด ๋ฐฐ์ด์ ํฌํจํ์ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก DOM ์กฐ์ ์ ๊ฐ์ ํ๊ธฐ ์ํด ํค๋ฅผ ์ง์ ํ ์ ์๋๋ก ์์์ ์์๋ฅผ ๋ํํ๊ธฐ ์ํด ์ํํ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
['foo', 'bar']
๋ฅผ ๋ฐํ ํ๋ @diligiant ๋ ์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์์ต๋๋ค. return <div>{['foo','bar']}</div>
<div>
์ ๊ฐ์ ๋ด๋ถ jsx ํ๊ทธ์ ์๋ ๋ฐํ ์ค์ด๋ ๋ฐฐ์ด์ ๊ฐ ์์์๋ 'key' ์ํ์ด ์์ด์ผ ํฉ๋๋ค. ์ง๊ธ ํ ์ ์๋ ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
return [<div key='1'>foo</div>, <span key='2'>bar</span>];
๋ฐ์์ ํฐ ์ ํ์ ์ ๊ฑฐํฉ๋๋ค.
['foo', 'bar']
๋ฅผ ๋ฐํํ๋ Btw๋ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ๊ณ ๋ฅผ ์ ๊ณตํ๋ฉฐ ํด๋น ๊ฒฝ๊ณ ๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด ํด๋น ๋ฌธ์์ด์ ์ฝ๊ฒ ์กฐ์ธํ๊ฑฐ๋ ๋ฌธ์์ด์ด ์๋ jsx ํ๊ทธ์ธ ๊ฒฝ์ฐ ํค ์ํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ฐฐ์ด์ ๋ฐํํ๋ ๋ฐ ์ ํ์ด ์์ต๋๋ค.
@JesperTreetop ๊ฐ์ฌํฉ๋๋ค.
@sassanh , ๊ทํ์ ์์์ ๋๋ ์ฃผ๋ณ์ (์๋ฏธ์) ์ธ๋ชจ์๋ <div>
๋ฅผ ํผํ๊ธฐ ์ํด "๊ทธ๋ฅ" ํค๋ฅผ ์ฌ์ฉํ๊ธฐ์๋ ๋๋ฌด "๋ถ๋๋ฌ์"ํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ณ์ ์งํํด์ผ ํ๋ฉฐ ์ค์ ์ฑ๋ฅ ์ ํ๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๊น? ๊ทธ๊ฒ์ ์ ๋ง๋ก ์ง์ ํ ๊ฐ์ ์ด ๋ ๊ฒ์
๋๋ค!
@diligiant ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๋์ง ์์ฌ์ค๋ฝ์ง๋ง ์ฃผ๋ณ ๋ฌธ์์ด์ด ์๋๊ณ ์ฃผ๋ณ ๋ฌธ์์ด์ด ์๋๋ฉด ๋ฐฐ์ด์ ์ ํ ํผํ๊ณ ๋ฌธ์์ด์ ๊ฒฐํฉํ ์ ์๋ค๋ฉด ์ฃผ๋ณ์ ์ธ๋ชจ์๋ div
๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๋ฌธ์์ด์ด ์๋ ๊ฒฝ์ฐ ๊ตฌ์ฑ ์์์ ํค๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Foo
๋ฐ Bar
๋ ๊ฐ์ ๊ตฌ์ฑ ์์๊ฐ ์๋ ๊ฒฝ์ฐ [<Foo key='foo'/>, <Bar key='bar'/>]
๋ฅผ ๋ฐํํ ์ ์์ผ๋ฉฐ ๊ตฌ์ฑ ์์(ํญ์ ๊ทธ๋ ๋ฏ์ด)๋ ๋ฐฐ์ด(๋๋ถ์ ์ด ์ ๋ฆด๋ฆฌ์ค์์๋ 16) ์ด์ ์ ์ด๋ ์ด๋ฅผ ๋๋ฌ์ธ์ผ ํ์ต๋๋ค.
@sassanh ๊ทธ๋ผ ๋ฉ์ ธ์. ๋ฌผ๋ก ๋ด ์ฌ์ฉ ์ฌ๋ก๋ ์ฌ๋ฌ ๊ตฌ์ฑ ์์์ ๋ํ ๊ฒ์ด์์ต๋๋ค. ํ๋ณตํ๋ค!! ;)
์ฌ์ค ๋ชจ๋ ํญ๋ชฉ์ด ๋ฌธ์์ด์ผ ๋ ๋๋ฝ๋ ํค์ ๋ํด ๊ฒฝ๊ณ ํ๋ ๊ฒ์ด ์ด์ํ๊ฒ ๋ณด์ ๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ ๊ฒ ํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ์ง ์์ ๊ฒ์ ๋๋ค. ๋ฌธ์์ด์ด div ์์ ์์ ๋ 15์ ๊ธฐ์กด ๋์์ ๋๊น? ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ต์์ ๋ฌธ์์ด์ ๋ํด 16์์ ์์ ํด์ผ ํฉ๋๋ค(ํค๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์).
@gaearon ์ฃ์กํฉ๋๋ค. ์ ์๋ ์คํด์ ์์ง๊ฐ ์์ต๋๋ค. ๊ตฌ์ฑ ์์๋ฅผ ์๋ฏธํ์ต๋๋ค.
ํ์ธํ๊ณ -beta.5
์๋์์ React๋ ์ฌ๋ฌ ๋ฌธ์์ด์ด ์๋ ๋ฐฐ์ด์ ๋ ๋๋งํ ๋ ๊ฒฝ๊ณ ๋ฅผ ๋ฐํํ์ง ์์ต๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฃผ๋ณ ๊ตฌ์ฑ ์์๋ฅผ ํผํ๊ธฐ ์ํด ๋ฐฐ์ด์ ๋ ๋๋งํ ๋ key
์๊ตฌ ์ฌํญ์ ์์ํดํฉ๋๋ค. ๋๋ ์ดํดํ๊ณ ์๋ฌด ๊ฒ๋ ์๋์ง๋ง ์๋ง๋ SO์ ๋ํ ์๋ง์ ์ง๋ฌธ์ ์ ๊ธฐํ ๊ฒ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ด ๊ฒฝ๊ณ ๋ ์กฐ์ ์์ ๋ํด ์ ํํ ๋์ผํ "์ถ๊ฐ ์์
"์ผ๋ก ์์ฝ๋๊ณ ๋ฐ๋ผ์ key
๋ฅผ ์ค์ ํ์ฌ ์์ ํ ๋์ผํ ์ ์ฌ์ ์ต์ ํ๋ก ์์ฝ๋๊ธฐ ๋๋ฌธ์ ๊ตฌ์ฑ ์์ ๋ฐฐ์ด์ ๋ค๋ฅธ ๋ชจ๋ ์ฌ์ฉ๊ณผ ์ ํํ ๋์ผํฉ๋๋ค. ๋์๊ฒ ๋๋ผ์ด ๊ฒ์ ๊ตฌ์ฑ ์์ ๋ฐฐ์ด์ด ์ด๊ฒ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌ๋์ด์ผ ํ๊ณ ์คํ ์ค๋ฒํ๋ก ์ง๋ฌธ๋ ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋งํ ๊ฒ๋ ์์ด ์ฒ์๋ถํฐ ๊ทธ๊ฒ์ ์ถ์ ํ๋ ๋ฐ ์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ํฌํจ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
.. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํจ์์์ ๋ฐฐ์ด์ ๋ฐํํ ๊ฒ์ด๋ฏ๋ก key
๊ฒฝ๊ณ ๊ฐ ํ์ ๋๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๊ฒฝ๊ณ ๋ฅผ ์ํ์ง ์๋ ๊ฒฝ์ฐ๋ ์์์ด๋ฉฐ React๊ฐ ๊ฒฝ๊ณ ํ์ง ์๋ ๊ฒ์ด ์ ์ ํ์ง ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
ํค๊ฐ ์์ผ๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๋ฟ๋ง ์๋๋ผ ์ ํ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ๊ฒฝ๊ณ ๊ฐ ํ์ํฉ๋๋ค. ์ด๊ฒ์ ์ ํค๊ฐ ํ์ํ์ง ๋ฌป๋ ๋ค๋ฅธ ๋ง์ ๋ฌธ์ ์ ์ค๋ช ๋์ด ์์ผ๋ฏ๋ก ํด๋น ํ ๋ก ์ ๊ฒ์ํ์ฌ ์ฝ์ด๋ณด์๊ธฐ ๋ฐ๋๋๋ค. ๋๋ ๋ฌธ์๊ฐ ์ด๊ฒ์ ๋ํด ๋ ๋ช ํํ ์ ์๋ค๋ ๋ฐ ๋์ํ๊ณ , ๋ค์์ ๋ฌธ์ ๋ณ๊ฒฝ ์คํ๋ฆฐํธ๋ฅผ ํ ๋ ์ดํด๋ณผ ๊ฒ์ ๋๋ค.
render์์ ์ง์ ๋ฐํ๋ ๋ฐฐ์ด๊ณผ div ๋ด๋ถ์ ๋ฐฐ์ด ์ฌ์ด์๋ ๊ฐ๋ ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ํ ๊ฒฝ์ฐ์๋ ์ฃผ์ ๊ฒฝ๊ณ ๊ฐ ํ์๋๊ณ ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ํ์๋์ง ์์ ์ด์ ๊ฐ ์์ต๋๋ค. ํค๊ฐ ์์ ๋ ๋ ๋ค ๋์ผํ ๋ฌธ์ ์ ์ํฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํด์ผ ํฉ๋๋ค.
์ฆ, ์ ์ ์ฝํ ์ธ ์ ํค๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ์ง์ฆ๋๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค. ์์์ด ์ ์ ์ผ๋ก ์๋ ค์ง(๋ฐ๋ผ์ ์ฌ์ ๋ ฌ๋์ง ์์) JSX ๊ตฌ์กฐ๋ฅผ ์์ฑํ ๋ ํค๋ฅผ ์ง์ ํ์ง ์๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๋ฏธ๋์๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ JSX์ ์กฐ๊ฐ์ ๋ํ ๋ช ์์ ์ง์์ ์ถ๊ฐํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
return (
<>
<div>child 1</div>
<div>child 2</div>
</>
);
๋ฐฐ์ด์ ์์ฑํ ์ ์์ง๋ง ์์์ ์ผ๋ก ์ซ์ ์ธ๋ฑ์ค๋ฅผ ์์์ ํ ๋นํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์์๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. JSX ์์ ํํ์์ด ์ ๊ณตํ๋ ์ด๋ฌํ ๋ณด์ฅ ๋๋ถ์ div์ ์ฌ๋ฌ ์์์ด ์์ ์ ์๋ ์ผ๋ฐ JSX ์ฝ๋์์ ํค๋ฅผ ์ง์ ํ์ง ์๊ณ ๋ ๋น ์ ธ๋๊ฐ ์ ์์ต๋๋ค.
ํ์ง๋ง ์์ง ์ด ๊ตฌ๋ฌธ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ํ์ฌ๋ก์๋ ์ด๊ฒ์ด ์๋ ค์ง ์ ํ ์ฌํญ์ ๋๋ค.
@JesperTreetop & @zwily , @gaearon ์ด ์ ๋ณด๋ค ํจ์ฌ ์ ์ค๋ช ํ์ต๋๋ค ;)
์์๋ค์ํผ, ๊ทธ๊ฒ์ ํฐ ๋ฌธ์ ๊ฐ ์๋์ง๋ง ์ฐ๋ฆฌ ๋ชจ๋๋ React๊ฐ ๋ฒ์ฑํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ์ ๋ ๋จ์งโฆ
@gaearon <>
๊ตฌ๋ฌธ ์ ์์ ๋ํด ์ด ๋ฌธ์ ์ ๋ํ ์ถ๊ฐ ๋
ผ์ ๋์ ์ง์ผ๋ณผ ์ ์๋ ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์์ต๋๊น? ์ด๋ฆฌ์ ๋ฆฌ ๊ฒ์ํ์ง๋ง ์ฐพ์ ์ ์์์ต๋๋ค.
@smrq +1 ์ง๋ฌธ โ ์ ๋ ๊ทธ ์ด์ํ ์ ํ(์ผ๋์ผ rendrer()
๊ฒฐ๊ณผ, ํค ๋ฐ JSX ๊ตฌ๋ฌธ ๋๋ ์กฐ๊ฐ)์ ๋ํ ๋ชจ๋ ๊ฒ์ ๋ฐ๋ฅด์ง๋ง ์ ๊ฐ ์๋ ์ ์ผํ ํฐ์ผ์ https://github.com/ ์
๋๋ค.
๋๋ ๋ํ ์ฌ์ ๊ฐ ํค ๋ฌธ์ ๋ฅผ ์ ํ ํด๊ฒฐํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ์คํ๋์ง ์์ ๊ฟ์ฒ๋ผ ๋ณด์ ๋๋ค.
ํค๋ "๋ฌธ์ "๊ฐ ์๋๋๋ค. :) ๊ทธ๊ฒ๋ค์ ๋์ ๋ชฉ๋ก์ ์์ฑํ ์ ์๊ฒ ํด์ฃผ๋ ๋ชจ๋ ๋ณด๊ธฐ ํ๋ ์์ํฌ์ ๊ธฐ๋ณธ์ ์ด๊ณ ํ์์ ์ธ ๋ถ๋ถ์ ๋๋ค.
์์ธํ ์ค๋ช ์ https://facebook.github.io/react/tutorial/tutorial.html#keys ๋ฅผ ์ฐธ์กฐํ์ธ์.
@spicyj ์ค์ ๋ก ๊ฐ๋ฐ์์ ์๋์ง ์ง์ถ์ ๋๋ฆฌ๊ณ ์ด๋ฌํ ์๊ตฌ ์ฌํญ ์์ด ๋ณด๊ธฐ ํ๋ ์์ํฌ๋ฅผ ํ๋ก๊ทธ๋๋ฐํ ์ ์๋ ๊ทผ๋ณธ์ ์ธ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ยซ๋ฌธ์ ยป์ ๋๋ค(์: https://github.com/dfilatov/vidom).
์ด๋ฌํ ์๊ตฌ ์ฌํญ ์์ด ๋ณด๊ธฐ ํ๋ ์์ํฌ๋ฅผ ํ๋ก๊ทธ๋๋ฐํ ์ ์๋ ๊ทผ๋ณธ์ ์ธ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค(์: https://github.com/dfilatov/vidom).
vidom์ ์ปฌ๋ ์ ์์ ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ธฐ์ ์ ์ผ๋ก ์์ด๋ ์๋ํ ์ ์์ง๋ง ํจ์ฌ ๋๋ฆด ๊ฒ์ ๋๋ค. React๋ ๊ธฐ์ ์ ์ผ๋ก ํค ์์ด๋ ์๋ํ ์ ์์ง๋ง ๋ชฉ๋ก์์ ๋จ์ผ ํญ๋ชฉ์ ์ ๊ฑฐํ ๋ ๊ตฌ์ฑ ์์์ ์ ๋ฐ์ด ์ ๋ฐ์ดํธ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ ๊ฒ์ ๋งค์ฐ ์์์น ๋ชปํ ์ผ์ ๋๋ค. ํค๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋์ ํญ๋ชฉ๋ง ๋ง์ดํธ ํด์ ๋ฉ๋๋ค.
@goto-bus-stop vidom์ ํค๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ํ์๋ ์๋๋ฉฐ ์ ๋ฐ์ดํธ๊ฐ ๋ง์ ์ ๋ง ํฐ ๊ฒฝ์ฐ์๋ง ์ค์ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๊ทธ๋์ ๋๋ ์ด ๋ถ๋ถ์ ๊ฐ๋ณ ๊ฒฝ์ฐ์ ์ฑ๋ฅ ์กฐ์ ์ ์ฌ์ฉํ ์ ์๋ ๊ฐ๋ฅํ ์ ํ ์ฌํญ(์: shouldComponentUpdate
)์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.
@veged ํค ์์ด ๊ณ ๊ตฐ๋ถํฌํ๋ vidom์ ์ .
์์๋ฅผ ์ฌ์ ๋ ฌํด์ผ ํ๋ค๋ ์ฌ์ค์ ์์ง ๋ชปํ๋ฏ๋ก ๋ฃจํธ ๊ตฌ์ฑ ์์์ ๊ฐ ๋ ๋๋ง์์ ์ธ์คํด์ค๋ฅผ ๋ฒ๋ฆฝ๋๋ค.
๊ฐ์ ๋ ๊ณต๊ฐ [1]์ ์์ฃผ ์ต์ํ ์ฌ๋์ผ๋ก์. ๋๋ ๋งํ ์ ์์ต๋๋ค :
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ๋ช ํํ ๋ฌธ์ ( @gaearon ์ด ์ค๋ช ํจ)๋ ์ด๋ ์ด์ ์์ ํ ์ ์ ์ฌ์ฉ๋ฒ๊ณผ ์ ์ ์ด๋ ์ด์ ์ ์ JSX ์กฐ๊ฐ ๊ฐ์ ์ฐจ์ด์ ์ ๋๋ค.
@brigand O๋ ์ํ ์ ์ฒด ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ ๋ ฌํ๋ฉด ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๋ฐ ์์ฌ์ ์ฌ์ง๊ฐ ์์ต๋๋ค. ;-) ๊ทธ๋ฌ๋ ๋ค๋ฅธ ๋ชจ๋ ๊ฒฝ์ฐ(๋ด ์๊ฐ์๋ ๋ ๋ง์ ๊ฒฝ์ฐ)๊ฐ ์ด๋ฅผ ์ํด ๊ณ ๊ตฐ๋ถํฌํด์ผ ํฉ๋๋ค... ๋ ผ๋์ ์ฌ์ง๊ฐ ์์ด ๋ณด์ ๋๋ค.
ํค ๋ React์์ ์ค์ํฉ๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ์ค์ํ์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์ด๋๋ผ๋(์: ์๋ ๊ตฌ์ฑ ์์๊ฐ ๋ชจ๋ ์ํ ๋น์ ์ฅ์ด๊ธฐ ๋๋ฌธ์) ๊ทํ ๋๋ ํ์ ๋ค๋ฅธ ๋๊ตฐ๊ฐ๊ฐ ๋ช ์์ค ์๋์ ์ํ ์ ์ฅ ๊ตฌ์ฑ ์์(๋๋ ์ผ๋ฐ DOM ์ ๋ ฅ)๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋ฐฉํดํ๋ ๊ฒ์ ์์ต๋๋ค. ๋ช ๋ฌ ์์. ๊ทธ๋์ฏค์ด๋ฉด ํค๊ฐ ์๋ค๋ ์ฌ์ค์ ์์ด๋ฒ๋ฆด ์ ์์ผ๋ฏ๋ก ์ฌ์ ๋ ฌ๋ก ์ธํด ์ํ(๋๋ ์ ๋ ฅ ๊ฐ)๊ฐ ์๋ชป๋ ํญ๋ชฉ๊ณผ ์ฐ๊ฒฐ๋ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ๋์ ๋ชฉ๋ก์ ๋ํด ๋ชจ๋ ๊ณณ์์ ํค๋ฅผ ์ง์ ํ๋๋ก ๊ถ์ฅํ๋ ์ด์ ์ ๋๋ค. ๊ทธ๋ ๊ฒ ํ์ง ์์ผ๋ฉด ์ถ์ ํ๊ธฐ ๋งค์ฐ ์ด๋ ค์ด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ 10์๊ฐ ๋์ ํค๋ฅผ ์ง์ ํ๋ ๊ฒ๋ณด๋ค ์ถ๊ฐ๋ก 10์ด๋ฅผ ๋ณด๋ด๋ ๊ฒ์ด ์ฝ๋์ ๊ฒฝ์ฐ ์ฌ๋ฌ ์์ค ์๋์ ์๋ ๊ตฌ์ฑ ์์์ ์ํ๊ฐ ์๋ง์ด ๋๋ ์ด์ ๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ๋ณด๋ค ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ชฉ๋ก์ด ์ ์ ์ด๊ณ ์ฌ์ ๋ ฌ๋์ง ์๋ ๊ฒ์ผ๋ก ์๋ ค์ก์ ๋ ํค๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ๋ถํธํ๋ค๋ ๋ฐ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. JSX ๋ฆฌํฌ์งํ ๋ฆฌ์์ ์ด์ ๋ํด ๋ ผ์ํ ์ ์์ต๋๋ค. ์ด์ ๋ํ ๋ฌธ์ ๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ ์ ๋ฌธ์ ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์ด ์ค๋ ๋๋ ๊ตฌ๋ ์๊ฐ ๋ง๊ณ ๊ธฐ๋ฅ์ด ๊ตฌํ๋์์ผ๋ฏ๋ก ๋ง์ ์ฌ๋๋ค์๊ฒ ์๋ฆผ์ผ๋ก ์คํธ์ ๋ณด๋ด์ง ์๋๋ก ์ ๊ทธ๊ณ ์ถ์ต๋๋ค. ์์ ์ค๋ช ์ด ๊ทํ์ ์ฐ๋ ค ์ฌํญ์ ํด๊ฒฐํ๊ธฐ๋ฅผ ํฌ๋งํ์ง๋ง ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ํน์ ์ฃผ์ ์ ๋ํ ์ถ๊ฐ ํ ๋ก ์ ์ํด ์ ๋ฌธ์ ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
@smrq ๋ jsx ์ ์ฅ์ https://github.com/facebook/jsx/issues/84 ์์ <>
๊ตฌ๋ฌธ์ ๋ํ ์ ์ ๋ฌธ์ ๋ฅผ ๋ง๋ค์์ต๋๋ค.
์๋ก์ด React.Fragment
๋ด๋ณด๋ด๊ธฐ ๋ฐ ๊ด๋ จ <>
๊ตฌ๋ฌธ์ ๋ํ ์ง์์ ๋ฐฉ๊ธ ์ถ์ํ์ต๋๋ค.
https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ๋ซ์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ตฌ์ฑ ์์์์ ๋ฐฐ์ด์ ๋ฐํํ๋ ๊ฒ์ ์ง๊ธ ์๋ํ ์ ์๋ React 16 Beta 1 ๋ถํฐ ์ง์๋ฉ๋๋ค.
์์ง ๋ช ๊ฐ์ง ์ ํ ์ฌํญ(SSR ์ง์์ด ์ค๋น๋์ง ์์)์ด ์์ง๋ง #8854์์ ์ด๋ฅผ ์ถ์ ํ๊ณ ์์ผ๋ฉฐ ์ต์ข 16 ๋ฆด๋ฆฌ์ค ์ ์ ์์ ๋ ๊ฒ์ ๋๋ค.
ํผ๋๋ฐฑ์ ์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค!