React: ๋ Œ๋”์—์„œ ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ”„๋ž˜๊ทธ๋จผํŠธ API ์ถ”๊ฐ€

์— ๋งŒ๋“  2014๋…„ 09์›” 02์ผ  ยท  148์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react


์œ ์ง€ ๊ด€๋ฆฌ์ž์˜ ์ฐธ๊ณ  ์‚ฌํ•ญ:

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋„ ์ด๊ฒƒ์„ ์›ํ•˜์ง€๋งŒ ํ˜„์žฌ ์•„ํ‚คํ…์ฒ˜์—์„œ _์–ด๋ ค์šด ๋ฌธ์ œ_์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š•๊ตฌ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ถ”๊ฐ€ ์˜๊ฒฌ์€ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์œ ๋กญ๊ฒŒ ๋ฌธ์ œ๋ฅผ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(์˜ค๋ฅธ์ชฝ ์—ด์— ๋ฒ„ํŠผ์ด ์žˆ์Œ) ํ† ๋ก ์— ๊ฐ€์น˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ๋Œ“๊ธ€์„ ๋‹ฌ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. "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์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค์‹œ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€์— ์•„๋ฌด๋Ÿฐ ํ•ด๋ฅผ ๋ผ์น˜ ์ง€ ์•Š์œผ๋ฉด์„œ๋„ ์ง€์ €๋ถ„ํ•˜๊ณ  ๋น„์ „๋ฌธ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ€๋ฅด์ณ ์ฃผ์„ธ์š”.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ๋‹ซ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์ง€๊ธˆ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š” React 16 Beta 1 ๋ถ€ํ„ฐ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

์•„์ง ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ(SSR ์ง€์›์ด ์ค€๋น„๋˜์ง€ ์•Š์Œ)์ด ์žˆ์ง€๋งŒ #8854์—์„œ ์ด๋ฅผ ์ถ”์ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ตœ์ข… 16 ๋ฆด๋ฆฌ์Šค ์ „์— ์ˆ˜์ •๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๋ชจ๋“  148 ๋Œ“๊ธ€

๋ž˜ํผ๋ฅผ ๋„ฃ์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„คํƒ•์ด ์ œ๊ฑฐ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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/

