React: RFClarificationīŧšãĒぜ `setState`は非同期ãĒぎですかīŧŸ

äŊœæˆæ—Ĩ 2017åš´11月11æ—Ĩ  Âˇ  31ã‚ŗãƒĄãƒŗト  Âˇ  ã‚Ŋãƒŧã‚š: facebook/react

かãĒã‚Šé•ˇã„é–“ã€į§ã¯setStateが非同期であるį†į”ąã‚’į†č§Ŗしようとしぞした。 そしãĻ、過åŽģãĢそれãĢ寞するį­”えをčĻ‹ã¤ã‘ることができãĒかãŖたぎで、į§ã¯ãã‚ŒãŒæ­´å˛įš„ãĒį†į”ąãŽãŸã‚ã§ã‚り、おそらくäģŠã¯å¤‰ãˆã‚‹ãŽãŒé›ŖしいというįĩčĢ–ãĢ達しぞした。 しかし、 @ gaearonは明įĸēãĒį†į”ąãŒã‚ることをį¤ēしたぎで、įŸĨりたいと思ãŖãĻいぞす:)

とãĢかく、よくč€ŗãĢするį†į”ąã¯ã“こãĢありぞすが、į°Ąå˜ãĢ寞抗できるぎで、すずãĻではãĒいと思いぞす

非同期ãƒŦãƒŗダãƒĒãƒŗグãĢは非同期setStateがåŋ…čĻã§ã™

多くぎäēēはåŊ“初、それはãƒŦãƒŗダãƒĒãƒŗグ劚įŽ‡ãŽã›ã„ã§ã‚ã‚‹ã¨č€ƒãˆãĻいぞす。 しかし、それがこぎ動äŊœãŽčƒŒåžŒãĢあるį†į”ąã§ã¯ãĒいと思いぞす。ãĒぜãĒら、setStateを非同期ãƒŦãƒŗダãƒĒãƒŗグと同期させることは、į§ãĢはäē›į´°ãĒことぎようãĢčžã“ãˆã‚‹ã‹ã‚‰ã§ã™ã€‚

Component.prototype.setState = (nextState) => {
  this.state = nextState
  if (!this.renderScheduled)
     setImmediate(this.forceUpdate)
}

原際、たとえばmobx-reactäŊŋį”¨ã™ã‚‹ã¨ã€ã‚Ēブã‚ļãƒŧバブãƒĢã¸ãŽåŒæœŸå‰˛ã‚ŠåŊ“ãĻが可čƒŊãĢãĒり、ãƒŦãƒŗダãƒĒãƒŗグぎ非同期性が尊重されぞす。

おぎįŠļ態が_ãƒŦãƒŗダãƒĒãƒŗグされた_かをįŸĨるãĢは、非同期setStateがåŋ…čĻã§ã™ã€‚

į§ãŒæ™‚々č€ŗãĢするäģ–ãŽč­°čĢ–は、あãĒたが_čĻæą‚された_įŠļ態ではãĒく、_ãƒŦãƒŗダãƒĒãƒŗグされた_įŠļ態ãĢついãĻ推čĢ–したいということです。 しかし、こぎ原則ãĢã‚‚å¤šããŽãƒĄãƒĒットがあるかおうかはわかりぞせん。 æĻ‚åŋĩįš„ãĢはそれはį§ãĢはåĨ‡åĻ™ãĢ感じぞす。 ãƒŦãƒŗダãƒĒãƒŗグは副äŊœį”¨ã§ã‚り、įŠļ態はäē‹åŽŸãĢé–ĸするもぎです。 äģŠæ—Ĩ、į§ã¯32æ­ŗですが、所有しãĻいるã‚ŗãƒŗポãƒŧネãƒŗトがäģŠåš´å†ãƒŦãƒŗダãƒĒãƒŗグできるかおうかãĢé–ĸäŋ‚ãĒく、æĨ嚴は33æ­ŗãĢãĒりぞす:)。

īŧˆãŠãã‚‰ãč‰¯ããĒいīŧ‰åšŗ行įˇšã‚’描くãĢはīŧšč‡Ē分で書いた単čĒžæ–‡æ›¸ãŽæœ€åžŒãŽãƒãƒŧジョãƒŗã‚’å°åˆˇã™ã‚‹ãžã§_čĒ­ã‚€_ことができãĒい場合、それはかãĒり厄äģ‹ã§ã™ã€‚ ãŸã¨ãˆã°ã€ã‚˛ãƒŧムエãƒŗジãƒŗã¯ã€ã‚˛ãƒŧムぎおぎįŠļ態がæ­ŖįĸēãĢãƒŦãƒŗダãƒĒãƒŗグされ、おぎフãƒŦãƒŧムがドロップされたかãĢついãĻぎフã‚Ŗãƒŧドバックを提䞛するとは思いぞせん。

興å‘ŗæˇąã„čĻŗ察īŧš2嚴間でmobx-reactčĒ°ã‚‚į§ãĢčŗĒ問をしぞせんでしたīŧšį§ãŽčĻŗæ¸Ŧ量がãƒŦãƒŗダãƒĒãƒŗグされãĻいることをおうやãŖãĻįŸĨることができぞすかīŧŸ こぎčŗĒ問はあぞりé–ĸé€Ŗ性がãĒいようです。

おぎデãƒŧã‚ŋがãƒŦãƒŗダãƒĒãƒŗグされたかをįŸĨã‚‹ã“ã¨ãŒéŠåˆ‡ã§ã‚ã‚‹ã¨ã„ã†ã„ãã¤ã‹ãŽã‚ąãƒŧã‚šãĢ遭遇しぞした。 į§ãŒčĻšãˆãĻいるぎは、ãƒŦイã‚ĸã‚ĻトぎためãĢいくつかぎデãƒŧã‚ŋぎピクã‚ģãƒĢ寸æŗ•ã‚’įŸĨるåŋ…čĻãŒã‚る場合でした。 しかし、それはdidComponentUpdateをäŊŋį”¨ã™ã‚‹ã“とでエãƒŦã‚ŦãƒŗトãĢč§Ŗæąēされ、 setStateが非同期であることãĢ原際ãĢは䞝存しãĻいぞせんでした。 ã“ã‚Œã‚‰ãŽã‚ąãƒŧ゚は非常ãĢぞれであるため、ä¸ģãĢそれらを中åŋƒãĢAPIã‚’č¨­č¨ˆã™ã‚‹ã“ã¨ã¯ãģとんおæ­ŖåŊ“化されぞせん。 ãĒんとかできれば十分だと思いぞす


ReactチãƒŧムがsetStateãŽéžåŒæœŸæ€§ãŒã—ã°ã—ã°ã‚‚ãŸã‚‰ã™æˇˇäšąã‚’čĒč­˜ã—ãĻいることは間違いãĒいぎで、įžåœ¨ãŽã‚ģマãƒŗテã‚Ŗク゚ãĢはåˆĨぎ非常ãĢæ­ŖåŊ“ãĒį†į”ąãŒã‚ると思いぞす。 もãŖと教えãĻください:)

Discussion

æœ€ã‚‚å‚č€ƒãĢãĒるã‚ŗãƒĄãƒŗト

だからここãĢã„ãã¤ã‹ãŽč€ƒãˆãŒã‚ã‚Šãžã™ã€‚ これはæąēしãĻ厌全ãĒåŋœį­”ではありぞせんが、äŊ•ã‚‚č¨€ã‚ãĒいよりもåŊšįĢ‹ã¤ã‹ã‚‚しれぞせん。

ぞず、更新をバッチå‡Ļį†ã™ã‚‹ãŸã‚ãĢčĒŋ整を遅らせることが有į›Šã§ã‚ることãĢ同意すると思いぞす。 つぞり、 setState()同期įš„ãĒ再ãƒŦãƒŗダãƒĒãƒŗグは多くぎ場合非劚įŽ‡įš„ã§ã‚ã‚Šã€č¤‡æ•°ãŽæ›´æ–°ãŒčĄŒã‚ã‚Œã‚‹å¯čƒŊ性がéĢ˜ã„ことがわかãŖãĻいる場合は、更新をバッチå‡Ļį†ã™ã‚‹ã“とをお勧めしぞす。

䞋えば、我々はブナã‚Ļã‚ļ内でãĒらclickハãƒŗドナ、およãŗä¸Ąæ–šãŽChildとParentå‘ŧんsetState我々は再ãƒŦãƒŗダãƒĒãƒŗグするåŋ…čĻã¯ã‚りぞせん、 Child 2回äŊŋį”¨ã—、äģŖわりãĢそれらをダãƒŧテã‚ŖとしãĻマãƒŧクし、ブナã‚Ļã‚ļイベãƒŗトをįĩ‚äē†ã™ã‚‹å‰ãĢそれらを一įˇ’ãĢ再ãƒŦãƒŗダãƒĒãƒŗグすることをåĨŊãŋぞす。

あãĒãŸãŒæą‚ã‚ãĻいるぎは、ãĒぜ同じことīŧˆãƒãƒƒãƒå‡Ļį†īŧ‰ã‚’åŽŸčĄŒã§ããĒいぎãĢ、čĒŋ整ぎįĩ‚äē†ã‚’垅たずãĢsetState更新をthis.stateすぐãĢ書きčžŧむことができãĒいぎかということです。 明į™ŊãĒį­”えは1つではãĒいと思いぞすがīŧˆãŠãĄã‚‰ãŽã‚ŊãƒĒãƒĨãƒŧã‚ˇãƒ§ãƒŗãĢもトãƒŦãƒŧドã‚Ēフがありぞすīŧ‰ã€č€ƒãˆã‚‰ã‚Œã‚‹į†į”ąãŒã„くつかありぞす。

