ç§ãã¡ã¯ãããåé¡ã§ããããšãç¥ã£ãŠãããã©ã®ãããªåé¡ã解決ã§ããããæ£ç¢ºã«ç¥ã£ãŠããŸãã ãããå¿
èŠã§ãããçŸåšã®ã¢ãŒããã¯ãã£ã§ã¯_é£ããåé¡_ã§ãã ãã®æ©èœãžã®èŠæãè¡šãè¿œå ã®ã³ã¡ã³ãã¯åœ¹ã«ç«ã¡ãŸããã åé¡ã賌èªããŠãã ããïŒå³åŽã®åã«ãã¿ã³ããããŸãïŒãããã£ã¹ã«ãã·ã§ã³ã«ä»å 䟡å€ãä»ããŠããå Žåãé€ããŠãã³ã¡ã³ãããªãã§ãã ããã ãç§ãããšã+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ãå®è¡ããŠããŸã
ããã¯å¯ŸåŠãããŠããŸããïŒ ããã¯äœåãªãã®ãè¿œå ããŸãããããŠåã³-IMO-ç¡æå³ã§ç¡æå³ãªhtmlãããŒãžã«è¿œå ããŸããããã¯äœã害ãäžããŸããã-ä¹±éã§å°éçã§ã¯ãªãããã«èŠããŸãã ãã¶ãç§ã¯äœãééã£ãããšãããŠããã ãã§ããããç§ããããªãç§ã«æããŠãã ããã
ããªããã©ãããŒã眮ããªããšããããã¯ããã«è±ç³ããã®ã§ïŒ
return React.DOM.div(...)React.DOM.div(...)
ããã¯æ§æçã«æå³ããããŸããã èŠèŠçãªãããã³ã°ãå¿ èŠãªå Žåã¯ã jsxã³ã³ãã€ã©ããŒãžã圹ç«ã€å ŽåããããŸãã
ããã¯èšã£ãŠãã代ããã«ããã[div, div]
ã«è±ç³ããããšã¯å¯èœã§ãã ããã¯é£ãããããç©è°ãéžããã®ã§ãããè¿ãå°æ¥å®è£
ãããããšã¯ãããŸããã
ïŒç¹ã«ç©è°ãéžããšã¯æããŸããããã³ãŒããè€éã«ãªãããŸã å®è¡ãããŠããŸãããïŒ
IIRC@ syranideã¯ããã«ã€ããŠããã€ãã³ã¡ã³ãããŠããŸã
@chenglouHehe ã
å°ãåã«ãã§ã³ããŠãšç°¡åãªãã£ãããããŸããããä»ã¯ã©ã¡ãã«ãåŸããŠããŸããã è€åã³ã³ããŒãã³ããè€æ°ã®ã³ã³ããŒãã³ããè¿ãããšãèš±å¯ããããšã«ã¯å€ãã®é ããå±éºããããå€ãã®çŽæçãªä»®å®ãç ŽããŸãããããããæããã«æ©æµãåããïŒçŸæç¹ã§ã¯ïŒåªãããŠãŒã¹ã±ãŒã¹ã¯ããããŸããã
æ倧ã§1ã€ã®ã³ã³ããŒãã³ããè¿ããšããåçŽãã¯ã衚瀺ãããå
容ã«ã€ããŠæšè«ããã®ãéåžžã«ç°¡åã§ããããšãæå³ããŸããããã§ãªãå Žåã <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>
ã³ã³ããŒãã³ãããããã³ã°ããŸããããã¯é
åã«å€æãããŸãïŒãªãŒããŒããŒããããReact.render
ïŒ...ãããã³ã°ãé¿ãããå Žåã¯ã return <NoopComp>...</NoopComp>.props.children
ãå®è¡ããããšãã§ããŸãã
ç·šéïŒç§ã®æªããç§ã¯React.render
React.createElement
ããªãŒããŒããŒãããŸããã
ã¢ã¬ã€ã®åé¡ã¯ãããããç§ãã¡ã®ãã¶ã€ããŒãã€ãŸããããããšã§ãã ã«ã³ããæ瀺çãªããŒãå¿ èŠã§ãã
@gaearonãããä»ã®ãšããç§ã®2ã€ã®åé¿çã®ããããã䜿çšããŠã³ã³ããåé¿ã§ããŸãïŒã©ã¡ããã蚱容ã§ããå ŽåïŒ...ããããæ瀺çãªããŒã§äœãæå³ããã®ã§ããããïŒ
é
åæ§æã䜿çšããå Žåã¯ãåèŠçŽ ã«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ã ããããä»ã®ãšããåé¿ã§ããå®è£ ãé£ããããŸãã§ããããšãç解ã§ããŸãã
ç§ã¯ïŒãŸã ïŒreact internalsã«ã€ããŠã¯äœãç¥ããŸãããã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ãšç«¶åããªãããã«ãã¹ããããreactidãå«ãïŒã ç§ã¯ãä»ã®ãã¬ãŒã ã¯ãŒã¯ããããã®çš®é¡ã®ã»ãã³ãã£ãã¯ãžã§ãã«å¯ŸããŠã³ã¡ã³ããã誀çšãããã®ãèŠãŠããŸããã
@PrinzhornDOMåºåãšReactã®JSXãæ··åããŠããã®ã§ã¯ãªãããšæããŸãã
圹ã«ç«ã€å ŽåïŒ @PrinzhornãHTMLã³ã¡ã³ãã䜿çšããŠããã©ã°ã¡ã³ãã³ã³ããŒãã³ãããDOMã«ããããããšããææ¡ã¯ãKnockoutã䜿çšããã®ãšåãã¢ãããŒãã§ãã ããã¯ã¢ãŠãã¯ãããããä»®æ³èŠçŽ ããšåŒã³ãŸãã
<!-- ko component: "message-editor" -->
<!-- /ko -->
ïŒããã¯ã¢ãŠãããã¥ã¡ã³ãããïŒ
ãŸããããã®å¥ã®äœ¿çšäŸ-ãã¬ãã¯ã¹ããã¯ã¹ã䜿çšããå Žåãäœåãªã©ããã³ã°èŠçŽ ãåé¡ã«ãªãå¯èœæ§ããããŸãã
@aldendanielsã¯çµ¶å¯Ÿã«åæããŸããç§ã¯ãã§ã«ãã¬ãã¯ã¹ããã¯ã¹ã®åé¡ã«ééããŸããã
ããããããŠã³ãäŸåãããã¬ãã¯ã¹ããã¯ã¹ã§ããã«ééããŸããã Aãæåã®ããããããŠã³ãã¬ã³ããªã³ã°ããŠç®¡çãã次ã«Aã®ããããããŠã³ã®å€ã«å¿ããŠBãCããŸãã¯Dãç¶ãããããããé©åãªæ°ã®ããããããŠã³ãã¬ã³ããªã³ã°ããŸãã
<A>
<Drop />
<C><Drop /><Drop /></C>
</A>
AãBãCãããã³Dã¯ã¹ããŒãã¬ã¹ã§ããããã 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>
)
...
ãŸããããã€ãã®ãã¬ãã¯ã¹ããã¯ã¹ã®åé¡ã«ééããŸããã CSSã§è§£æ±ºã§ããªãããšã¯ãããŸãããããã¬ãã¯ã¹ããã¯ã¹ã®ãçŸãããã®1ã€ã¯ãã¬ã€ã¢ãŠããæ©èœãããããã«å¿ èŠãªãã©ãããŒãèŠçŽ ãå°ãªããŠæžãããšã§ããã³ã³ãããæã€ããšãçã«ããªã£ãŠããå Žåãé€ããŠãè¿ããã®ã¯ãã¹ãŠdiv/divãªã©ã§ã©ããããŸãã
ããã«ç€ºããã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ã«ã€ããŠã <BunchOfComponents />
ã{getBunchOfComponents()}
ã«çœ®ãæããããšãã§ããã³ã³ããŒãã³ãã®äœ¿çšã«é¢é£ããå®çšçããã³æè¡çãªåé¡ãå°å
¥ããããšãªããèŠèŠçãªåºåã¯åãã«ãªããšç¢ºä¿¡ããŠããŸããã«ãŒããšããŠã®ãã©ã°ã¡ã³ãã
@syranideã§ãããã³ã³ããŒãã³ãã®1ã€ãå€æŽããããã³ã«ããã¹ãŠã®å åŒãåèšç®ããå¿ èŠããããŸã...
ãŸãããã¬ãŒã³ãªã³ãŒããŒã¹ã¯ãªããã䜿çšãããšãé
åãç°¡åã«è¿ãããšãã§ãããããjsxè¡šçŸããæ©èœãåãé¢ããŠãã ããã
è¿ãããèŠçŽ ã®é
åãåŠçããã®ãç°¡åãªå Žåã¯ãjsxãè¿œãã€ãã®ãåŸ
ããªãã§ãã ããã
@syranideã§ãããã³ã³ããŒãã³ãã®1ã€ãå€æŽããããã³ã«ããã¹ãŠã®å åŒãåèšç®ããå¿ èŠããããŸã...
@wmertensã¯ãããã ãã芪ãä»ã®çç±ã§åã¬ã³ããªã³ã°ããå¿ èŠãããããããŸãã¯åã«å°éå ·ãä»ããŠããŒã¿ãåä¿¡ããããããšã«ããå€ãã®å ŽåããããããŸãã ã¯ããããã¯éãã§ãããããã¯ãã®ã¢ãããŒããæ£ããããšãæå³ãããã®ã§ã¯ãããŸãããããã¯æé©åã§ãããããããéæããããã®å€ãã®æ¹æ³ããããŸãã
ãŸãããã¬ãŒã³ãªã³ãŒããŒã¹ã¯ãªããã䜿çšãããšãé åãç°¡åã«è¿ãããšãã§ãããããjsxè¡šçŸããæ©èœãåãé¢ããŠãã ããã
ããã¯é¢ä¿ãããŸãããããã¯JSXã®åé¡ã§ã¯ãããŸããã 倧ããªåé¡ã¯ã1ã€ã®ã³ã³ããŒãã³ã=1ã€ã®èŠçŽ /ããŒããšããæè¡çã§å®çšçãã€çŽæçãªä»®å®ã倱ãããšã§ãã ç§ã¯éçºè ã®ããã«è©±ãããšã¯ã§ããŸãããããããåãã§è«ŠããŸãããããã¯éåžžã«æçšãªä»®å®ã§ãã æé©åã人ã ããããæãå¯äžã®çç±ã§ããå Žåãèšèšã§ããåçã«åªããããŸãã¯ããè¯ãæé©åããããšç¢ºä¿¡ããŠããŸãã
@syranideæ倧ã®åé¡ã¯ãåžžã«ã©ããã³ã°ã䜿çšã§ãããšã¯éããªãããšã§ã
ããŒãã«ããªã¹ãããã¬ãã¯ã¹ããã¯ã¹ãããããªã©ã®htmlã®èŠçŽ ...åé¿ç
ããã¯éãã³ãŒãã«ã€ãªãããŸãã
ã¬ã³ããªã³ã°ããã ãã®ä»®æ³ã©ãããŒèŠçŽ ã«å®å
šã«æºè¶³ããŸã
åã«ææ¡ããããã«ãã³ã¡ã³ãã
2015幎5æ29æ¥éææ¥ãååŸ3æ56åAndreas [email protected]
æžããŸããïŒ
@syranide https://github.com/syranideã§ãããæ¯å
ã³ã³ããŒãã³ãã¯ããã¹ãŠã®å åŒãå€æŽããåèšç®ããå¿ èŠããããŸã...@wmertens https://github.com/wmertensã¯ããã§ãäœåºŠãããããŸã
芪ãä»ã®ããã«åã¬ã³ããªã³ã°ããå¿ èŠãããã®ã§ããšã«ãããããæã£ãŠããŸã
çç±ããŸãã¯åã«å°éå ·ãä»ããŠããŒã¿ãåãåãããã ã ã
ã¯ããããã¯éãã§ãããããã¯ãã®ã¢ãããŒããæ£ãããšããæå³ã§ã¯ãããŸããã
ããã¯æé©åã§ãããããããéæããããã®å€ãã®æ¹æ³ããããŸãããŸãããã¬ãŒã³ãªã³ãŒããŒã¹ã¯ãªããã䜿çšãããšãé åãç°¡åã«è¿ãããšãã§ããã®ã§ãã©ãã
æ©èœãjsxè¡šçŸããåãé¢ããŸããããã¯é¢ä¿ãããŸãããããã¯JSXã®åé¡ã§ã¯ãããŸããã 倧ããªåé¡ã¯ããã§ã
_oneã®æè¡çãå®çšçãçŽæçãªä»®å®ã倱ããŸã
ã³ã³ããŒãã³ã=1ã€ã®èŠçŽ /ããŒã_ã ç§ã¯éçºè ã®ããã«è©±ãããšã¯ã§ããŸããããç§ã¯ããŸãã
åãã§ãããããããããããã¯æã£ãŠããããšã¯éåžžã«æçšãªä»®å®ã§ãã ç§ã¯ç¢ºä¿¡ããŠããŸã
次ã®å Žåã«èšèšã§ãããåçãŸãã¯ãã以äžã®æé©åããããŸãã
æé©åã¯äººã ããããæãå¯äžã®çç±ã§ããâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/facebook/react/issues/2127#issuecomment-106810565 ã
fwiwãReactã«ãã£ãŠåã®é åãšããŠæ±ãããReactã«ããã©ã°ã¡ã³ããã³ã³ããŒãã³ãããããã³ã°ããã®ã¯æ¯èŒçç°¡åã§ãã ããŒã¯èªåçæãããŸãããã³ã³ããŒãã³ãã®åææ€èšŒåŸã«çºçãããããéåžžã®ãããŒãæäŸãããŠããŸããããšãããšã©ãŒã¯ã¹ããŒãããŸããã
ããã¯èšã£ãŠãããã®ããã¯ã¯@gaearonãäžã§è©±ããŠããããšã解決ããã ãã§ãããJSXã§éãé åæ§æãåŠçããããä»»æã®ããŒãèšå®ãããããå¿ èŠã¯ãªããã³ã³ããŒãã³ãã®renderã¡ãœããã®ã«ãŒãã§è€æ°ã®ããŒããè¿ãåé¡ã¯è§£æ±ºããŸããã
ã³ã³ããŒãã³ãã1ã€ã®ãèŠçŽ /ããŒãããè¿ãå¿ èŠããããšããèãã«åé¡ããããŸãã ç§ã«ã¯ã次ã®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(...)
ã¯ãïŒä»ã®å¿
èŠãªãµããŒãæ©èœãå«ããŠïŒããããé¢ã§åªãããœãªã¥ãŒã·ã§ã³ã§ãã
ã³ã³ããŒãã³ãã1ã€ã®ãèŠçŽ /ããŒãããè¿ãå¿ èŠããããšããèãã«åé¡ããããŸãã ç§ã«ã¯ã次ã®JSXæ§é ã«ã¯å®å šã«åççã§ããããã«æãããŸãã
ã³ã³ããŒãã³ãã¯åãªãåãªãã©ãããŒã§ã¯ãªããç®çããããŸãã ç§èŠã§ã¯ãè€æ°ã®èŠçŽ ãè¿ããšãããã€ãã®éåžžã«æçšãªæåŸ
ã劚ããããããã§ãã ããšãã°ã React.render
ã¯å°æ¥ãèŠçŽ ãã¬ã³ããªã³ã°ããŠããŒããè¿ãã³ã³ãããªã³ãååŸããŸããããã«ããã代ããã«ããŒãã®é
åãçæããå¿
èŠããããŸãã
ããããéåžžã«éèŠãªåé¡ã¯ãIMHOãReactã®æ倧ã®ã»ãŒã«ã¹ãã€ã³ãã§ããèªã¿ãããã®åé¡ã ãšæããŸãããã¹ãŠãæ確ã§ãã
<table>
<tr>
<td />
<td />
<td />
</tr>
<tr>
<Columns1 />
<Columns2 />
</tr>
</table>
ãããèŠãŠæå³ããããŸããã3çªç®ã®ã»ã«ã¯ã©ãããæ¥ãŠããŸããïŒ ããããããã¯å®éã«ã¯ééã£ãŠããŠã2ã€ãŸãã¯4ã€ã®ã»ã«ãã¬ã³ããªã³ã°ããŠããã®ã ããããããããããã¯å®éã«ã¯åçã§ãããæ¯æ±ãŸãã¯å€éšç¶æ
ã«äŸåããŠããã®ã ãããïŒ ãã®åé¡ã«ã¯å€ãã®ããªãšãŒã·ã§ã³ããããæ瀺çãªæåŸ
ãæã£ãŠããå¯èœæ§ã®ããä»ã®éHTMLDOMããã³ããšã³ããæ€èšããå Žåã«ã®ã¿åä»ã«ãªããŸãã èæ
®ãã¹ããã1ã€ã®ç¹ã¯ãèŠçŽ ãäžéæã§ããããã <tr />
ã<MyMagicalTr />
ã«çœ®ãæãããšãåã
ã®ã»ã«ãšçžäºäœçšããããã»ã«ã®æ°ãæšæž¬ãããããããšãã§ããªããªã<MyMagicalTr />
ã <MyMagicalTd />
ã®ã¿ãåãå
¥ããå¯èœæ§ããããå®éã«ããããšå¯Ÿè©±ã§ãããšããä¿èšŒã¯ãããŸããã
ããã«ã¯ãReactã®æ ¹æ¬çãªå®è£ ã®åé¡ã®ããã«ãéçºè ãåé¢ãããåå©çšå¯èœãªã³ã³ããŒãã³ãã®äœæã«åŠ¥åããå¿ èŠããããŸãã ç§ã¯ãããåãå ¥ããããã¹ãã§ã¯ãªããšæããŸãã
ãããã«ã¯ãéçºè ãåé¢ããããšã«ã€ããŠåŠ¥åããå¿ èŠããããŸã...ãããããç§ã«èšãããã°ãããã¯ãŸãã«åé¡ã§ããã³ã³ããŒãã³ããè€æ°ã®èŠçŽ ãè¿ãããšãã§ããå Žåãããã¯ãã¯ãåé¢ãããŠãããã眮ãæããããã³ã³ããŒãã³ãã¯èŠªã«ãªãŒã¯ããŠããŸãã
ãã³ããŒãéã æ ¹æ¬çãªå®è£ ã®åé¡ã§ãããšããããšã¯ããããå®éã«è¡ãã¹ããã©ãããšã¯å¥ã®åé¡ã§ãã ããã¯ç§ã®æ±ºå®ã§ã¯ãããŸããããããã«äŒŽããã¬ãŒããªããä»ã®ä»£æ¿ãœãªã¥ãŒã·ã§ã³ãèæ ®ããã«ã1ã€ã®ãŸããªãŠãŒã¹ã±ãŒã¹ãã©ã®ããã«èª¬åŸåã®ããè°è«ã§ãããã¯ããããŸããã
ç§èŠç§ã¯{getBunchOfComponents()}
ã®åé¡ãèŠãŠããŸãããããã¯æçœã§ããããã¯ç§ãã¡ãç§ãã¡ã®æçšãªæåŸ
ãä¿ã€ããšãå¯èœã«ããŸãã ããã©ãŒãã³ã¹ãåé¡ã«ãªãå Žåã¯ã React.createSmartFragment()
ïŒãŸãã¯w / eïŒã䜿çšãããšãééçãªé
å/ãªããžã§ã¯ãã®ãããªåã«ãªããŸããã芪ããç¬ç«ããŠæŽæ°ã§ããŸãã
ç¹°ãè¿ãã«ãªããŸãããReactéçºè ã¯ïŒç§ã§ã¯ãªãïŒæš©åšã§ãããããŸããŸãªå¯äœçšãèæ ®ãããšãããã§ã¯èª¬åŸåã®ããè°è«ã¯èŠãããŸããã ããšãããããµããŒããããŠãããšããŠããæ瀺ããããœãªã¥ãŒã·ã§ã³ãè¯ããã¿ãŒã³ã§ããããšã«åæãããã©ããããããããŸããã
ç·šéïŒæ確ã«ããããã«ãããããä»ã®æããã«æçãªãŠãŒã¹ã±ãŒã¹ããããããã³ã³ããŒãã³ãã¯å°æ¥çã«è€æ°ã®èŠçŽ ãè¿ãããšãã§ãããããããŸãããç¹ã«åäŸãééããã³ã³ããã¹ãïŒ@thomasboytã瀺ããã®ãªã©ïŒã§ã¯ãèªã¿ããããç¶æãããŸãã
ãã®äŒè©±ã®å²åŠçãªåŽé¢ã«å¯Ÿå¿ããåã«ãããå°ãã³ãŒããŒãå¿ èŠã ãšæããŸãïŒ@syranideã®éåžžã«è¯ãç¹ã«æè¬ããŸãïŒããå®è£ ã®åŽé¢ã§ã¯ããã®æšå€ãã©ã®ããã«ãã®ã¹ã³ãŒãã®å®è¡å¯èœãªå€æŽã¯ããã®ã¹ãã€ã¯ã«ã€ãªãããŸãïŒ 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ã«ãããŸããããã¯ã1ã€ã®ãããŒãããçªç¶ä»»æã®æ°ã®ããŒãã«ãªãå¯èœæ§ãããå Žåã¯æ©èœããŸãããããã¯ã芪ãåŒã³åºããã«çºçããå¯èœæ§ããããŸããããã€ãã®ã³ã³ããŒãã³ãã®æ·±ãïŒã©ããã³ã°ïŒã ç§ãééã£ãŠããªããã°ãæ°ãå€ãããªãéããReactã«è€æ°ã®ã«ãŒãèŠçŽ ããµããŒããããã®ã¯éåžžã«ç°¡åã§ãã
ãããã£ãŠãReactã§æ©èœãããããšã¯ç¹ã«é£ãããšã¯æããŸããããçã«é©åãªãœãªã¥ãŒã·ã§ã³ã¯ããåé¡ããããããããmountIndex
ãåé€ããå¿
èŠããããŸãã
@syranideããã§ãã ç§ãåãçµãã§ãããœãªã¥ãŒã·ã§ã³ã¯ãå®éã«ã¯ããŒãã®ãå®éã®ãªãã»ãããã§ãããšæãããæ°ããnodeIndex
ãå°å
¥ããŸãïŒããã¯ãæ»ã£ãŠmountIndex
ãåé€ããå¿
èŠãããããšãæãåºãããŸããç§ã®ãã©ã³ãã§ã¯çŸåšäœ¿çšãããŠããªããšæããŸãïŒã
ãã ãããåç¥ã®ããã«ãã«ãŒãèŠçŽ ã®æ°ãå€æŽãããå Žåãåã®å
åŒã³ã³ããŒãã³ãã®ããŒãæ°ãå€æŽããããã³ã«ã³ã³ããŒãã³ãã®nodeIndex
ãæŽæ°ããå¿
èŠããããããããã¯åé¡ããããŸãã ããã§ããã®è§£æ±ºçãèŠã€ããå¿
èŠããããŸãã
ãŸãããã¬ãã¯ã¹ããã¯ã¹ã®åé¡ãçºçããŸããã @syranideã¯ããgetBunchOfComponentsãã§ææ¡ããããœãªã¥ãŒã·ã§ã³ã«ã€ããŠããå°ã詳ãã説æããŠããã ããŸããïŒ ReactãåããŠäœ¿çšããå Žåããã®é¢æ°ãã©ãã§å®çŸ©ãããããŸãã¯ã©ã®ããã«é©çšããããå®å šã«ç解ããããšã¯å°é£ã§ãã
@landabaso
function getBunchOfComponents(...) {
return [<ColumnA key="a" />, <ColumnB key="b" />];
}
ããã
ã¹ã¬ããå šäœãèªãã ããã§ã¯ãããŸãããããã®æ©èœãå¿ èŠã«ãªãå¯èœæ§ã®ããã¬ã³ããªã³ã°æé©åã®ãŠãŒã¹ã±ãŒã¹ã¯æ¬¡ã®ãšããã§ãã
ãã®æ©èœããªãªãŒã¹ãããå ŽåãReactCSSTransitionGroupã¯ã©ãããŒããŒããå¿ èŠãšããªããªããŸããïŒ
@slorberã¯ããããã¯ããããæ¬åœã§ãã
ãã®æ©èœã®å¿ èŠæ§ã«æ¯æ¥ééããŸãã
å°ããªã³ã³ããŒãã³ããããããããå ŽåïŒã€ãŸããéåžžã«ã¢ãžã¥ãŒã«åŒã«èšèšãããŠããå ŽåïŒããã¹ãŠã®çš®é¡ã®ãã®ãdivã§ã©ããããå¿ èŠããããŸãã æ··ä¹±ããŠãããããããŸããããããã¯ãã®åé¡ã«é¢é£ããŠãããšæããŸãã
<div>
ã®å Žåããããã<div>
ã§ã©ããã§ããŸãããããŒãã«è¡ã®<tr>
èŠçŽ ã®å Žåãããã»ã©ç°¡åã§ã¯ãããŸããã <tr>
ã<tbody>
ã§ã©ããããããšã¯ã§ããŸããã <tbody>
ã®è€æ°ã®ã¬ã€ã€ãŒã<tr>
ã®è€æ°ã®ã¬ã€ã€ãŒã§ã©ããããããšã¯æãŸãããªãå ŽåããããŸãã
ç§ãåŒã³ãããã·ããªãªã¯ã <head>
ã¬ã³ãã©ãŒã«ãªãããšãªãã <link>
$èŠçŽ ãš<script>
èŠçŽ ãæäŸããã³ã³ããŒãã³ããäœæããããšãããã®ã§ãã
ãã®å·ã®åé ã«ã¡ã¢ãè¿œå ããŸããã ã³ã¡ã³ãããåã«èªãã§ãã ããã https://github.com/facebook/react/issues/2127#issue -41668009
ãã³ã...ãµãŒããŒåŽã§å€§ããªããŒãºããããŸãã <head>
ã»ã¯ã·ã§ã³ãããããããã©ã°ã¡ã³ããã¬ã³ããªã³ã°ããæ©èœãªãã§å®å
šãªWebããŒãžïŒdoctypeãé€ãïŒãã¬ã³ããªã³ã°ããããšã¯éåžžã«è€éã§ãã ç§ã¯çŸåšãããã¯ã¹ã€ã³ãšæçµã¬ã³ããªã³ã°ã®å°ããªããžãã¯ãä»ããŠãããåé¿ããŠããŸãããè€æ°ã®ã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ããµããŒããããŠããã°ãã¯ããã«ç°¡åã«ãªããŸãã
@impinballã¯ããããã®åé¡ã解決ããããã«ã react-side-effectã«åºã¥ããŠreact-document-titleã«äŒŒããã®ãæžã蟌ãããšããããšãã§ããŸãã ã¡ã¿ã¿ã°ãããããŒãã¿ã€ãã«ãå Žåã«ãã£ãŠã¯ãªãã€ã¬ã¯ãã«ã€ããŠãåãããšãã§ããŸãã
ç§ããã®åé¡ã«çŽé¢ããŠããŸãããåœé¢ã®åé¿çã¯ãããŸããïŒ {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ãé£æ¥ããŠããããšã«ã€ããŠäžå¹³ãèšã£ãŠããŸããããšã«ããã¡ã€ã³ã©ãããŒå ã«ããããšã«ãªããŸãã ããã¯ç§ãåãé€ãããšãã§ããã°ããã®ã«1ã€ã®ã©ãããŒèŠçŽ ã§ãã
ãã®å Žåã @ 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ãæ»ãå€ãšããŠé åãèš±å¯ããŠããå Žåã¯ãè¿œå ã®ããã©ã°ã¡ã³ãAPIãã¯å¿ èŠãªãããã§ãã JSXã¯ãè€æ°ã®ã«ãŒãèŠçŽ ãé åã«å€æã§ããŸããããã¯ãä»ã®é¢æ°ã®æ»ãå€ã«å¯ŸããŠãæ©èœããŸãã ãããã£ãŠãããã¥ã¡ã³ããšåŠç¿ãå¿ èŠãšããè¿œå ã®APIãµãŒãã§ã¹ãå°å ¥ãã代ããã«ãReactã®å¶éã®1ã€ãåãé€ãããšãã§ããŸãã
ããã¯ãå°ãªããšã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ã§äœ¿çšãããŠãããã®ã§ãã
ãããŸã§ã®ã¹ã¬ããã§ããã«ã€ããŠèšåãããããšã¯ãããŸããããããã解決ããããšã§æ§ææ§ãåäžãããšæããŸãã ããšãã°ãã»ã«ãç¹å®ã®é åºã§ãã§ãŒãããããã°ãªããããããšããŸãã çæ³çã«ã¯ãããã§2ã€ã®ã³ã³ããŒãã³ãã䜿çšãããŸãã1ã€ã¯ã¬ã€ã¢ãŠããåŠçãããã1ã€ã¯ã¢ãã¡ãŒã·ã§ã³ãåŠçããŸãã 次ã®ãããª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#
次ã«ãã€ã³ã¹ã¿ã³ã¹åãããè€æ°ã®ReactèŠçŽ ãããŠã³ãããŸãïŒ https ïŒ//github.com/facebook/react/blob/master/src/renderers/shared/reconciler/ReactCompositeComponent.js#L471
ãããŠãé©åãªé åºã§çæããããã¹ãŠã®ããŒã¯ã¢ããã調æŽããŸãã
å解ããã»ã¹ãåé¿ããããªããšããæ¬ ç¹ããããšæããŸãã
ãã©ã°ã¡ã³ããèŠçŽ ãšããŠããŸãã¯ãã©ã°ã¡ã³ããå€æã®åšãã®ç ç³æ§æãšããŠäœ¿çšããŸããïŒ
èŠçŽ ãšããŠã®ãã©ã°ã¡ã³ãã¯å€§äžå€«ã ãšæããŸããããã¹ãããŒãã空ã®ããŒãã«äŒŒãæ°ããã¿ã€ãã®å éšããŒããäœæããå¿ èŠããããŸãããïŒ ã©ããã£ãŠç®¡çããã®ãããããŸãããã
ããšãã°ãã«ãŒãã®1ã€ãããŠã³ã解é€ãããå Žåãã©ã®ããã«åŠçããŸããïŒ æŽæ°ãé©åã«åŠçããã«ã¯ã©ãããã°ããã§ããïŒ
ãŸãã¯ãDevToolså
ã§è€æ°ã®ã«ãŒããã©ã®ããã«ç®¡çããŸããïŒ ïŒæçœãªçãïŒDevToolsãä¿®æ£ããŠãã ãã...ïŒ
ãã©ã°ã¡ã³ãã¯è€åã³ã³ããŒãã³ãã ãšæããŸãã éãã¯ã©ãã«ãããŸããïŒ
ãã©ã°ã¡ã³ããå®è£
ããããã«ã³ãŒããè€è£œããããšã«ãªã£ãå ŽåãReactã®å
éšããå
ã®ç¶æ
ãã«ä¿ã€ããã«ãsugaræ§æãå®è£
ããæ¹ãããã§ããããã
äžæè°ã«æã£ãŠããŸãããç§ã¯ãµãããªãŒã®è³ªåïŒrenderSubtreeIntoContainerïŒã®åšãã§Reactã®å éšãããã£ãŠããŸãããããã¯ããçšåºŠé¢é£ããŠããããã«æããŸãã æ°ãããµãããªãŒã«ã¬ã³ããªã³ã°ããå Žåãå®éã«ã¯æ°ããã«ãŒããã¬ã³ããªã³ã°ããå¿ èŠããããŸãã ãããã£ãŠãããªãŒã¬ãã«ã§è€æ°ã®ã«ãŒãããµããŒãããå Žåãæ¯åæ°ããã«ãŒããã¬ã³ããªã³ã°ããŸããïŒ
<p>Hi</p>
<p>There</p>
2ã€ã®ãæ°ããã«ãŒãã«ã¬ã³ããªã³ã°ãåŒã³åºããçºçããŸãã
ã©ãããŒã䜿çšããå Žåã1åã®åŒã³åºãã§ã¯ãªããããã§ããïŒ ããã©ãŒãã³ã¹ã¯ã©ãã§ããïŒ ã·ã³ãã«ïŒ æ£çŽãªãšãããç§ã®æ°æã¡ã¯ããã®ç¶æ³ã«å¯ŸåŠããããã«Reactã®å éšã«è§ŠããŠã¯ãããªããšããããšã§ãã ããããJSXã§ãã®åæ¥ãåŒãåºãããšãã§ããŸããïŒ JSXæ§æãæ¹åã§ããŸããïŒ
ïŒ_å 責äºé _ïŒç§ã¯å éšã®Reactã«å®å šã«æ £ããŠããããã§ã¯ãªããå®å šã«ç解ããŠããªãããŸãã¯ç解ããŠããªãéšåããããããããŸããã誀解ããè©«ã³ããŸããïŒ
ç·šéïŒç©äºã®ä¿®æ£/æ確åã ãŸããGitHubã¯äžæè°ãªããšã«ã¡ãŒã«ã®ã¹ã¿ã€ã«ãèšå®ããŠãããããã³ãŒããããã¯ãåãã©ãŒãããããå¿ èŠããããŸãã... :-(
ããã«ã¡ã¯ããã¹ãªã«ã®ã³ã¢ã³ã³ããªãã¥ãŒã¿ãŒ/ã³ããã¿ãŒã§ãã
TL; DRïŒAPIãšå
éšã
åçŽã
ã¡ãªã¿ã«ãç§ã¯çµéšãããå®è£
ããã®ã_éåžžã«_é£ããããšãç¥ã£ãŠããŸãã ãã
ãã¹ãªã«ã«ãäœåºŠããªã¯ãšã¹ããããŠããŸããã
ãŸã£ããã®é£ããã ãããå®è£
ãããã¹ãŠã®è©Šã¿ã¯ã§å€±æããŸãã
ãã¹ãã¹ã€ãŒãã®å°ãªããšã3åã®1ã倱æããŸãã
ç§ã¯ãŸã æžãããšãèšç»ããŠããvdomã©ã€ãã©ãªã®è©³çŽ°ãæ€èšããŠããŸãã
ãããŠããã¯ãã¹ãŠãæçãšããŠæ±ããŸãããããã¯ããªããæã£ãŠãããã®ã§ã
ã®ã¬ã³ããªã³ã°éšåãæåããæåéãïŒåïŒæžã蟌ãã Reactã®ããã«ã
DOMããåãé¢ãããŸãããAPIã¯å€§å¹
ã«ç°ãªããŸã
æŠå¿µçã«ã¯ã¬ã³ããªã³ã°çšã§ãã
ãã©ã°ã¡ã³ãã®èœãšãç©Žã¯æ¬¡ã®ãšããã§ãããã©ã°ã¡ã³ããå®å
šã«ç®¡çããå¿
èŠããããŸã
å
éšçã«ããŸãã¯é©åã«ããããæ¯èŒããŸããã å¹³
document.createContextualFragment
ã¯åœ¹ã«ç«ããªãã äŸãšããŠã
2ã€ã®ããªãŒãå€æããã¬ã³ããªã³ã°ãçç¥ããŸãã
// Before
A {}
fragment {
  B[class="foo"] {}
  B[class="bar"] {}
}
C {}
D {}
// After
A {}
B[class="foo"] {}
fragment {
  C {}
}
D {}
ãã®ããã®æ£ããå€æã¯ã B
èŠçŽ ãšC
èŠçŽ ã®äž¡æ¹ã眮ãæããæ®ãã¯ãã®ãŸãŸã«ããŠããå¿
èŠããããŸãã ãããç解ããããšã¯ç°¡åã§ã¯ãªããåºæ¬çã«ãã©ã°ã¡ã³ãã®åããã©ã°ã¡ã³ãå
ã«ãããšããäºå®ãç¡èŠããªããããã©ã°ã¡ã³ãã®åãå埩åŠçããå¿
èŠããããŸãã
ãããããã©ã°ã¡ã³ãããªããªã£ãããããã¯ã®ã»ãã³ãã£ã¯ã¹ãåŠçããå¿
èŠããããŸãã
shouldComponentUpdate
ïŒãã®ããã¯ã®Reactã®ååãèŠããŠããŸããïŒã ããã§
ããã§ãããã©ã°ã¡ã³ããåå¥ã«è¿œè·¡ããå¿
èŠããããŸãã ããªãã¯åœŒããæ¯èŒããŸã
芪ãã©ã°ã¡ã³ãã®äžéšã§ãããã®ããã«ã³ã³ãã³ãããããŸããããŸã
ã³ã³ããŒãã³ãã®ããã«ããã®ãã©ã°ã¡ã³ãã®äœçœ®ã远跡ããŸãã
èšãæããã°ãã³ã³ããŒãã³ãã¯ãã¯ãæ¬è³ªçã«ãããã«ãªã³ã¯ãããŠããŸãã
DOMããŒãã 代ããã«ã察å¿ãããã©ã°ã¡ã³ãã«ãªã³ã¯ãããŠããŸãã Reactã¯ãä»ã®ã»ãšãã©ã®vdomã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ãšåæ§ã«ãäºæ³ãããã¿ã€ãã§ãã£ãŠããæ¬è³ªçã«ã³ã³ããŒãã³ããããªãŒè¡šçŸã«çµåããŸãã ããã¯ãdiffã¢ã«ãŽãªãºã ãå®è£
ããæãç°¡åãªæ¹æ³ã§ãã
ã³ã³ããŒãã³ããåŠçããŸãã ããããåé¢ãããŠãããšããããªãã¯åé¢ããå¿
èŠããããŸã
äž¡æ¹ã®ç°¿èšã åæåãããšãã«ã³ã³ããŒãã³ããåæåããªã
ããŒãã ããã§ã2ã€ã®å®å
šã«å¥åã®ããã»ã¹ã«ãªããŸããã ããã®ã¯é£ãã
æåã¯ããã®åŸã®ãµããŒããè¿œå ããã®ã¯ããã«å°é£ã§ãã
èšèãããããšãã ããã¯é£ããããšã§ããããŸã ããããšãªã¹ãã«èŒã£ãŠããŸãã ïŒç±å¿ã«è³ªåããŠãã@ janryWangãæ©ãå®çŸããããšã¯ãããŸãããïŒ
@isiahmeadowsåèãŸã§ã«ãMithrilã®æžãæããã©ã³ãã¯ãã©ã°ã¡ã³ãããµããŒãããŠããŸãã
@spicyjãŸã ãã©ããŒããŠããªãå Žåã¯ãå®è£ [1] [2]ãšãã¹ã[1] [2]ãã芧ãã ããã å šäœã®diffãšã³ãžã³ã¯çŽ400LOCãããªãã®ã§ãç°¡åã«ãã©ããŒã§ããã¯ãã§ãã
@isiahmeadowsGitHubãããªãã®ã³ã¡ã³ãã®äžéšãé£ã¹ââããšæããŸãã ã³ãŒããããã¯ãå£ããŠããã <D />
ã®æåã®ã€ã³ã¹ã¿ã³ã¹ãæž¡ãããããšãããããŸããã
ããããé»åã¡ãŒã«ã§ã¯åé¡ãªãããã«èŠããŸãã ãã¶ãããªãã¯GitHubã«ãã°ãèŠã€ããŸãããïŒ
æ®å¿µãªãããGitHubã®ããŒã¯ããŠã³åŠçã¯ãã³ã¡ã³ããé»åã¡ãŒã«ããéä¿¡ãããå Žåã®åäœãç°ãªããŸãã ã³ã¡ã³ããç·šéããŠç©ºçœè¡ãåé€ããŸãããã衚瀺ãããŸãã
å ã®ã¡ãŒã«ãsupport@githubã«è»¢éããŸããã ããŸãããã°ã圌ãã¯ããŒãµãŒãä¿®æ£ããããšãã§ããŸãã ð
@lhorieãã©ã°ã¡ã³ãã«é
åæ§æã䜿çšããŸããïŒ
DocumentFragmentã®ããªãã£ã«ã¯ãããŸããïŒ
ãããŠãHTMLã³ã¡ã³ãã®ãããªãç䌌ãã©ãããŒèŠçŽ ã䜿çšããããšã¯ãªãã·ã§ã³ã§ã¯ãããŸãããïŒ ãããããã¹ãããŒããã解決ãããæ¹æ³ã ãšæããŸãã...
ãã®ã³ã¡ã³ããä¿®æ£ããŠãããŠããããšã@spicyj
@isiahmeadowsã圌ã®äŸã§æèµ·ããæžå¿µã«å¯ŸåŠããããã«ãæ°ããMithrilãšã³ãžã³ã¯ãããã€ãã®çç±ã§@isiahmeadowsãææ¡ããã»ãã³ãã£ã¯ã¹ã«ãåŸããªããã
B.bar
ãåé€ãããŸããããã©ã°ã¡ã³ããåé€ãããCãã©ããããããã«æ°ãããã©ã°ã¡ã³ããäœæãããŸãïŒã ããã¯ãã©ã€ããµã€ã¯ã«ããã«ã¹ã±ãŒããã§ãããšããäžè¬ååã«éåããŸããã€ãŸããç¹å®ã®èŠªããŒããåé€ãããå ŽåãåããŒããåé€ãããããšã確èªã§ããªããªããŸãã åã®ãã€ã³ããšåæ§ã«ãããã¯ã³ã³ããŒãã³ãã®ã«ãã»ã«åæ©èœã«ãªãŒã¯ãåŒãèµ·ããå¯èœæ§ããããŸããã³ã¢ããŒã ãäžéšã®ã¡ã¢ãæ¡åŒµã§ãããã©ããèå³ããããŸããçŸåšã®ã¢ãŒããã¯ãã£ã§ã¯ãããé£ããçç±ã§ãã ReactãšMithrilã®ã¬ã³ããªã³ã°ãšã³ãžã³ãåºæ¬çã«åãåé¡ã解決ããããšããŠããããšããããŠMithrilãå®è¡å¯èœã§æçšã§ãããšç§ãä¿¡ããçšåºŠãŸã§ãã©ã°ã¡ã³ãããµããŒãããŠããããšãèŠããšãã»ãã³ãã£ã¯ã¹ã®ããŸããŸãªåŽé¢ãããã°ãReactã§å®è£ ããæ¹ãå®è¡å¯èœãããããŸããã Mithrilã§è¡ãããããã«ãåå¥ã«è©äŸ¡ãããŸãïŒãããŠæåŠãããå¯èœæ§ããããŸãïŒã
ã³ã¡ã³ããä¿®æ£ããããšã«æ³šæããŠãã ããã ç§ã¯ããã€ãã®ééããç¯ããŸããããããŠGitHubã¯é»åã¡ãŒã«å¿çã®ã¹ã¿ã€ãªã³ã°ãããŸãè¡ããŸãã...ïŒçãã²ãããŠããŸãïŒ
@Primajinç§ãããæã£ãã®ã§ããã1ã€ã®èŠçŽ ãšããŠæž¡ãããã®ã§ã¯ãªãããšæããŸãã ãã©ã°ã¡ã³ããæ§æå¯èœã«ããããšãéèŠã§ãïŒäžèšã®ç§ã®äŸãåç §ïŒã ãã ãããããã1ã€ã®ãŠããããšããŠæ±ãããå ŽåããããŸãã
ããããã React.Children.map
ã¯ãã©ã°ã¡ã³ããå±éããå¿
èŠããããŸãã ãã¹ãŠã®åïŒåãã©ã°ã¡ã³ãã®åãå«ãïŒãå埩åŠçããå Žåã¯ã Children.map
ã䜿çšããŸãã ãã©ã°ã¡ã³ããäžéæãªããã¯ã¹ãšããŠæ±ãããå Žåã¯ãprops.childrenã{arrayãelement}ãšããŠçŽæ¥æäœããŸãã
@lhorieã§ããç§ã¯æžãçŽãã«ããŸãé¢ãã£ãŠããªãã£ãã®ã§ããã®è€éãã«ã¯ããŸã詳ãããããŸããã ä»é±ã¯æ±ºåã1åãæ¥é±ã¯3åãããšããäºå®ã«å¿ãããããã«èª°ããšååããŠå€§åŠã§å¿ èŠãªã€ã³ã¿ãŒã³ã·ãããèšå®ããŠããŸãã ãŸããTechtonicã®ä»äžãã«ã泚åããŠãããCLIãã»ãŒå®è¡ããŠããŸãïŒãã¹ãã倱æããŠããã¯ãã§ããã倱æããŠããã¯ãã§ãïŒã
@isiahmeadowsãããã¯ã«ãšã©ãŸãããã®ãã¬ã³ããªãŒãªãªãã€ã³ããŒã ä»ã®ãããã¯ã«ã€ããŠãã£ãããããå Žåã¯ããã¹ãªã«ã®ãã¿ãŒã«ãŒã ãèªç±ã«äœ¿çšããŠãã ããã
@appsforartists
ãããããReact.Children.mapã¯ãã©ã°ã¡ã³ããå±éããå¿ èŠããããŸã
Mithrilã®å®å®çã¯å éšã§åæ§ã®ããšãè¡ããŸãïŒã€ãŸãããµãé åããã©ããåããŸãïŒããããã©ãŒãã³ã¹äžã®çç±ïŒããã³ããŒä»ãããŒããšããŒãªãããŒããæ··åšããvnodeãªã¹ãã«é¢ããããã€ãã®æŽå²çãªé çã®çš®ïŒã®ããã«ããã®ã¢ãã«ããé¢ããŠããŸãã èæ ®ãã¹ãããšããããããããŸããã
ãããŠãHTMLã³ã¡ã³ãã®ãããªãç䌌ãã©ãããŒèŠçŽ ã䜿çšããããšã¯ãªãã·ã§ã³ã§ã¯ãããŸãããïŒ ãããããã¹ãããŒããã解決ãããæ¹æ³ã ãšæããŸãã...
æ°ãæéãæ¬çªç°å¢ã§https://github.com/mwiencek/react-packagesã䜿çšããŠããŸãã ãã®ã³ã¡ã³ãã©ãããŒã¢ãããŒãã䜿çšããŠããããããã©ã°ã¡ã³ããæ確ã«ãã¹ãã§ããŸãã
@mwiencekã«ã¹ã¿ã reactããã±ãŒãžãªãã§ããªãã®ã¢ãããŒãã䜿çšããããšã¯å¯èœã§ããïŒ
@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
é¢æ°ã1ã€ã®ã«ãŒãèŠçŽ /ã³ã³ããŒãã³ãã®ã¿ãè¿ãéããæ©èœããã¯ãã§ãã
ããã£ãïŒ
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>
ãšãŠãæ²ããã§ãã 2ã€ã®<tr>
èŠçŽ ãäžåºŠã«ã¬ã³ããªã³ã°ããããšã¯ã§ããªããããè¡ã¹ãã³ã®ããããŒãã«ã«ãåãããšãèšããŸã:(
äžããïŒ
ãç§ãããšã+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ã§ã¯å®éã«ã¯æå³ããªããããæ°ããã³ã¢ã¢ã«ãŽãªãºã ãå®æãããããã䜿ã£ãŠé©åãªãœãªã¥ãŒã·ã§ã³ãå®è¡ããããšããããšã§ããã ç§ã¯ãã®ç¶æ³ãè¿œã£ãŠããŸãããããããã®èšç»ã¯å€ãã£ãŠããªããšæããŸãã ãããŸã§ã®éãããã±ãŒãžãã圹ã«ç«ãŠãŠããããã§ãã
æ°ããã¢ã«ãŽãªãºã ã¯çŸåšéçºäžã§ããããã©ã°ã¡ã³ãããµããŒãããŠããŸãã ããããç§ã¯ãããä»åŸæ°ã¶æã®çç£æºåãæŽããšã¯æã£ãŠããŸããã ãããæåã«ReactDOMã«è¿œå ããåŸã§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);
};
ããã«ã€ããŠã¯ãååã®ããŒã ããŒãã£ã³ã°ã§è©³ãã話ããŸããã ã³ã³ã»ã³ãµã¹ã¯ããã®ç¹å®ã®å®è£ ãæ¡çšããããªããšããããšã§ãã ãã ãããã®æ©èœã¯é·æçãªã³ã¢ãªã©ã€ãã§ãµããŒããããŸãïŒçŸæç¹ã§ã¯ã¿ã€ã ã©ã€ã³ã¯ãããŸããïŒã
ãŸããæžãçŽãã«æéãããããããããããŸããããªãã£ããããå Žåã«ãä»å¹Žã®åŸåã«åãçµãå¯èœæ§ã®ããããšã®1ã€ãšããŠå床æ€èšããŸãã ãªã¹ããäœæãããä¿èšŒã¯ãããŸãããããªã¹ãã衚瀺ãããå Žåã¯ãã¹ãŠææ°ã®ç¶æ ã«ä¿ã¡ãŸãã
ç§ãã¡ãåãçµãã§ããããšãããããç解ããã«ã¯ãããŒãã£ã³ã°ããŒããªããžããªãã芧ãã ããã ããã«é¢ããææ°ã®ãã£ã¹ã«ãã·ã§ã³ã¯ã 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">
ã§å²ãŸãã2ã€ã®èŠçŽ ããããŸãã
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>
ãããŠãåäžã®èŠçŽ ã«å
ãŸãã2ã€ã®èŠçŽ ã¯äžå¯èœã§ãã
ãæéãããã ãããããšãããããŸã@Primajin
ãã¹ãŠã1ã¬ãã«ã·ããããã ãã§ãã
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_ã®äŸãè¿œå ããã®ãããããšããã§ã«ç¢ºèªãããŠããåãåé¡ãç¹°ãè¿ãã®ããæ€èšããã®ã瀌åã§ãã ããã¯æ¢ç¥ã®å¶éã§ããããã®ã¹ã¬ããã«ã¯ãå¶éã®è©³çŽ°ãšçç±ã«é¢ãã詳现ãªèª¬æãå«ãŸããŠããŸãã ãã³ã¯ãŸããæçµçã«ã¯ããããµããŒãããããã«ä¿®æ£ããã€ããã§ãããšè¿°ã¹ãŠããŸãã èªããããåé¡ã®å¥ã®äŸãææããŠãäœãéæããããšããŠããŸããïŒ
ç³ãèš³ãããŸãããããã®éã«èª°ããå¥ã®è§£æ±ºçãæã£ãŠãããã©ãããç¥ãããã£ãã ãã§ãã
å¿
èŠã«å¿ããŠç§ã®æçš¿ãåé€ã§ããŸãã
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>
'page'ã¯ã©ã¹ãæããªãä»ã®divã§ç¬¬1ã¬ãã«ã®åèŠçŽ ïŒnavbarãsearchbarïŒãã©ããããããšã¯ã§ããŸãã
è¡ã®ãªã¹ããè¿ãã³ã³ããŒãã³ãããããŸã
åèãŸã§ã«ãç§ãã¡ãåãçµãã§ãããªã©ã€ãïŒïŒ6170ïŒã¯ããã§ã«ãã©ã°ã¡ã³ãããµããŒãããŠããŸãã é²æç¶æ³ã¯ãïŒ7925ããã³http://isfiberreadyyet.comã§è¿œè·¡ã§ããŸãã
<table>
èŠçŽ ãç¹å®ã®èŠçŽ ãã¬ã³ããªã³ã°ã§ããªããšããåãªãäºå®ã¯ãWebAPIãšäºææ§ãæãããããã«ãã®æ©èœãè¿œå ããã®ã«ååãªçç±ã§ãã
ç·šéïŒãããæçïŒ ãããã楜ãã¿ã«ããŠããŸãã
@trusktr
ãã®ã¹ã¬ããã®æåã®æçš¿ã«èšèŒãããŠããããã«ïŒ
ã¡ã³ããããã®ã¡ã¢ïŒ
ç§ãã¡ã¯ãããåé¡ã§ããããšãç¥ã£ãŠãããã©ã®ãããªåé¡ã解決ã§ããããæ£ç¢ºã«ç¥ã£ãŠããŸãã ãããå¿ èŠã§ãããçŸåšã®ã¢ãŒããã¯ãã£ã§ã¯é£ããåé¡ã§ãã ãã®æ©èœãžã®èŠæãè¡šãè¿œå ã®ã³ã¡ã³ãã¯åœ¹ã«ç«ã¡ãŸããã
ð
ããããããããªããã
ç§ã¯ããã«è³æããŸããããæå¹ãªãŠãŒã¹ã±ãŒã¹ãå ±æããããšæããŸããã CSSãªãããã¬ã€ã¢ãŠãïŒå·Šãäžå€®ãå³ïŒãå¿ èŠãª3ã€ã®ãã¿ã³ããããšããŸãã å·Šãã¿ã³ã¯åžžã«è¡šç€ºãããŸãããä»ã®2ã€ã¯æ¡ä»¶ä»ãã§è¡šç€ºãããŸãã ReactïŒå ·äœçã«ã¯React NativeïŒã§ã¯ããã¬ãã¯ã¹ããã¯ã¹ã䜿çšããŠæ¬¡ã®ããã«ã¬ã³ããªã³ã°ããŠããŸãã
[ Left ] { renderCenterAndRightButtons(this.state.someFlag) }
äžå€®ã®ãã¿ã³ãšå³ã®ãã¿ã³ã¯ãåäžã®ãã¥ãŒã«ã©ãããããŠãããããæ£ããé 眮ãããŸããã
ã¯ããäžå€®ã®ãã¿ã³ãšå³ã®ãã¿ã³ãããããã®ã¡ãœããã«åå²ããããšã¯ã§ããŸãããå€ãã®åäœãå ±æãããããå€ãã®åé·ãªã³ãŒããå°å ¥ãããŸãã
[ Left ] { renderCenterButton(this.state.someFlag) } { renderRightButton(this.state.someFlag) }
äžã§è¿°ã¹ãããã«ãç§ãã¡ã¯ãã®æ©èœã®ãŠãŒã¹ã±ãŒã¹ããã§ã«èªèããŠãããããããµããŒãããããã«æžåœã«åãçµãã§ããŸãã ïŒãã¬ãã¯ã¹ããã¯ã¹ã®åé¡ãææãã人ã¯ãã§ã«åããŒã¹äžã«ããŸããïŒãã以äžã®è°è«ã¯çç£çã§ã¯ãªãããã«æãããã®ã§ãç§ã¯ãããããã¯ããŠããŸãã æ°ããå®è£ ã«é¢ãããã¥ãŒã¹ããããŸãããæŽæ°ããŸãã
ãããéããããšãã§ãããšæããŸãã
ä»ããè©Šãããšãã§ããReact16Beta 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.
ãåŸãããŸãã
ã§ã¯ããã®æ©èœã¯ãå®éã®ãªã¹ããç¡é¢ä¿ãªèŠçŽ ã§å²ãŸãªãããã«ããæ¹æ³ã§ãããïŒ
ã§ã¯ããã®æ©èœã¯ãå®éã®ãªã¹ããç¡é¢ä¿ãªèŠçŽ ã§å²ãŸãªãããã«ããæ¹æ³ã§ãããïŒ
ã¯ãã1ã€ã®ã¬ã³ããªã³ã°ããè€æ°ã®èŠçŽ ãæäŸããæ¹æ³ã§ãã ïŒè©³çŽ°ã«ã€ããŠã¯ãæåã®åé¡ã®æçš¿ãåç §ããŠãã ãããïŒ
ãã¹ãŠã®é åã¢ã€ãã ãæååã§ããããšãããã£ãŠããå Žåã¯ãããããçµåããŠ1ã€ã®æååãè¿ããŸãã ããã§ãªãå Žåã¯ããã®èŠåãé£ã¹ãããèŠçŽ ã§ããããã©ããããæ¹æ³ãèããŠãJSXã®å¥ã®èŠçŽ å ã«æååã®é åãå«ããå Žåãšåãããã«ãDOMã®èª¿æŽãæ¹åããããã«ããŒãèšå®ã§ããŸãã
@diligiantã['foo', 'bar']
ãè¿ãããšã¯ããã®åé¡ãšã¯é¢ä¿ãããŸããã return <div>{['foo','bar']}</div>
ãå®è¡ããããšã¯ã§ããŸããããå®è¡ããããšãã§ããŸãããé
åå
ã®ååã«ã¯ã <div>
ãªã©ã®å
éšjsxã¿ã°å
ã«ããããè¿ããããã©ããã«ãããããããããŒããããããå¿
èŠã§ãã ä»ã§ããããšã¯æ¬¡ã®ãšããã§ãã
return [<div key='1'>foo</div>, <span key='2'>bar</span>];
ããã¯reactã®å€§ããªå¶éãåãé€ããŸãã
ãšããã§ã ['foo', 'bar']
ãè¿ããšããšã©ãŒã§ã¯ãªãèŠåã衚瀺ãããŸãããã®èŠåãåé€ããã«ã¯ããããã®æååãç°¡åã«çµåã§ããŸããæååã§ã¯ãªãjsxã¿ã°ã®å Žåã¯ãããŒãããããè¿œå ã§ããŸãã ãããã£ãŠãé
åãè¿ãããšã«ã€ããŠã®å¶éã¯ãããŸããã
@JesperTreetopããããšãããããŸãã
@sassanh ãããªãã®äŸãããç§ã¯ãæ¥ãããããå±ãã§ãåšå²ã®ïŒæå³çã«ïŒåœ¹ã«ç«ããªã<div>
ãé¿ããããã«ããã ãããŒã䜿çšããããšãã§ããªãã£ãããã§ãã å
ã«é²ãå¿
èŠããããå®éã®ããã©ãŒãã³ã¹ã®äœäžã¯ãªããšããããšã§ããïŒ ããã¯ç¢ºãã«æ¬åœã®æ¹åã«ãªãã§ãããïŒ
@diligiantããã©ãŒãã³ã¹ãäœäžããããšã¯ãªããšæããŸãããåšå²ã®æååã§ãªãéããåšå²ã®åœ¹ã«ç«ããªãdiv
ã¯å¿
èŠãããŸãããåšå²ã®æååã®å Žåã¯ãé
åããŸã£ããé¿ããŠæååãçµåã§ããŸãã æååã§ãªãå Žåã¯ãã³ã³ããŒãã³ãã«ããŒãè¿œå ã§ããŸãã ããšãã°ã2ã€ã®ã³ã³ããŒãã³ãFoo
ãšBar
ãããå Žåã [<Foo key='foo'/>, <Bar key='bar'/>]
ãè¿ãããšãã§ããã³ã³ããŒãã³ãïŒãã€ãã®ããã«ïŒãé
åãïŒããããšãïŒãå²ãå¿
èŠã¯ãããŸããããã®æ°ãããªãªãŒã¹ã§ã¯ã16ïŒã®åã«ã¢ã¬ã€ãå²ãå¿
èŠããããŸããã
@sassanhãã£ãããã ãã¡ãããç§ã®ãŠãŒã¹ã±ãŒã¹ã¯è€æ°ã®ã³ã³ããŒãã³ãã§ããã 幞ãïŒïŒ ;ïŒ
å®éããã¹ãŠã®ã¢ã€ãã ãæååã§ããå Žåã«ããŒãæ¬ èœããŠããããšãèŠåããã®ã¯å¥åŠã«æããŸãã ç§ãã¡ãããããããšãæåŸ ããŠããŸããã æååãdivå ã«ããå Žåããã®æ¢åã®åäœã¯15ã«ãããŸããïŒ ããã§ãªãå Žåã¯ããããã¬ãã«ã®æååã«å¯ŸããŠ16ã§ä¿®æ£ããå¿ èŠããããŸãïŒããŒãäžããããšãã§ããªãããïŒã
@gaearonç³ãèš³ãããŸããããç§ã®äŸã¯èª€è§£ãæããã®ã§ãããç§ã¯ã³ã³ããŒãã³ããæå³ããŠããŸããã
ãã§ãã¯ãããšããã -beta.5
ã®äžã§ãReactã¯è€æ°ã®æååãå«ãé
åãã¬ã³ããªã³ã°ãããšãã«èŠåãçºè¡ããŸããã
ããã§ããåšå²ã®ã³ã³ããŒãã³ããåé¿ããããã ãã«é
åãã¬ã³ããªã³ã°ããå Žåã key
ã®èŠä»¶ã«æžæããŸãã ç§ã¯ç解ããŠããŸãããããã¯ããããSOã«é¢ããå€ãã®è³ªåãæèµ·ããã§ãããïŒç§ã¯æäŸããããè¯ããã®ã¯äœããããŸãããâŠïŒ
ãããŠæåŸã«ãããããšãããããŸããã
ãã®èŠåã¯ãã³ã³ããŒãã³ãã®é
åã®ä»ã®ãã¹ãŠã®äœ¿çšæ³ãšãŸã£ããåãã§ããããã¯ã調æŽæ©èœã®ãäœåãªäœæ¥ããšãŸã£ããåãã§ããã key
ãèšå®ããããšã§ãŸã£ããåãæœåšçãªæé©åã«ãªãããã§ãã ç§ã«ãšã£ãŠé©ãã¯ãããã«å¿ããŠã³ã³ããŒãã³ãã®é
åãç°ãªãæ¹æ³ã§åŠçãããå Žåã§ãããããã«ãã£ãŠã¹ã¿ãã¯ãªãŒããŒãããŒã®è³ªåãããã€ãçºçããããšã«ãªããšæããŸãã èšããŸã§ããªããããããããã远跡ããããã ãã«ããããã®ãªãŒããŒããããå¿
èŠã«ãªããšæããŸãã
..ãããŠãã»ãšãã©ã®å Žåãé¢æ°ããé
åãè¿ãã®ã§ã key
ã®èŠåã衚瀺ããããšæããŸãã èŠåãæãŸãªãã®ã¯å°æ°æŽŸã®ããã§ãããReactãèŠåããªãããšãé©åãã©ãããç¥ãæ¹æ³ã¯ãããŸããã
ããŒããªããšãããã©ãŒãã³ã¹ã®åé¡ã ãã§ãªããæ£ç¢ºæ§ã®åé¡ãçºçããå¯èœæ§ããããããèŠåãå¿ èŠã§ãã ããã¯ãããŒãå¿ èŠãªçç±ãå°ããä»ã®å€ãã®åé¡ã§èª¬æãããŠããã®ã§ãããŒãæ€çŽ¢ããŠãããã®è°è«ãèªãããšããå§ãããŸãã ç§ã¯ãããã¥ã¡ã³ããããã«ã€ããŠããæ確ã«ãªãå¯èœæ§ãããããšã«åæããŸããããã¯ã次ã«ããã¥ã¡ã³ãå€æŽã¹ããªã³ããè¡ããšãã«æ€èšããå¯èœæ§ãé«ããã®ã§ãã
ã¬ã³ããªã³ã°ããçŽæ¥è¿ãããé åãšdivå ã®é åã®éã«æŠå¿µçãªéãã¯ãããŸããã ãããã£ãŠãäžæ¹ã®ã±ãŒã¹ã§ã¯éèŠãªèŠåãçºçããããäžæ¹ã®ã±ãŒã¹ã§ã¯çºçããªãçç±ã¯ãããŸããã ããŒãæ¬ èœããŠããå Žåãäž¡æ¹ãåãåé¡ã®åœ±é¿ãåããããããããã¯åãããã«æ©èœããå¿ èŠããããŸãã
ãšã¯ãããéçã³ã³ãã³ãã®ããŒãæå®ããã®ã¯é¢åã ãšç解ããŠããŸãã åãéçã«èªèãããŠããïŒãããã£ãŠã䞊ã¹æ¿ããããªãïŒJSXæ§é ãäœæãããšãã«ããŒãæå®ããªãã®ãšåãããã«ãé åã䜿çšããŠãããè¡ãæ¹æ³ããããšäŸ¿å©ã§ãã
å°æ¥çã«ã¯ã次ã®ãããªæ§æã§JSXã®ãã©ã°ã¡ã³ãã®æ瀺çãªãµããŒããè¿œå ããããšã§ããã解決ããå¯èœæ§ããããŸãã
return (
<>
<div>child 1</div>
<div>child 2</div>
</>
);
é åãçæããããšã¯ã§ããŸãããåã«æ°å€ã€ã³ããã¯ã¹ãæé»çã«å²ãåœãŠãŸãããã®å Žåãåã¯äžŠã¹æ¿ããããšãã§ããªãããšãããã£ãŠããããã§ãã JSXã®ååŒã«ãã£ãŠäžãããããã®ä¿èšŒã¯ãdivã«è€æ°ã®åãããå¯èœæ§ãããéåžžã®JSXã³ãŒãã§ããŒãæå®ããã«åé¿ã§ãããã®ã§ãã
ãããããã®æ§æã¯ãŸã ãããŸããã ãããã£ãŠãä»ã®ãšãããããã¯æ¢ç¥ã®å¶éã§ãã
@ JesperTreetop ïŒ @ zwily ã @ gaearonã¯ãç§ããããã£ãšããŸã説æããŠãããŸãã;ïŒ
äžåºŠç¥ã£ãŠããŸãã°ãããã¯å€§ããããšã§ã¯ãããŸããããç§ãã¡å šå¡ãReactãç¹æ ããããã®ã§ãç§ã¯ãã èšã£ãŠããŸããâŠ
@gaearon <>
æ§æã®ææ¡ã«ã€ããŠããã®åé¡ã«ã€ããŠããã«è°è«ãã代ããã«èŠãããšãã§ããå¥ã®åé¡ã¯ãããŸããïŒ æ¢ãåã£ãã®ã§ããèŠã€ãããŸããã§ããã
@smrq +1ã§è³ªåâç§ã¯ãããã®åä»ãªå¶éïŒ1察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ã¯æè¡çã«ã¯ããŒããªããŠãæ©èœããå¯èœæ§ããããŸããããªã¹ããã1ã€ã®ã¢ã€ãã ãåé€ãããšãã«ãã³ã³ããŒãã³ãã®ååãæŽæ°ããå¿ èŠãããããšã«æ°ä»ãã®ã¯ãŸã£ããäºæ³å€ã®ããšã§ãã ããŒã䜿çšãããšã1ã€ã®ã¢ã€ãã ã®ã¿ãã¢ã³ããŠã³ããããŸãã
@ goto-bus-stop vidomã¯ããŒã䜿çšã§ããŸãããããŒã¯å¿ é ã§ã¯ãªããããŒããªããšãå€ãã®æŽæ°ã䌎ãéåžžã«å€§ããªã±ãŒã¹ã®ã¿ãå®éã®ããã©ãŒãã³ã¹ã®åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
ãããã£ãŠããã®éšåã¯ãåã
ã®ã±ãŒã¹ã§ã®ããã©ãŒãã³ã¹ã®åŸ®èª¿æŽã«äœ¿çšã§ãããªãã·ã§ã³ïŒããšãã°ã shouldComponentUpdate
ãªã©ïŒã§ãããšèããŠããŸãã
ããŒãªãã§èŠåŽããŠããvidomã®@vegedã®äŸã
èŠçŽ ã䞊ã¹æ¿ããå¿ èŠããããã©ããããããªããããã«ãŒãã³ã³ããŒãã³ãã®åã¬ã³ããªã³ã°ã§ã€ã³ã¹ã¿ã³ã¹ãç Žæ£ããŸãã
ä»®æ³ããŒã 空éã«ç²ŸéããŠãã人ãšããŠ[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
æãåèã«ãªãã³ã¡ã³ã
ãããéããããšãã§ãããšæããŸãã
ä»ããè©Šãããšãã§ããReact16Beta 1以éãã³ã³ããŒãã³ãããé åãè¿ãããšããµããŒããããŠããŸãã
ãŸã ããã€ãã®å¶éããããŸãïŒSSRãµããŒãã®æºåãã§ããŠããŸããïŒããïŒ8854ã§è¿œè·¡ããŠãããæåŸã®16ãªãªãŒã¹ã®åã«ä¿®æ£ããäºå®ã§ãã
ãã£ãŒãããã¯ãããããšãããããŸããïŒ