์‚ฌ๋ฌผ์˜ ๊ตฌํ˜„ ์ธก๋ฉด์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ด€์ฐฐ:

  • ๋‹น์—ฐํžˆ ๋” ๋งŽ์€ ๋…ธ๋“œ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด "1 ๊ตฌ์„ฑ ์š”์†Œ = 1 ๋…ธ๋“œ"๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๊ฐœ์กฐํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค ;)
  • ์ฒ˜์Œ์—๋Š” DOM ์ž‘์—… ์ธก์—์„œ ์กฐ๊ฐ์„ ์ถ”์ ํ•˜์—ฌ ReactMultiChild ์ƒ์„ฑ๋œ ๋ณ€ํ˜• ๋ช…๋ น์ด ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๊ณ  ๋‹ค๋ฅธ ๋…ธ๋“œ์ฒ˜๋Ÿผ ์กฐ๊ฐ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ ์ˆ˜/์–ด๋–ค ๋…ธ๋“œ๊ฐ€ ์กฐ๊ฐ์ธ์ง€์— ๋Œ€ํ•œ ์ƒํƒœ๋ฅผ DOM ์ƒํƒœ ์ถ”์ ์— ์ถ”๊ฐ€ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์ƒ๊ฐ๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. @Prinzhorn ์ด ์–ธ๊ธ‰ํ•œ ์ฃผ์„ ํŽœ์‹ฑ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒ๋Œ€ ๋น„์šฉ์„ ๊ณ ๋ คํ•˜๋ฉด DOM ์กฐํšŒ๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์— ์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ ์•„์ด๋””์–ด๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ReactMultiChild ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ชจ๋“  ์ž์‹์— _nodeCount ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์กฐ๊ฐ์— ์‹ค์ œ๋กœ ํฌํ•จ๋œ ๋ฃจํŠธ ๋…ธ๋“œ ์ˆ˜๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด ์ดˆ๊ธฐ ๋ Œ๋”์—์„œ ๋‹จํŽธ์˜ ์ž์‹์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์‰ฝ์ง€๋งŒ ํ›„์† ๋Œ์—ฐ๋ณ€์ด์—์„œ ๋‹จํŽธ์˜ ๋…ธ๋“œ ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ๋” ๊นŒ๋‹ค๋กœ์›Œ ๋ณด์ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋‚ด ์ง€์ ์—์„œ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(https://github.com/thomasboyt/react/issues/2 ์ฐธ์กฐ).

  • ๋งŽ์€ DOM ์ž‘์—…์€ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€/์ด๋™/์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€ ๋…ธ๋“œ ID๋กœ ์กฐํšŒ๋œ ์š”์†Œ์˜ ์ƒ์œ„ ๋…ธ๋“œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ ์˜์กดํ•ฉ๋‹ˆ๋‹ค(https://github.com/thomasboyt/react/issues/3 ์ฐธ์กฐ). 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" />];
}

์ด๋ด,

์ „์ฒด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์ง€๋Š” ์•Š์•˜์ง€๋งŒ ๋‹ค์Œ์€ ์ด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ Œ๋” ์ตœ์ ํ™” ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

http://stackoverflow.com/questions/30976722/react-performance-rendering-big-list-with-purerendermixin

์ด ๊ธฐ๋Šฅ์ด ์ถœ์‹œ๋˜๋ฉด 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 ์ฐธ๊ณ ๋กœ Mithril์˜ ์žฌ์ž‘์„ฑ ๋ถ„๊ธฐ๋Š” ์กฐ๊ฐ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

@spicyj ์•„์ง ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ตฌํ˜„ [1] [2] ๋ฐ ํ…Œ์ŠคํŠธ [1] [2] ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด diff ์—”์ง„์€ ์•ฝ 400 LOC์— ๋ถˆ๊ณผํ•˜๋ฏ€๋กœ ์‰ฝ๊ฒŒ ๋”ฐ๋ผํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@isiahmeadows GitHub๊ฐ€ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ์ผ๋ถ€ ๋จน์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ธ”๋ก์ด ๊นจ์ ธ <D /> ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ „๋‹ฌ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์ด๋ฉ”์ผ๋กœ๋Š” ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค. GitHub์—์„œ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์•˜๋‚˜์š”?

๋ถˆํ–‰ํžˆ๋„ GitHub์˜ ๋งˆํฌ๋‹ค์šด ์ฒ˜๋ฆฌ๋Š” ์ด๋ฉ”์ผ์—์„œ ๋Œ“๊ธ€์ด ์˜ฌ ๋•Œ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์„์„ ํŽธ์ง‘ํ•˜์—ฌ ๋นˆ ์ค„์„ ์ œ๊ฑฐํ–ˆ๋Š”๋ฐ ์ด์ œ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์›๋ณธ ์ด๋ฉ”์ผ์„ support@github๋กœ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋ผ๊ฑด๋Œ€, ๊ทธ๋“ค์€ ํŒŒ์„œ๋ฅผ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ƒ

@lhorie ์กฐ๊ฐ์— ๋ฐฐ์—ด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?
DocumentFragment์— ๋Œ€ํ•œ ํด๋ฆฌํ•„์ด ์žˆ์Šต๋‹ˆ๊นŒ?

HTML ์ฃผ์„๊ณผ ๊ฐ™์€ "์˜์‚ฌ" ๋ž˜ํผ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์˜ต์…˜์ด ์•„๋‹Œ๊ฐ€์š”? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด "ํ•ด๊ฒฐ ๋œ"ํ…์ŠคํŠธ ๋…ธ๋“œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค ...

@spicyj ๋Œ“๊ธ€์„ ์ˆ˜์ •ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@isiahmeadows ๊ฐ€ ๊ทธ์˜ ์˜ˆ์—์„œ ์ œ๊ธฐํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด: ์ƒˆ๋กœ์šด Mithril ์—”์ง„์€ @isiahmeadows ๊ฐ€ ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋กœ ์ œ์•ˆํ•œ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๋”ฐ๋ฅด์ง€ _์•Š์Šต๋‹ˆ๋‹ค_:

  • ์ด๋Ÿฌํ•œ ์˜๋ฏธ๋ก ์„ ๊ตฌํ˜„ํ•˜๋ฉด diffing์ด _์ƒ๋‹นํžˆ_ ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.
  • ํ‚ค ๊ณต๊ฐ„์ด ๊ตฌ์„ฑ ์š”์†Œ์—์„œ, ์‹ฌ์ง€์–ด ํ˜•์ œ ๋ฐ ํ•˜์œ„ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ํ˜๋Ÿฌ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ‚ค ๋ฐ ํ‚ค ๊ด€๋ จ ๋ฒ„๊ทธ์— ๋Œ€ํ•ด ์ถ”๋ก ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  • ์กฐ๊ฐ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ์ง๊ด€์ ์ด์ง€ ์•Š๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค(์˜ˆ: ์ด ์˜ˆ์—์„œ B.bar ๊ฐ€ ์ œ๊ฑฐ๋˜์ง€๋งŒ ์กฐ๊ฐ๋„ ์ œ๊ฑฐ๋˜๊ณ  C๋ฅผ ๋ž˜ํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ ์กฐ๊ฐ์ด ์ƒ์„ฑ๋จ). ์ด๋Š” ์ˆ˜๋ช… ์ฃผ๊ธฐ๊ฐ€ "๊ณ„๋‹จ์‹"์ด๋ผ๋Š” ์ผ๋ฐ˜ ์›์น™์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ฃผ์–ด์ง„ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋Š”์ง€ ๋” ์ด์ƒ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด์ „ ์š”์ ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ์บก์Šํ™” ๊ธฐ๋Šฅ์— ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ€์„ค์ ์œผ๋กœ, ์ด๋Ÿฌํ•œ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์ค€์ˆ˜ํ•˜์ง€ ์•Š๋Š” diff ์—”์ง„๊ณผ ๊ด€๋ จ๋œ diff ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณต๊ฐ„ ์†”๋ฃจ์…˜์€ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋…ธ๋“œ ์ฃผ์œ„์— ์กฐ๊ฐ์„ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ๋งŒํผ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ํŒ€์ด ๋งจ ์œ„์— ์žˆ๋Š” ๋ฉ”๋ชจ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. _์ด์œ ๋Š” ํ˜„์žฌ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. 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)๋ฅผ ๋ž˜ํ•‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ–‰ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์ถ”๊ฐ€ HTML ํƒœ๊ทธ๋กœ ๋ž˜ํ•‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(HTML5 ํ‘œ์ค€์—์„œ๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ - tbody์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋‹จ์ผ tbody๋กœ ๊ฒฐํ•ฉํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ํ•˜์œ„ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์—ฌ๋Ÿฌ ํ–‰์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ). @Prinzhorn ์ด ์–ธ๊ธ‰ํ•œ ๊ธฐ์ˆ (์ด ์ž์‹๋“ค์„ HTML ์ฃผ์„์œผ๋กœ ๋ž˜ํ•‘)์ด ์‹ค์ œ๋กœ ๋ˆ„๊ตฐ๊ฐ€์— ์˜ํ•ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๊นŒ? HTML ์ฃผ์„๋งŒ ๋ Œ๋”๋งํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ, ์šฐ๋ฆฌ๊ฐ€ ์ž‘์—… ์ค‘์ธ ์žฌ์ž‘์„ฑ(#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]์— ์•„์ฃผ ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ์œผ๋กœ์„œ. ๋‚˜๋Š” ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :

  1. ํ‚ค๋Š” ์œ ์‚ฌํ•œ ํ˜•์ œ ๊ฐ„์— ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ dom ๋ฐ state ์—…๋ฐ์ดํŠธ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  2. ํ‚ค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์ ํ™”๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์‹ค์ œ๋กœ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค.

[1] https://github.com/leeoniya/domvm

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์„œ ๋ช…ํ™•ํ•œ ๋ฌธ์ œ( @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

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