内部ぎ一č˛Ģ性をäŋč¨ŧする

stateが同期įš„ãĢ更新されãĻも、 propsは更新されぞせん。 īŧˆčĻĒã‚ŗãƒŗポãƒŧネãƒŗトを再ãƒŦãƒŗダãƒĒãƒŗグするぞでpropsįŸĨることはできぞせん。これを同期įš„ãĢčĄŒã†ã¨ã€ãƒãƒƒãƒå‡Ļį†ã¯ã‚Ļã‚Ŗãƒŗドã‚Ļぎ外ãĢå‡ēぞす。īŧ‰

įžåœ¨ã€ReactãĢよãŖãĻ提䞛されるã‚Ēブジェクトīŧˆ state 、 props 、 refs īŧ‰ã¯ã€å†…部įš„ãĢį›¸äē’ãĢ

įŠļ態だけをäŊŋį”¨ã™ã‚‹å ´åˆã€īŧˆææĄˆã—たようãĢīŧ‰

console.log(this.state.value) // 0
this.setState({ value: this.state.value + 1 });
console.log(this.state.value) // 1
this.setState({ value: this.state.value + 1 });
console.log(this.state.value) // 2

ただし、こぎįŠļ態をč§Ŗ除しãĻいくつかぎã‚ŗãƒŗポãƒŧネãƒŗãƒˆã§å…ąæœ‰ã™ã‚‹åŋ…čĻãŒã‚るため、čĻĒãĢį§ģ動するとしぞす。

-this.setState({ value: this.state.value + 1 });
+this.props.onIncrement(); // Does the same thing in a parent

setState()䞝存する典型įš„ãĒReactã‚ĸプãƒĒでは、これがぞす。

ただし、これはã‚ŗãƒŧドをåŖŠã—ぞすīŧ

console.log(this.props.value) // 0
this.props.onIncrement();
console.log(this.props.value) // 0
this.props.onIncrement();
console.log(this.props.value) // 0

ã“ã‚Œã¯ã€ææĄˆã—ãŸãƒĸデãƒĢでは、 this.stateはすぐãĢãƒ•ãƒŠãƒƒã‚ˇãƒĨされぞすが、 this.propsã¯ãƒ•ãƒŠãƒƒã‚ˇãƒĨされãĒいためです。 ぞた、čĻĒを再ãƒŦãƒŗダãƒĒãƒŗグせずãĢthis.propsをすぐãĢãƒ•ãƒŠãƒƒã‚ˇãƒĨすることはできぞせん。つぞり、バッチå‡Ļį†ã‚’あきらめるåŋ…čĻãŒã‚りぞすīŧˆå ´åˆãĢよãŖãĻは、パフりãƒŧマãƒŗ゚が大嚅ãĢäŊŽä¸‹ã™ã‚‹å¯čƒŊ性がありぞすīŧ‰ã€‚

props īŧˆãžã ãƒ•ãƒŠãƒƒã‚ˇãƒĨされãĻいãĒいīŧ‰ã¨state īŧˆã™ããĢãƒ•ãƒŠãƒƒã‚ˇãƒĨã•ã‚Œã‚‹ã“ã¨ãŒææĄˆã•ã‚ŒãĻいるīŧ‰ãŽãƒ‡ãƒŧã‚ŋã‚’æˇˇåˆã—ãĻ新しいįŠļ態をäŊœæˆã™ã‚‹å ´åˆãĒお、これがおぎようãĢåŖŠã‚Œã‚‹å¯čƒŊ性があるかãĢついãĻぎより垎åĻ™ãĒã‚ąãƒŧ゚もありぞすīŧš https īŧš//github.com/facebook/react/issues/122#issuecomment-81856416。 参į…§ãĢã¯åŒã˜å•éĄŒãŒã‚ã‚Šãžã™īŧš https īŧš//github.com/facebook/react/issues/122#issuecomment-22659651。

これらぎ䞋はぞãŖたくį†čĢ–įš„ではありぞせん。 原際、React Reduxバイãƒŗデã‚Ŗãƒŗグは、Reactå°é“å…ˇã¨éžReactįŠļæ…‹ãŒæˇˇåœ¨ã—ãĻいるため、ぞさãĢこぎį¨ŽãŽå•éĄŒã‚’æŠąãˆãĻいぞしたīŧš https īŧš //github.com/ reactjs / /プãƒĢ/ 99-Reduxぎを反åŋœã•ã›ã€ https://github.com/reactjs/react-redux/issues/292 、 https://github.com/reactjs/redux/issues/1415 、 httpsīŧš//でgithubぎ。 com / reactjs / react-redux / issues / 525。

MobXãƒĻãƒŧã‚ļãƒŧがこれãĢãļつからãĒいį†į”ąã¯ã‚ã‹ã‚Šãžã›ã‚“が、į§ãŽį›´æ„Ÿã§ã¯ã€MobXãƒĻãƒŧã‚ļãƒŧはそぎようãĒã‚ˇãƒŠãƒĒã‚ĒãĢãļつかる可čƒŊ性がありぞすが、č‡Ēåˆ†ãŽã›ã„ã§ã‚ã‚‹ã¨č€ƒãˆãĻいぞす。 あるいは、 propsからあぞりčĒ­ãŋ取らず、äģŖわりãĢMobX可変ã‚Ēブジェクトからį›´æŽĨčĒ­ãŋ取る場合もありぞす。

では、ReactはäģŠæ—ĨこれをおぎようãĢč§ŖæąēしぞすかīŧŸ Reactでは、 this.stateとthis.propsä¸Ąæ–šãŒčĒŋæ•´ã¨ãƒ•ãƒŠãƒƒã‚ˇãƒĨぎ垌ãĢぎãŋ更新されるため、ãƒĒãƒ•ã‚Ąã‚¯ã‚ŋãƒĒãƒŗã‚°ãŽå‰åžŒãŽä¸Ąæ–šã§0がå‡ē力されぞす。 これãĢã‚ˆã‚Šã€æŒãĄä¸Šã’įŠļ態が厉全ãĢãĒりぞす。

はい、これは場合ãĢよãŖãĻは不äžŋです。 į‰šãĢ、単一ぎ場所で厌全ãĒįŠļæ…‹ãŽæ›´æ–°ã‚’čĄ¨ã™æ–šæŗ•ã‚’č€ƒãˆã‚‹ãŽã§ã¯ãĒく、įŠļ態を数回変更したいだけぎ、より多くぎOOバックグナã‚ĻãƒŗドからæĨãĻいるäēē々ãĢとãŖãĻ。 デバッグぎčĻŗį‚šã‹ã‚‰ã¯ã€įŠļ態ぎ更新を集中させる斚が明įĸēã ã¨æ€ã„ãžã™ãŒã€å…ąæ„Ÿã§ããžã™īŧš https īŧš//github.com/facebook/react/issues/122#issuecomment-19888472。

それでも、į‰šãĢãƒŦãƒŗダãƒĒãƒŗグぎäŋĄé ŧã§ãã‚‹æƒ…å ąæēã¨ã—ãĻäŊŋį”¨ã—ãĒい場合は、すぐãĢčĒ­ãŋ取りたいįŠļ態をæ¨Ē向きãĢ変更可čƒŊãĒã‚ĒブジェクトãĢį§ģ動するã‚Ēãƒ—ã‚ˇãƒ§ãƒŗがありぞす。 これは、MobXでできることとãģãŧåŒã˜ã§ã™đŸ™‚ã€‚

äŊ•ã‚’しãĻいるぎかがわかãŖãĻいる場合は、ツãƒĒãƒŧ全äŊ“ã‚’ReactDOM.flushSync(fn)とå‘ŧばれぞす。 ぞだ文書化しãĻいãĒいと思いぞすが、16.xãƒĒãƒĒãƒŧã‚šã‚ĩイクãƒĢぎある時į‚šã§įĸē原ãĢ文書化するäēˆåŽšã§ã™ã€‚ 原際ãĢは、å‘ŧãŗå‡ēし内でį™ēį”Ÿã™ã‚‹æ›´æ–°ãĢ寞しãĻ厌全ãĒ再ãƒŦãƒŗダãƒĒãƒŗグがåŧˇåˆļされるため、äŊŋį”¨ã¯æ…Žé‡ãĢčĄŒã†åŋ…čĻãŒã‚りぞす。 こぎようãĢしãĻ、 props 、 state 、およãŗrefs間ぎ内部整合性ぎäŋč¨ŧをį ´ã‚‹ã“とはありぞせん。

čĻį´„すると、ReactãƒĸデãƒĢは常ãĢ最もį°ĄæŊ”ãĒã‚ŗãƒŧドãĢつãĒがるとは限りぞせんが、内部įš„ãĢ一č˛Ģ性があり、įŠļæ…‹ã‚’æŒãĄä¸Šã’ãĻも厉全です。

同時更新ぎ有劚化

æĻ‚åŋĩįš„ãĢは、Reactはã‚ŗãƒŗポãƒŧネãƒŗトごとãĢ単一ぎ更新キãƒĨãƒŧがあるかぎようãĢ動äŊœã—ぞす。 ã“ã‚ŒãŒã€č­°čĢ–がぞãŖたくį†ãĢかãĒãŖãĻいるį†į”ąã§ã™ã€‚更新がæ­ŖįĸēãĒ順åēã§éŠį”¨ã•ã‚Œã‚‹ã“とは間違いãĒいぎで、 this.stateãĢ更新をすぐãĢ遊į”¨ã™ã‚‹ã‹ãŠã†ã‹ãĢついãĻč­°čĢ–しぞす。 ただし、そうであるåŋ…čĻã¯ã‚りぞせんīŧˆįŦ‘īŧ‰ã€‚

最čŋ‘、į§ãŸãĄã¯ã€ŒéžåŒæœŸãƒŦãƒŗダãƒĒãƒŗグ」ãĢついãĻå¤šããŽã“ã¨ã‚’čŠąã—ãĻきぞした。 それがäŊ•ã‚’意å‘ŗするぎかをうぞくäŧãˆã‚‹ã“とができãĻいãĒいことはčĒã‚ãžã™ãŒã€ãã‚ŒãŒRīŧ†Dぎ性čŗĒです。æĻ‚åŋĩįš„ãĢ有望と思われるã‚ĸイデã‚ĸをčŋŊæą‚ã—ãžã™ãŒã€ååˆ†ãĒ時間をč˛ģやしãĻ初めãĻそぎ意å‘ŗをį†č§Ŗしぞす。

「非同期ãƒŦãƒŗダãƒĒãƒŗグ」ãĢついãĻčĒŦ明しãĻきた1つぎ斚æŗ•ã¯ã€ ReactがsetState()å‘ŧãŗå‡ēしぎį™ēäŋĄå…ƒãĢåŋœã˜ãĻ、イベãƒŗトハãƒŗドナãƒŧ、ネットワãƒŧクãƒŦ゚ポãƒŗ゚、ã‚ĸãƒ‹ãƒĄãƒŧã‚ˇãƒ§ãƒŗãĒおãĢåŋœã˜ãĻį•°ãĒるå„Ē先順äŊã‚’å‰˛ã‚ŠåŊ“ãĻることができるという

ãŸã¨ãˆã°ã€ãƒĄãƒƒã‚ģãƒŧジをå…Ĩ力しãĻいる場合、 TextBoxã‚ŗãƒŗポãƒŧネãƒŗトぎsetState()å‘ŧãŗå‡ēしはすぐãĢãƒ•ãƒŠãƒƒã‚ˇãƒĨするåŋ…čĻãŒã‚りぞす。 ただし、å…Ĩ力中ãĢæ–°ã—ã„ãƒĄãƒƒã‚ģãƒŧジMessageBubbleãƒŦãƒŗダãƒĒãƒŗグをį‰šåŽšãŽã—きい値īŧˆãŸã¨ãˆã°1į§’īŧ‰ãžã§é…らせる斚が、ブロックぎためãĢå…ĨåŠ›ãŒé€”åˆ‡ã‚Œã‚‹ã‚ˆã‚Šã‚‚ãŠãã‚‰ãč‰¯ã„ã§ã—ã‚‡ã†ã€‚įŗ¸ã€‚

į‰šåŽšãŽæ›´æ–°ãŽå„Ē先åēĻを「äŊŽãã€ã™ã‚‹ã¨ã€ãƒŦãƒŗダãƒĒãƒŗグを数ミãƒĒį§’ぎ小さãĒチãƒŖãƒŗクãĢåˆ†å‰˛ã—ãĻ、ãƒĻãƒŧã‚ļãƒŧが気äģ˜ã‹ãĒいようãĢすることができぞす。

こぎようãĒパフりãƒŧマãƒŗ゚ぎ最遊化は、あぞりエキã‚ĩイテã‚ŖãƒŗグでčĒŦ垗力がãĒいようãĢčžã“ãˆã‚‹ã‹ã‚‚ã—ã‚Œãžã›ã‚“ã€‚ 「MobXではこれはåŋ…čĻã‚りぞせん。更新ぎčŋŊčˇĄã¯ã€å†ãƒŦãƒŗダãƒĒãƒŗグを回éŋするぎãĢ十分ãĒ速åēĻã§ã™ã€ã¨č¨€ã†ã“ã¨ãŒã§ããžã™ã€‚ すずãĻぎ場合ãĢåŊ“ãĻはぞるとは思いぞせんīŧˆãŸã¨ãˆã°ã€MobXがおれãģおéĢ˜é€Ÿã§ã‚ãŖãĻも、DOMノãƒŧドをäŊœæˆã—、新しくマã‚ĻãƒŗトされたビãƒĨãƒŧぎãƒŦãƒŗダãƒĒãƒŗã‚°ã‚’čĄŒã†åŋ…čĻãŒã‚りぞすīŧ‰ã€‚ それでも、それがįœŸåŽŸã§ã‚り、čĒ­ãŋ取りと書きčžŧãŋをčŋŊčˇĄã™ã‚‹į‰šåŽšãŽJavaScriptナイブナãƒĒãĢã‚Ēブジェクトを常ãĢナップしãĻã‚‚å•éĄŒãĒã„ã¨æ„č­˜įš„ãĢ判断した場合は、これらぎ最遊化ぎ恊æĩをあぞり受けãĒい可čƒŊ性がありぞす。

ただし、非同期ãƒŦãƒŗダãƒĒãƒŗグはパフりãƒŧマãƒŗ゚ぎ最遊化だけではありぞせん。

たとえば、あるį”ģéĸからåˆĨぎį”ģéĸãĢį§ģ動しãĻã„ã‚‹å ´åˆã‚’č€ƒãˆãĻãŋぞす。 通常、新しいį”ģéĸぎãƒŦãƒŗダãƒĒãƒŗグ中ãĢ゚ピナãƒŧã‚’čĄ¨į¤ēしぞす。

ãŸã ã—ã€ãƒŠãƒ“ã‚˛ãƒŧã‚ˇãƒ§ãƒŗが十分ãĢéĢ˜é€Ÿã§ã‚る場合īŧˆ1į§’äģĨ内īŧ‰ã€ã‚šãƒ”ナãƒŧをį‚šæģ…させãĻすぐãĢ非表į¤ēãĢすると、ãƒĻãƒŧã‚ļãƒŧエク゚ペãƒĒエãƒŗ゚がäŊŽä¸‹ã—ぞす。 さらãĢæ‚ĒいことãĢ、非同期ぎ䞝存é–ĸäŋ‚īŧˆãƒ‡ãƒŧã‚ŋ、ã‚ŗãƒŧド、į”ģ像īŧ‰ãŒį•°ãĒã‚‹č¤‡æ•°ãŽãƒŦベãƒĢぎã‚ŗãƒŗポãƒŧネãƒŗトがある場合、゚ピナãƒŧぎã‚Ģã‚šã‚ąãƒŧドが1つずつįŸ­æ™‚é–“į‚šæģ…することãĢãĒりぞす。 これはčĻ–čĻšįš„ãĢ不åŋĢであり、すずãĻぎDOMãƒĒフロãƒŧぎためãĢ原際ãĢはã‚ĸプãƒĒぎ速åēĻがäŊŽä¸‹ã—ぞす。 ぞた、多くぎ厚型ã‚ŗãƒŧドぎã‚Ŋãƒŧ゚でもありぞす。

åˆĨぎビãƒĨãƒŧをãƒŦãƒŗダãƒĒãƒŗグする単į´”ãĒsetState()ã‚’åŽŸčĄŒã™ã‚‹ã¨ããĢ、更新されたビãƒĨãƒŧぎ「バックグナã‚Ļãƒŗド」でぎãƒŦãƒŗダãƒĒãƒŗグを「開始」できるとäžŋ刊ではãĒいでしょうか。 č‡Ē分でčĒŋ整ã‚ŗãƒŧãƒ‰ã‚’č¨˜čŋ°ã›ãšãĢ、更新ãĢį‰šåŽšãŽã—きい値īŧˆ1į§’ãĒおīŧ‰ã‚’čļ…えた場合ãĢ゚ピナãƒŧã‚’čĄ¨į¤ēするか、新しいã‚ĩブツãƒĒãƒŧ全äŊ“ぎ非同期䞝存é–ĸäŋ‚がæē€čļŗ。 さらãĢ、「垅抟中」ぎ間、「古いį”ģéĸ」はイãƒŗã‚ŋナクテã‚ŖブãĒぞぞでありīŧˆãŸã¨ãˆã°ã€åˆĨぎã‚ĸイテムを選択しãĻį§ģčĄŒã§ããžã™īŧ‰ã€Reactは、時間がかかりすぎる場合ぱピナãƒŧã‚’čĄ¨į¤ēするåŋ…čĻãŒã‚ることをåŧˇåˆļしぞす。

įžåœ¨ãŽReactãƒĸデãƒĢとナイフã‚ĩイクãƒĢぎčĒŋ整ãĢより、原際ãĢこれを原čŖ…できることがわかりぞした。 @acdliteは過åŽģæ•°é€ąé–“ã“ãŽæŠŸčƒŊãĢ取りįĩ„んでおり、ぞもãĒくRFCを投į¨ŋ

これが可čƒŊãĒぎは、 this.stateがすぐãĢãƒ•ãƒŠãƒƒã‚ˇãƒĨされãĒいためだけであることãĢæŗ¨æ„ã—ãĻください。 すぐãĢãƒ•ãƒŠãƒƒã‚ˇãƒĨされた場合、「古いバãƒŧジョãƒŗã€ãŒčĄ¨į¤ēされãĻイãƒŗã‚ŋナクテã‚Ŗブである間は、ビãƒĨãƒŧぎ「新しいバãƒŧジョãƒŗ」ぎãƒŦãƒŗダãƒĒãƒŗグをバックグナã‚Ļãƒŗドで開始する斚æŗ•ãŒã‚りぞせん。 åŊŧらぎį‹ŦįĢ‹ã—たįŠļæ…‹ãŽæ›´æ–°ã¯čĄįĒã™ã‚‹ã§ã—ょう。

こぎすずãĻをį™ēčĄ¨ã™ã‚‹ã“ã¨ãĢé–ĸしãĻ、 @ acdliteã‹ã‚‰é›ˇã‚’į›—むことはしたくありぞせんが、これが少ãĒくとも少しエキã‚ĩイテã‚ŖãƒŗグãĢčžã“ãˆã‚‹ã“ã¨ã‚’éĄ˜ãŖãĻいぞす。 これはぞだベãƒŧパãƒŧã‚Ļェã‚ĸぎようãĢčžã“ãˆã‚‹ã‹ã€į§ãŸãĄãŒäŊ•ã‚’しãĻいるぎかæœŦåŊ“ãĢわからãĒいようãĢčžã“ãˆã‚‹ã‹ã‚‚ã—ã‚Œãžã›ã‚“ã€‚ äģŠåžŒæ•°ã‹æœˆäģĨ内ãĢäģ–ぎ斚æŗ•ã§į´åž—ã§ãã‚‹ã“ã¨ã‚’éĄ˜ãŖãĻいぞす。ぞた、ReactãƒĸデãƒĢぎ柔čģŸæ€§ã‚’éĢ˜ãčŠ•äžĄã—ãĻいただければ嚸いです。 そしãĻ、į§ãŒį†č§ŖしãĻいる限りでは、įŠļ態ぎ更新をすぐãĢãƒ•ãƒŠãƒƒã‚ˇãƒĨしãĒいことで、少ãĒくとも部分įš„ãĢこぎ柔čģŸæ€§ãŒå¯čƒŊãĢãĒりぞす。

全ãĻぎã‚ŗãƒĄãƒŗト31äģļ

@gaearonã‚’åž…ãŖãĻいぞす。

@Kaybaraxã­ãˆã€é€ąæœĢです;-)

@mweststrateああīŧ į§ãŽæ‚Ēい。 æļŧしい。

ここで手čļŗãĢå‡ēãĻ、同じテã‚Ŗãƒƒã‚¯ã§č¤‡æ•°ãŽsetStateをバッチå‡Ļį†ã—ãŸãŸã‚ã ã¨č¨€ã„ãžã™ã€‚

æĨé€ąã¯äŧ‘暇ãĢãĒりぞすが、おそらくįĢ曜æ—ĨãĢčĄŒããŽã§ã€æœˆæ›œæ—ĨãĢčŋ”äŋĄã—ようと思いぞす。

é–ĸ数enqueueUpdateīŧˆcomponentīŧ‰{
sureInjectedīŧˆīŧ‰;

//ã‚ŗãƒŧドぎさぞざぞãĒ部分īŧˆReactCompositeComponentãĒおīŧ‰
// _renderValidatedComponentīŧ‰renderぎå‘ŧãŗå‡ēしはネ゚トされãĻいãĒいとæƒŗ厚しぞす。
//それがäē‹åŽŸã§ã‚ることをįĸēčĒã—ぞす。 īŧˆã“れは、各トップãƒŦベãƒĢぎ更新ãĢよãŖãĻå‘ŧãŗå‡ēされぞす
// setState、forceUpdateãĒおぎé–ĸ数; äŊœæˆã¨
//トップãƒŦベãƒĢぎã‚ŗãƒŗポãƒŧネãƒŗトぎį ´åŖŠã¯ReactMountでäŋč­ˇã•ã‚ŒãĻいぞす。īŧ‰

ifīŧˆīŧbatchingStrategy.isBatchingUpdatesīŧ‰{
batchingStrategy.batchedUpdatesīŧˆenqueueUpdate、componentīŧ‰;
æˆģる;
}

dirtyComponents.pushīŧˆã‚ŗãƒŗポãƒŧネãƒŗトīŧ‰;
ifīŧˆcomponent._updateBatchNumber == nullīŧ‰{
component._updateBatchNumber = updateBatchNumber + 1;
}
}

@mweststrateわずか2ã‚ģãƒŗトīŧšãã‚Œã¯éžå¸¸ãĢ有劚ãĒčŗĒ問です。
setStateが同期しãĻいる場合、įŠļ態ãĢついãĻ推čĢ–する斚がはるかãĢį°Ąå˜ã§ã‚ることãĢį§ãŸãĄã¯įš†åŒæ„ã—ãĻいるとįĸēäŋĄã—ãĻいぞす。
setStateを非同期ãĢするį†į”ąãŒäŊ•ã§ã‚れ、チãƒŧムがそれを導å…ĨするæŦ į‚šã¨æ¯”čŧƒã—ãĻうぞく反åŋœã™ã‚‹ã‹ãŠã†ã‹ã¯ã‚ã‹ã‚Šãžã›ã‚“。たとえば、įžåœ¨ãŽįŠļ態ãĢついãĻ推čĢ–するぎがé›Ŗしいことや、開į™ē者ãĢã‚‚ãŸã‚‰ã™æˇˇäšąãĒおです。

@mweststrate興å‘ŗæˇąã„ã“ã¨ãĢ、į§ã¯ã“こで同じčŗĒ問をしぞしたīŧš https īŧš //discuss.reactjs.org/t/historic-reasons-behind-setstate-not-being-immediately-visible/8487

į§ã¯å€‹äēēįš„ãĢã“ãŽå•éĄŒãĢついãĻäģ–ぎ開į™ēč€…ãŽæˇˇäšąã‚’įĩŒé¨“しãĻきぞした。 @gaearon時間があれば、これãĢついãĻぎčĒŦ明を垗るぎはį´ æ™´ã‚‰ã—いことです:)

į”ŗしč¨ŗありぞせんが、äģŠåš´ãŽįĩ‚わりであり、GitHubãĒおで、äŧ‘暇前ãĢ取りįĩ„んできたすずãĻぎäŊœæĨ­ã‚’ぞとめようとしãĻ少し遅れãĻいぞす。

į§ã¯ã“ぎ゚ãƒŦッドãĢæˆģãŖãĻそれãĢついãĻč­°čĢ–するつもりです。 しかし、įžåœ¨ã€ this.stateがいつおぎようãĢ更新されるかãĢį›´æŽĨé–ĸäŋ‚する非同期React抟čƒŊãĢ取りįĩ„んでいるため、これは少し動くį›Žæ¨™ã§ã‚‚ありぞす。 äŊ•ã‹ã‚’書くぎãĢ多くぎ時間をč˛ģやしたくはありぞせん。そしãĻ、栚æœŦįš„ãĒäģŽåŽšãŒå¤‰ã‚ãŖたぎで、それを書きį›´ã•ãĒければãĒりぞせん。 ですから、これを開いたぞぞãĢしãĻおきたいぎですが、いつæąē厚įš„ãĒį­”えがå‡ēせるかはぞだわかりぞせん。

だからここãĢã„ãã¤ã‹ãŽč€ƒãˆãŒã‚ã‚Šãžã™ã€‚ これはæąēしãĻ厌全ãĒåŋœį­”ではありぞせんが、äŊ•ã‚‚č¨€ã‚ãĒいよりもåŊšįĢ‹ã¤ã‹ã‚‚しれぞせん。

ぞず、更新をバッチå‡Ļį†ã™ã‚‹ãŸã‚ãĢčĒŋ整を遅らせることが有į›Šã§ã‚ることãĢ同意すると思いぞす。 つぞり、 setState()同期įš„ãĒ再ãƒŦãƒŗダãƒĒãƒŗグは多くぎ場合非劚įŽ‡įš„ã§ã‚ã‚Šã€č¤‡æ•°ãŽæ›´æ–°ãŒčĄŒã‚ã‚Œã‚‹å¯čƒŊ性がéĢ˜ã„ことがわかãŖãĻいる場合は、更新をバッチå‡Ļį†ã™ã‚‹ã“とをお勧めしぞす。

䞋えば、我々はブナã‚Ļã‚ļ内でãĒらclickハãƒŗドナ、およãŗä¸Ąæ–šãŽChildとParentå‘ŧんsetState我々は再ãƒŦãƒŗダãƒĒãƒŗグするåŋ…čĻã¯ã‚りぞせん、 Child 2回äŊŋį”¨ã—、äģŖわりãĢそれらをダãƒŧテã‚ŖとしãĻマãƒŧクし、ブナã‚Ļã‚ļイベãƒŗトをįĩ‚äē†ã™ã‚‹å‰ãĢそれらを一įˇ’ãĢ再ãƒŦãƒŗダãƒĒãƒŗグすることをåĨŊãŋぞす。

あãĒãŸãŒæą‚ã‚ãĻいるぎは、ãĒぜ同じことīŧˆãƒãƒƒãƒå‡Ļį†īŧ‰ã‚’åŽŸčĄŒã§ããĒいぎãĢ、čĒŋ整ぎįĩ‚äē†ã‚’垅たずãĢsetState更新をthis.stateすぐãĢ書きčžŧむことができãĒいぎかということです。 明į™ŊãĒį­”えは1つではãĒいと思いぞすがīŧˆãŠãĄã‚‰ãŽã‚ŊãƒĒãƒĨãƒŧã‚ˇãƒ§ãƒŗãĢもトãƒŦãƒŧドã‚Ēフがありぞすīŧ‰ã€č€ƒãˆã‚‰ã‚Œã‚‹į†į”ąãŒã„くつかありぞす。

内部ぎ一č˛Ģ性をäŋč¨ŧする

stateが同期įš„ãĢ更新されãĻも、 propsは更新されぞせん。 īŧˆčĻĒã‚ŗãƒŗポãƒŧネãƒŗトを再ãƒŦãƒŗダãƒĒãƒŗグするぞでpropsįŸĨることはできぞせん。これを同期įš„ãĢčĄŒã†ã¨ã€ãƒãƒƒãƒå‡Ļį†ã¯ã‚Ļã‚Ŗãƒŗドã‚Ļぎ外ãĢå‡ēぞす。īŧ‰

įžåœ¨ã€ReactãĢよãŖãĻ提䞛されるã‚Ēブジェクトīŧˆ state 、 props 、 refs īŧ‰ã¯ã€å†…部įš„ãĢį›¸äē’ãĢ

įŠļ態だけをäŊŋį”¨ã™ã‚‹å ´åˆã€īŧˆææĄˆã—たようãĢīŧ‰

console.log(this.state.value) // 0
this.setState({ value: this.state.value + 1 });
console.log(this.state.value) // 1
this.setState({ value: this.state.value + 1 });
console.log(this.state.value) // 2

ただし、こぎįŠļ態をč§Ŗ除しãĻいくつかぎã‚ŗãƒŗポãƒŧネãƒŗãƒˆã§å…ąæœ‰ã™ã‚‹åŋ…čĻãŒã‚るため、čĻĒãĢį§ģ動するとしぞす。

-this.setState({ value: this.state.value + 1 });
+this.props.onIncrement(); // Does the same thing in a parent

setState()䞝存する典型įš„ãĒReactã‚ĸプãƒĒでは、これがぞす。

ただし、これはã‚ŗãƒŧドをåŖŠã—ぞすīŧ

console.log(this.props.value) // 0
this.props.onIncrement();
console.log(this.props.value) // 0
this.props.onIncrement();
console.log(this.props.value) // 0

ã“ã‚Œã¯ã€ææĄˆã—ãŸãƒĸデãƒĢでは、 this.stateはすぐãĢãƒ•ãƒŠãƒƒã‚ˇãƒĨされぞすが、 this.propsã¯ãƒ•ãƒŠãƒƒã‚ˇãƒĨされãĒいためです。 ぞた、čĻĒを再ãƒŦãƒŗダãƒĒãƒŗグせずãĢthis.propsをすぐãĢãƒ•ãƒŠãƒƒã‚ˇãƒĨすることはできぞせん。つぞり、バッチå‡Ļį†ã‚’あきらめるåŋ…čĻãŒã‚りぞすīŧˆå ´åˆãĢよãŖãĻは、パフりãƒŧマãƒŗ゚が大嚅ãĢäŊŽä¸‹ã™ã‚‹å¯čƒŊ性がありぞすīŧ‰ã€‚

props īŧˆãžã ãƒ•ãƒŠãƒƒã‚ˇãƒĨされãĻいãĒいīŧ‰ã¨state īŧˆã™ããĢãƒ•ãƒŠãƒƒã‚ˇãƒĨã•ã‚Œã‚‹ã“ã¨ãŒææĄˆã•ã‚ŒãĻいるīŧ‰ãŽãƒ‡ãƒŧã‚ŋã‚’æˇˇåˆã—ãĻ新しいįŠļ態をäŊœæˆã™ã‚‹å ´åˆãĒお、これがおぎようãĢåŖŠã‚Œã‚‹å¯čƒŊ性があるかãĢついãĻぎより垎åĻ™ãĒã‚ąãƒŧ゚もありぞすīŧš https īŧš//github.com/facebook/react/issues/122#issuecomment-81856416。 参į…§ãĢã¯åŒã˜å•éĄŒãŒã‚ã‚Šãžã™īŧš https īŧš//github.com/facebook/react/issues/122#issuecomment-22659651。

これらぎ䞋はぞãŖたくį†čĢ–įš„ではありぞせん。 原際、React Reduxバイãƒŗデã‚Ŗãƒŗグは、Reactå°é“å…ˇã¨éžReactįŠļæ…‹ãŒæˇˇåœ¨ã—ãĻいるため、ぞさãĢこぎį¨ŽãŽå•éĄŒã‚’æŠąãˆãĻいぞしたīŧš https īŧš //github.com/ reactjs / /プãƒĢ/ 99-Reduxぎを反åŋœã•ã›ã€ https://github.com/reactjs/react-redux/issues/292 、 https://github.com/reactjs/redux/issues/1415 、 httpsīŧš//でgithubぎ。 com / reactjs / react-redux / issues / 525。

MobXãƒĻãƒŧã‚ļãƒŧがこれãĢãļつからãĒいį†į”ąã¯ã‚ã‹ã‚Šãžã›ã‚“が、į§ãŽį›´æ„Ÿã§ã¯ã€MobXãƒĻãƒŧã‚ļãƒŧはそぎようãĒã‚ˇãƒŠãƒĒã‚ĒãĢãļつかる可čƒŊ性がありぞすが、č‡Ēåˆ†ãŽã›ã„ã§ã‚ã‚‹ã¨č€ƒãˆãĻいぞす。 あるいは、 propsからあぞりčĒ­ãŋ取らず、äģŖわりãĢMobX可変ã‚Ēブジェクトからį›´æŽĨčĒ­ãŋ取る場合もありぞす。

では、ReactはäģŠæ—ĨこれをおぎようãĢč§ŖæąēしぞすかīŧŸ Reactでは、 this.stateとthis.propsä¸Ąæ–šãŒčĒŋæ•´ã¨ãƒ•ãƒŠãƒƒã‚ˇãƒĨぎ垌ãĢぎãŋ更新されるため、ãƒĒãƒ•ã‚Ąã‚¯ã‚ŋãƒĒãƒŗã‚°ãŽå‰åžŒãŽä¸Ąæ–šã§0がå‡ē力されぞす。 これãĢã‚ˆã‚Šã€æŒãĄä¸Šã’įŠļ態が厉全ãĢãĒりぞす。

はい、これは場合ãĢよãŖãĻは不äžŋです。 į‰šãĢ、単一ぎ場所で厌全ãĒįŠļæ…‹ãŽæ›´æ–°ã‚’čĄ¨ã™æ–šæŗ•ã‚’č€ƒãˆã‚‹ãŽã§ã¯ãĒく、įŠļ態を数回変更したいだけぎ、より多くぎOOバックグナã‚ĻãƒŗドからæĨãĻいるäēē々ãĢとãŖãĻ。 デバッグぎčĻŗį‚šã‹ã‚‰ã¯ã€įŠļ態ぎ更新を集中させる斚が明įĸēã ã¨æ€ã„ãžã™ãŒã€å…ąæ„Ÿã§ããžã™īŧš https īŧš//github.com/facebook/react/issues/122#issuecomment-19888472。

それでも、į‰šãĢãƒŦãƒŗダãƒĒãƒŗグぎäŋĄé ŧã§ãã‚‹æƒ…å ąæēã¨ã—ãĻäŊŋį”¨ã—ãĒい場合は、すぐãĢčĒ­ãŋ取りたいįŠļ態をæ¨Ē向きãĢ変更可čƒŊãĒã‚ĒブジェクトãĢį§ģ動するã‚Ēãƒ—ã‚ˇãƒ§ãƒŗがありぞす。 これは、MobXでできることとãģãŧåŒã˜ã§ã™đŸ™‚ã€‚

äŊ•ã‚’しãĻいるぎかがわかãŖãĻいる場合は、ツãƒĒãƒŧ全äŊ“ã‚’ReactDOM.flushSync(fn)とå‘ŧばれぞす。 ぞだ文書化しãĻいãĒいと思いぞすが、16.xãƒĒãƒĒãƒŧã‚šã‚ĩイクãƒĢぎある時į‚šã§įĸē原ãĢ文書化するäēˆåŽšã§ã™ã€‚ 原際ãĢは、å‘ŧãŗå‡ēし内でį™ēį”Ÿã™ã‚‹æ›´æ–°ãĢ寞しãĻ厌全ãĒ再ãƒŦãƒŗダãƒĒãƒŗグがåŧˇåˆļされるため、äŊŋį”¨ã¯æ…Žé‡ãĢčĄŒã†åŋ…čĻãŒã‚りぞす。 こぎようãĢしãĻ、 props 、 state 、およãŗrefs間ぎ内部整合性ぎäŋč¨ŧをį ´ã‚‹ã“とはありぞせん。

čĻį´„すると、ReactãƒĸデãƒĢは常ãĢ最もį°ĄæŊ”ãĒã‚ŗãƒŧドãĢつãĒがるとは限りぞせんが、内部įš„ãĢ一č˛Ģ性があり、įŠļæ…‹ã‚’æŒãĄä¸Šã’ãĻも厉全です。

同時更新ぎ有劚化

æĻ‚åŋĩįš„ãĢは、Reactはã‚ŗãƒŗポãƒŧネãƒŗトごとãĢ単一ぎ更新キãƒĨãƒŧがあるかぎようãĢ動äŊœã—ぞす。 ã“ã‚ŒãŒã€č­°čĢ–がぞãŖたくį†ãĢかãĒãŖãĻいるį†į”ąã§ã™ã€‚更新がæ­ŖįĸēãĒ順åēã§éŠį”¨ã•ã‚Œã‚‹ã“とは間違いãĒいぎで、 this.stateãĢ更新をすぐãĢ遊į”¨ã™ã‚‹ã‹ãŠã†ã‹ãĢついãĻč­°čĢ–しぞす。 ただし、そうであるåŋ…čĻã¯ã‚りぞせんīŧˆįŦ‘īŧ‰ã€‚

最čŋ‘、į§ãŸãĄã¯ã€ŒéžåŒæœŸãƒŦãƒŗダãƒĒãƒŗグ」ãĢついãĻå¤šããŽã“ã¨ã‚’čŠąã—ãĻきぞした。 それがäŊ•ã‚’意å‘ŗするぎかをうぞくäŧãˆã‚‹ã“とができãĻいãĒいことはčĒã‚ãžã™ãŒã€ãã‚ŒãŒRīŧ†Dぎ性čŗĒです。æĻ‚åŋĩįš„ãĢ有望と思われるã‚ĸイデã‚ĸをčŋŊæą‚ã—ãžã™ãŒã€ååˆ†ãĒ時間をč˛ģやしãĻ初めãĻそぎ意å‘ŗをį†č§Ŗしぞす。

「非同期ãƒŦãƒŗダãƒĒãƒŗグ」ãĢついãĻčĒŦ明しãĻきた1つぎ斚æŗ•ã¯ã€ ReactがsetState()å‘ŧãŗå‡ēしぎį™ēäŋĄå…ƒãĢåŋœã˜ãĻ、イベãƒŗトハãƒŗドナãƒŧ、ネットワãƒŧクãƒŦ゚ポãƒŗ゚、ã‚ĸãƒ‹ãƒĄãƒŧã‚ˇãƒ§ãƒŗãĒおãĢåŋœã˜ãĻį•°ãĒるå„Ē先順äŊã‚’å‰˛ã‚ŠåŊ“ãĻることができるという

ãŸã¨ãˆã°ã€ãƒĄãƒƒã‚ģãƒŧジをå…Ĩ力しãĻいる場合、 TextBoxã‚ŗãƒŗポãƒŧネãƒŗトぎsetState()å‘ŧãŗå‡ēしはすぐãĢãƒ•ãƒŠãƒƒã‚ˇãƒĨするåŋ…čĻãŒã‚りぞす。 ただし、å…Ĩ力中ãĢæ–°ã—ã„ãƒĄãƒƒã‚ģãƒŧジMessageBubbleãƒŦãƒŗダãƒĒãƒŗグをį‰šåŽšãŽã—きい値īŧˆãŸã¨ãˆã°1į§’īŧ‰ãžã§é…らせる斚が、ブロックぎためãĢå…ĨåŠ›ãŒé€”åˆ‡ã‚Œã‚‹ã‚ˆã‚Šã‚‚ãŠãã‚‰ãč‰¯ã„ã§ã—ã‚‡ã†ã€‚įŗ¸ã€‚

į‰šåŽšãŽæ›´æ–°ãŽå„Ē先åēĻを「äŊŽãã€ã™ã‚‹ã¨ã€ãƒŦãƒŗダãƒĒãƒŗグを数ミãƒĒį§’ぎ小さãĒチãƒŖãƒŗクãĢåˆ†å‰˛ã—ãĻ、ãƒĻãƒŧã‚ļãƒŧが気äģ˜ã‹ãĒいようãĢすることができぞす。

こぎようãĒパフりãƒŧマãƒŗ゚ぎ最遊化は、あぞりエキã‚ĩイテã‚ŖãƒŗグでčĒŦ垗力がãĒいようãĢčžã“ãˆã‚‹ã‹ã‚‚ã—ã‚Œãžã›ã‚“ã€‚ 「MobXではこれはåŋ…čĻã‚りぞせん。更新ぎčŋŊčˇĄã¯ã€å†ãƒŦãƒŗダãƒĒãƒŗグを回éŋするぎãĢ十分ãĒ速åēĻã§ã™ã€ã¨č¨€ã†ã“ã¨ãŒã§ããžã™ã€‚ すずãĻぎ場合ãĢåŊ“ãĻはぞるとは思いぞせんīŧˆãŸã¨ãˆã°ã€MobXがおれãģおéĢ˜é€Ÿã§ã‚ãŖãĻも、DOMノãƒŧドをäŊœæˆã—、新しくマã‚ĻãƒŗトされたビãƒĨãƒŧぎãƒŦãƒŗダãƒĒãƒŗã‚°ã‚’čĄŒã†åŋ…čĻãŒã‚りぞすīŧ‰ã€‚ それでも、それがįœŸåŽŸã§ã‚り、čĒ­ãŋ取りと書きčžŧãŋをčŋŊčˇĄã™ã‚‹į‰šåŽšãŽJavaScriptナイブナãƒĒãĢã‚Ēブジェクトを常ãĢナップしãĻã‚‚å•éĄŒãĒã„ã¨æ„č­˜įš„ãĢ判断した場合は、これらぎ最遊化ぎ恊æĩをあぞり受けãĒい可čƒŊ性がありぞす。

ただし、非同期ãƒŦãƒŗダãƒĒãƒŗグはパフりãƒŧマãƒŗ゚ぎ最遊化だけではありぞせん。

たとえば、あるį”ģéĸからåˆĨぎį”ģéĸãĢį§ģ動しãĻã„ã‚‹å ´åˆã‚’č€ƒãˆãĻãŋぞす。 通常、新しいį”ģéĸぎãƒŦãƒŗダãƒĒãƒŗグ中ãĢ゚ピナãƒŧã‚’čĄ¨į¤ēしぞす。

ãŸã ã—ã€ãƒŠãƒ“ã‚˛ãƒŧã‚ˇãƒ§ãƒŗが十分ãĢéĢ˜é€Ÿã§ã‚る場合īŧˆ1į§’äģĨ内īŧ‰ã€ã‚šãƒ”ナãƒŧをį‚šæģ…させãĻすぐãĢ非表į¤ēãĢすると、ãƒĻãƒŧã‚ļãƒŧエク゚ペãƒĒエãƒŗ゚がäŊŽä¸‹ã—ぞす。 さらãĢæ‚ĒいことãĢ、非同期ぎ䞝存é–ĸäŋ‚īŧˆãƒ‡ãƒŧã‚ŋ、ã‚ŗãƒŧド、į”ģ像īŧ‰ãŒį•°ãĒã‚‹č¤‡æ•°ãŽãƒŦベãƒĢぎã‚ŗãƒŗポãƒŧネãƒŗトがある場合、゚ピナãƒŧぎã‚Ģã‚šã‚ąãƒŧドが1つずつįŸ­æ™‚é–“į‚šæģ…することãĢãĒりぞす。 これはčĻ–čĻšįš„ãĢ不åŋĢであり、すずãĻぎDOMãƒĒフロãƒŧぎためãĢ原際ãĢはã‚ĸプãƒĒぎ速åēĻがäŊŽä¸‹ã—ぞす。 ぞた、多くぎ厚型ã‚ŗãƒŧドぎã‚Ŋãƒŧ゚でもありぞす。

åˆĨぎビãƒĨãƒŧをãƒŦãƒŗダãƒĒãƒŗグする単į´”ãĒsetState()ã‚’åŽŸčĄŒã™ã‚‹ã¨ããĢ、更新されたビãƒĨãƒŧぎ「バックグナã‚Ļãƒŗド」でぎãƒŦãƒŗダãƒĒãƒŗグを「開始」できるとäžŋ刊ではãĒいでしょうか。 č‡Ē分でčĒŋ整ã‚ŗãƒŧãƒ‰ã‚’č¨˜čŋ°ã›ãšãĢ、更新ãĢį‰šåŽšãŽã—きい値īŧˆ1į§’ãĒおīŧ‰ã‚’čļ…えた場合ãĢ゚ピナãƒŧã‚’čĄ¨į¤ēするか、新しいã‚ĩブツãƒĒãƒŧ全äŊ“ぎ非同期䞝存é–ĸäŋ‚がæē€čļŗ。 さらãĢ、「垅抟中」ぎ間、「古いį”ģéĸ」はイãƒŗã‚ŋナクテã‚ŖブãĒぞぞでありīŧˆãŸã¨ãˆã°ã€åˆĨぎã‚ĸイテムを選択しãĻį§ģčĄŒã§ããžã™īŧ‰ã€Reactは、時間がかかりすぎる場合ぱピナãƒŧã‚’čĄ¨į¤ēするåŋ…čĻãŒã‚ることをåŧˇåˆļしぞす。

įžåœ¨ãŽReactãƒĸデãƒĢとナイフã‚ĩイクãƒĢぎčĒŋ整ãĢより、原際ãĢこれを原čŖ…できることがわかりぞした。 @acdliteは過åŽģæ•°é€ąé–“ã“ãŽæŠŸčƒŊãĢ取りįĩ„んでおり、ぞもãĒくRFCを投į¨ŋ

これが可čƒŊãĒぎは、 this.stateがすぐãĢãƒ•ãƒŠãƒƒã‚ˇãƒĨされãĒいためだけであることãĢæŗ¨æ„ã—ãĻください。 すぐãĢãƒ•ãƒŠãƒƒã‚ˇãƒĨされた場合、「古いバãƒŧジョãƒŗã€ãŒčĄ¨į¤ēされãĻイãƒŗã‚ŋナクテã‚Ŗブである間は、ビãƒĨãƒŧぎ「新しいバãƒŧジョãƒŗ」ぎãƒŦãƒŗダãƒĒãƒŗグをバックグナã‚Ļãƒŗドで開始する斚æŗ•ãŒã‚りぞせん。 åŊŧらぎį‹ŦįĢ‹ã—たįŠļæ…‹ãŽæ›´æ–°ã¯čĄįĒã™ã‚‹ã§ã—ょう。

こぎすずãĻをį™ēčĄ¨ã™ã‚‹ã“ã¨ãĢé–ĸしãĻ、 @ acdliteã‹ã‚‰é›ˇã‚’į›—むことはしたくありぞせんが、これが少ãĒくとも少しエキã‚ĩイテã‚ŖãƒŗグãĢčžã“ãˆã‚‹ã“ã¨ã‚’éĄ˜ãŖãĻいぞす。 これはぞだベãƒŧパãƒŧã‚Ļェã‚ĸぎようãĢčžã“ãˆã‚‹ã‹ã€į§ãŸãĄãŒäŊ•ã‚’しãĻいるぎかæœŦåŊ“ãĢわからãĒいようãĢčžã“ãˆã‚‹ã‹ã‚‚ã—ã‚Œãžã›ã‚“ã€‚ äģŠåžŒæ•°ã‹æœˆäģĨ内ãĢäģ–ぎ斚æŗ•ã§į´åž—ã§ãã‚‹ã“ã¨ã‚’éĄ˜ãŖãĻいぞす。ぞた、ReactãƒĸデãƒĢぎ柔čģŸæ€§ã‚’éĢ˜ãčŠ•äžĄã—ãĻいただければ嚸いです。 そしãĻ、į§ãŒį†č§ŖしãĻいる限りでは、įŠļ態ぎ更新をすぐãĢãƒ•ãƒŠãƒƒã‚ˇãƒĨしãĒいことで、少ãĒくとも部分įš„ãĢこぎ柔čģŸæ€§ãŒå¯čƒŊãĢãĒりぞす。

Reactぎã‚ĸãƒŧキテクチãƒŖãŽčƒŒåžŒãĢあるæąē厚ãĢついãĻぎį´ æ™´ã‚‰ã—いčŠŗį´°ãĒčĒŦ明。 ありがとう。

マãƒŧク

ありがとう、ダãƒŗ。

į§ã¯â¤ī¸ã“ãŽå•éĄŒã€‚ į´ æ™´ã‚‰ã—いčŗĒ問とį´ æ™´ã‚‰ã—いį­”え。 これはæ‚Ēã„č¨­č¨ˆä¸ŠãŽæąē厚だといつも思ãŖãĻいたぎで、äģŠã¯č€ƒãˆį›´ã•ãĒければãĒã‚Šãžã›ã‚“đŸ˜„

ありがとう、ダãƒŗ。

į§ã¯ãã‚Œã‚’asyncAwesomesetStateīŧšsmileとå‘ŧんでいぞすīŧš

į§ã¯ã™ãšãĻを最初ãĢ非同期で原čŖ…するåŋ…čĻãŒã‚ると思う傞向がありぞす。同期操äŊœãŒåŋ…čĻãĒ場合は、非同期操äŊœã‚’厌äē†ã‚’垅つことでナップしぞす。 非同期ã‚ŗãƒŧドから同期ã‚ŗãƒŧドをäŊœæˆã™ã‚‹æ–šãŒã¯ã‚‹ã‹ãĢį°Ąå˜ã§ã™īŧˆåŋ…čĻãĒぎはナッパãƒŧだけですīŧ‰ã€‚逆ぎ場合īŧˆã‚šãƒŦッド化ãĢ手をäŧ¸ã°ã•ãĒい限り、åŸēæœŦįš„ãĢ厌全ãĒ書き換えがåŋ…čĻã§ã™ã€‚これはぞãŖたくčģŊ量ではありぞせんīŧ‰ã€‚

@gaearončŠŗį´°ãĒčĒŦ明ãĢ感čŦã—ぞすīŧ ãã‚Œã¯é•ˇã„é–“į§ã‚’悊ぞせãĻきぞしたīŧˆã€Œæ­ŖåŊ“ãĒį†į”ąãŒã‚ã‚‹ãĢ違いありぞせんが、čĒ°ã‚‚おれをįŸĨることができぞせん」īŧ‰ã€‚ しかしäģŠã§ã¯ãã‚Œã¯åŽŒå…¨ãĢį†ãĢかãĒãŖãĻおり、これがæœŦåŊ“ãĢæ„č­˜įš„ãĒæąē厚であることがわかりぞす:)。 åš…åēƒã„回į­”をありがとうございぞした。æœŦåŊ“ãĢ感čŦã—ãĻいぞす。

ãžãŸã¯ã€å°é“å…ˇã‹ã‚‰ã‚ãžã‚ŠčĒ­ãŋ取らず、äģŖわりãĢMobX可変ã‚Ēブジェクトからį›´æŽĨčĒ­ãŋ取る場合もありぞす。

これはįĸēかãĢįĸēかãĢįœŸåŽŸã ã¨æ€ã„ぞす。MobXã§ã¯ã€å°é“å…ˇã¯é€šå¸¸ã€å˜ãĒるã‚ŗãƒŗポãƒŧネãƒŗト構成としãĻäŊŋį”¨ã•ã‚Œã€ãƒ‰ãƒĄã‚¤ãƒŗデãƒŧã‚ŋã¯é€šå¸¸ã€å°é“å…ˇã§ã¯ãĒく、ã‚ŗãƒŗポãƒŧネãƒŗãƒˆé–“ã§æ¸Ąã•ã‚Œã‚‹ãƒ‰ãƒĄã‚¤ãƒŗエãƒŗテã‚Ŗテã‚ŖでキãƒŖプチãƒŖされぞす。

įš°ã‚Ščŋ”しãĢãĒりぞすが、おうもありがとうございぞしたīŧ

@gaearončŠŗį´°ã§į´ æ™´ã‚‰ã—いčĒŦ明をありがとう。
ここãĢはぞだäŊ•ã‹čļŗりãĒいもぎがありぞすが、į§ã¯į†č§ŖしãĻいると思いぞすが、įĸēčĒã—たいと思いぞす。

イベãƒŗトが「OutsideReact」ãĢį™ģéŒ˛ã•ã‚ŒãĻいる場合、それはおそらく、たとえばrefぎaddEventListenerをäģ‹ã—ãĻčĄŒã‚ã‚Œã‚‹ã“ã¨ã‚’æ„å‘ŗしぞす。 そぎ垌、バッチå‡Ļį†ã¯čĄŒã‚ã‚Œãžã›ã‚“。
こぎã‚ŗãƒŧãƒ‰ã‚’č€ƒãˆãĻãŋぞしょうīŧš

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }

  componentDidMount() {
    this.refBtn.addEventListener("click", this.onClick);
  }

  componentWillUnmount() {
    this.refBtn.removeEventListener("click", this.onClick);
  }

  onClick = () => {
    console.log("before setState", this.state.count);
    this.setState(state => ({ count: state.count + 1 }));
    console.log("after setState", this.state.count);
  };

  render() {
    return (
      <div>
        <button onClick={this.onClick}>React Event</button>
        <button ref={ref => (this.refBtn = ref)}>Direct DOM event</button>
      </div>
    );
  }
}

「ReactEvent」ボã‚ŋãƒŗをクãƒĒックすると、ã‚ŗãƒŗã‚ŊãƒŧãƒĢãĢæŦĄãŽã‚ˆã†ãĢ襨į¤ēされぞす。
"before setState" 0
"after setState" 0
äģ–ぎボã‚ŋãƒŗ「DirectDOMevent」をクãƒĒックすると、ã‚ŗãƒŗã‚ŊãƒŧãƒĢãĢæŦĄãŽã‚ˆã†ãĢ襨į¤ēされぞす。
"before setState" 0
"after setState" 1

いくつかぎ小さãĒčĒŋæŸģとã‚Ŋãƒŧã‚šã‚ŗãƒŧãƒ‰ãŽé–˛čĻ§ãŽåžŒã€į§ã¯ã“れがãĒぜčĩˇã“るぎかをįŸĨãŖãĻいると思いぞす。
reactはイベãƒŗトぎフロãƒŧを厌全ãĢåˆļåžĄã§ããšã€æŦĄãŽã‚¤ãƒ™ãƒŗトがいつおぎようãĢį™ēį”Ÿã™ã‚‹ã‹ã‚’įĸēčĒã§ããĒいため、「パニックãƒĸãƒŧド」としãĻįŠļ態変更をすぐãĢトãƒĒã‚Ŧãƒŧしぞす。

これãĢついãĻおう思いぞすかīŧŸ īŧšč€ƒãˆīŧš

@ sag1vは少しé–ĸé€Ŗ性がありぞすが、新しいčŗĒ問ぎためãĢæ–°ã—ã„å•éĄŒã‚’é–‹ãæ–šãŒãŠãã‚‰ãæ˜Žįĸēです。 čĒŦ明ぎおこかでīŧƒ11527をäŊŋį”¨ã—ãĻ、これãĢãƒĒãƒŗクしãĻください。

@ sag1v @gaearonは、ここで非常ãĢį°ĄæŊ”ãĒčŋ”äŋĄã‚’くれぞしたhttps://twitter.com/dan_abramov/status/949992957180104704 。 åŊŧぎこれãĢ寞するčĻ‹æ–šã‚‚、į§ãĢもãŖã¨å…ˇäŊ“įš„ãĢį­”えると思いぞす。

@mweststrateæ–°ã—ã„å•éĄŒã‚’é–‹ãã“ã¨ã‚’č€ƒãˆãžã—ãŸãŒã€ã“ã‚ŒãŒã€ŒãĒぜsetState非同期ãĒぎか」というčŗĒ問ãĢį›´æŽĨé–ĸäŋ‚しãĻいることãĢ気äģ˜ããžã—た。
ã“ãŽč­°čĢ–はsetState 「非同期」ãĢする際ぎæąē厚ãĢé–ĸするもぎãĒぎで、いつ、ãĒぜ「同期」ãĢするかをčŋŊ加しようと思いぞした。
į§ãŽæŠ•į¨ŋãŒã“ãŽå•éĄŒãĢé–ĸé€ŖしãĻいることをあãĒたãĢį´åž—させãĒかãŖた場合、į§ã¯æ–°ã—ã„å•éĄŒã‚’é–‹ã„ãĻもかぞいぞせんīŧšwinkīŧš

@Kaybaraxそれは、あãĒたぎčŗĒ問が「_ãĒぜ同期_」ではãĒく「_いつ同期_」だãŖたからです。
į§ãŽæŠ•į¨ŋでčŋ°ãšãŸã‚ˆã†ãĢ、į§ã¯į†į”ąã‚’įŸĨãŖãĻいると思いぞすが、į§

reactはイベãƒŗトぎフロãƒŧを厌全ãĢåˆļåžĄã§ããšã€æŦĄãŽã‚¤ãƒ™ãƒŗトがいつおぎようãĢį™ēį”Ÿã™ã‚‹ã‹ã‚’įĸēčĒã§ããĒいため、「パニックãƒĸãƒŧド」としãĻįŠļ態変更をすぐãĢトãƒĒã‚Ŧãƒŧしぞす

あるį¨Žã€‚ これは、 this.state更新ãĢé–ĸするčŗĒ問とはæ­ŖįĸēãĢはé–ĸé€ŖしãĻいぞせんが。

あãĒãŸãŒæą‚ã‚ãĻいるぎは、Reactがバッチå‡Ļį†ã‚’有劚ãĢする場合です。 Reactはįžåœ¨ã€ReactがįŽĄį†ã™ã‚‹ã‚¤ãƒ™ãƒŗトハãƒŗドナãƒŧ内で更新をバッチå‡Ļį†ã—

イベãƒŗトハãƒŗドナãƒŧがReactãĢよãŖãĻč¨­åŽšã•ã‚ŒãĻいãĒい場合、įžåœ¨ã¯æ›´æ–°ãŒåŒæœŸã•ã‚Œãžã™ã€‚ 垅つぎが厉全かおうか、そしãĻäģ–ぎ更新がすぐãĢčĄŒã‚ã‚Œã‚‹ã‹ãŠã†ã‹ãŒã‚ã‹ã‚‰ãĒいためです。

Reactぎ将æĨぎバãƒŧジョãƒŗでは、こぎ動äŊœã¯å¤‰æ›´ã•ã‚Œãžã™ã€‚ 計į”ģでは、更新をデフりãƒĢトでäŊŽå„Ē先åēĻとしãĻæ‰ąã„ã€æœ€įĩ‚įš„ãĢ合äŊ“しãĻバッチå‡Ļį†ã—īŧˆãŸã¨ãˆã°ã€1į§’äģĨ内īŧ‰ã€ã™ããĢãƒ•ãƒŠãƒƒã‚ˇãƒĨすることを選択しぞす。 čŠŗį´°ãĢついãĻは、 https īŧš

į´ æ™´ã‚‰ã—いīŧ

そぎčŗĒ問と回į­”は、より到達しやすい場所ãĢ文書化するåŋ…čĻãŒã‚りぞす。 į§ãŸãĄã‚’å•“į™ēしãĻくれãĻありがとう。

多くをå­Ļんだ 。 ありがとう

į§ãŽčĻ–į‚šã‚’ã‚šãƒŦッドãĢčŋŊ加しようとしãĻいぞす。 į§ã¯MobXをベãƒŧã‚šãĢしたã‚ĸプãƒĒãĢ数か月取りįĩ„んでおり、ClojureScriptをäŊ•åš´ã‚‚æŽĸį´ĸし、į‹Ŧč‡ĒぎReactぎäģŖæ›ŋ手æŽĩīŧˆRespoとå‘ŧばれるīŧ‰ã‚’äŊœæˆã—ぞした。非常ãĢįŸ­ã„時間でしたが、初期ãĢReduxをčŠĻし、ReasonMLãĢčŗ­ã‘ãĻいぞす。

Reactとé–ĸ数型プログナミãƒŗグīŧˆFPīŧ‰ã‚’įĩ„ãŋ合わせる際ぎ中åŋƒįš„ãĒã‚ĸイデã‚ĸは、FPぎæŗ•å‰‡ãĢ垓う゚キãƒĢをäŊŋį”¨ã—ãĻ、デãƒŧã‚ŋをビãƒĨãƒŧãĢãƒŦãƒŗダãƒĒãƒŗグできるようãĢすることです。 į´”į˛‹é–ĸ数ぎãŋをäŊŋį”¨ã™ã‚‹å ´åˆã€å‰¯äŊœį”¨ã¯ã‚りぞせん。

Reactはį´”į˛‹é–ĸ数ではありぞせん。 Reactは、ã‚ŗãƒŗポãƒŧネãƒŗト内ãĢロãƒŧã‚ĢãƒĢįŠļ態をįĩ„ãŋčžŧむことで、DOMやそぎäģ–ぎブナã‚Ļã‚ļãƒŧAPIīŧˆMobXãĢも寞åŋœīŧ‰ãĢé–ĸé€ŖするさぞざぞãĒナイブナãƒĒãƒŧã¨å¯žčŠąã§ãã‚‹ãŸã‚ã€Reactは不į´”ãĢãĒりぞす。 ただし、ClojureScriptでčŠĻしãĻãŋぞしたが、Reactがį´”į˛‹ãĒ場合、副äŊœį”¨ãŽã‚ã‚‹æ—ĸ存ぎナイブナãƒĒとぎやり取りが非常ãĢé›Ŗしいため、įŊåŽŗãĢãĒる可čƒŊ性がありぞす。

したがãŖãĻ、Respoīŧˆį§č‡ĒčēĢぎã‚ŊãƒĒãƒĨãƒŧã‚ˇãƒ§ãƒŗīŧ‰ã§ã¯ã€įŸ›į›žã—ãĻいるようãĢčĻ‹ãˆã‚‹2つぎį›Žæ¨™ãŒã‚りぞした。1īŧ‰ view = f(store)ãĒぎで、ロãƒŧã‚ĢãƒĢįŠļ態は期垅されぞせん。 2īŧ‰ã‚°ãƒ­ãƒŧバãƒĢãƒŦデãƒĨãƒŧã‚ĩãƒŧですずãĻぎã‚ŗãƒŗポãƒŧネãƒŗトUIįŠļ態をプログナムするぎはåĨŊきではありぞせん。それは、įļ­æŒã™ã‚‹ãŽãŒé›Ŗしい可čƒŊ性があるためです。 最垌ãĢ、 pathsしãĻグロãƒŧバãƒĢ゚トã‚ĸでã‚ŗãƒŗポãƒŧネãƒŗトぎįŠļ態をįļ­æŒã™ã‚‹ãŽãĢåŊšįĢ‹ã¤ã‚ˇãƒŗã‚ŋãƒƒã‚¯ã‚šã‚ˇãƒĨã‚Ŧãƒŧがåŋ…čĻã§ã‚ることがわかりぞした。そぎ間、ClojureマクロをäŊŋį”¨ã—ãĻã‚ŗãƒŗポãƒŧネãƒŗト内ãĢįŠļ態ぎ更新を書きčžŧãŋぞす。

つぞり、į§ãŒå­Ļんだことは、ロãƒŧã‚ĢãƒĢįŠļ態は開į™ēč€…ã‚¨ã‚¯ã‚šãƒšãƒĒエãƒŗ゚抟čƒŊであり、そぎ下ãĢは、エãƒŗジãƒŗãŒæˇąã„ãƒŦベãƒĢã§æœ€éŠåŒ–ã‚’åŽŸčĄŒã§ãã‚‹ã‚ˆã†ãĢするグロãƒŧバãƒĢįŠļ態がåŋ…čĻã§ã™ã€‚ それで、MobXぎäēē々はOOPをåĨŊãŋぞす、それは開į™ēč€…ãŽįĩŒé¨“ぎためですか、それともエãƒŗジãƒŗぎためですかīŧŸ

ãĄãĒãŋãĢ、あãĒたがそれをčĻ‹é€ƒã—た場合ãĢ備えãĻ、į§ã¯Reactとそぎ非同期抟čƒŊぎ将æĨãĢついãĻčŠąã—ãžã—ãŸīŧš
https://reactjs.org/blog/2018/03/01/sneak-peek-beyond-react-16.html

ダãƒŗ、あãĒたはį§ãŽã‚ĸイドãƒĢです.....おうもありがとう。

こぎペãƒŧジはåŊšãĢįĢ‹ãĄãžã—たかīŧŸ
0 / 5 - 0 評価