https://facebook.github.io/react/blog/2013/11/05/thinking-in-react.htmlãããã®äŸãè©ŠããŠãããšããäžåœèªã®æŒé³å ¥åã¡ãœããã§å ¥åããã挢åã¯ã次ã®ãããªå€ãã®ã¬ã³ããªã³ã°ãèµ·åããŸãã ïŒ
å®ã¯æŒ¢åã確èªããåã«çºç ²ããªããšæããŸãã
次ã«ãå¥ã®çš®é¡ã®å ¥åæ¹æ³ã§ããwubiå ¥åæ¹æ³ãè©ŠããŸããã次ã®ããã«ãªããŸããã
ãããå€ã§ãã ã ããç§ã¯jQueryã§ãã¹ããã
ã¹ããŒã¹ããŒãæŒããŠæåã確èªããåŸã§ã®ã¿ã keyup
ã€ãã³ããçºçããŸãã
jQuery keyup
ãšreact onChange
ã®å®è£
ã§ã¯ç°ãªãå¯èœæ§ãããããšã¯ç¥ã£ãŠããŸãããjQuery keyup
ãreactã®onChange
ã§ã¯ãªã挢åãåŠçããæ¹æ³ãæåŸ
ããŠããŸã
cc @salier :) âããã§äœããã¹ãã§ããïŒ
IMEæååãã³ãããããããŸã§onChange
ãèµ·åããã¹ãã§ã¯ãªããšæããŸãã
ChangeEventPlugin
ãããåŠçãã1ã€ã®æ¹æ³ã¯ã compositionstart
ãšcompositionend
éã®ãã¹ãŠã®input
ã€ãã³ããç¡èŠããããã«input
ã€ãã³ãã䜿çšããããšã§ãã次ã®compositionend
ã
SimplifiedPinyinãš2-SetKoreanã䜿çšããŠOSXChromeãšFirefoxã§ç°¡åãªãã¹ããè¡ããŸããããã€ãã³ãã®é åºãšããŒã¿ã¯ååã«æ£ããããã§ãã ïŒIEéåœèªã§åé¡ãçºçãããšäºæž¬ããŠããŸããã幞éã«ãªããããããŸãããïŒ
Google Input Toolsæ¡åŒµæ©èœãªã©ã®ä»£æ¿å ¥åæ¹æ³ã§åŒãç¶ãåé¡ãçºçããå¯èœæ§ããããšæããŸãããåé¿çãããå¯èœæ§ããããŸãã
ããã¯ãã©ãã³èªã®åŒèšŒæ³æåã®å
¥åæ¹æ³ã«ã圱é¿ããŸãã e
ãé·æŒãããŠããããªã¢ã³ãã䜿çšããããšã§ãããããã§ã¯å€±æããŠããŸãã
ç³ãèš³ãããŸããããããã¯é¢ä¿ããªãããã§ãã è¬çœªããããŸãã
æŽæ°ã¯ãããŸããïŒ ãã®åé¡ã«ãèŠããã§ããŸãã
çŸåšã¯ãããŸããâããã¯çŸæç¹ã§ã¯åªå 床ãé«ããããŸããã 誰ãããããä¿®æ£ããããšã«é£ã³èŸŒãã ãããã«ãªã¯ãšã¹ããèŠãŠåãã§ããŸãã
@salier IEã¯compositionend
åŸã«input
ã€ãã³ããçºçãããªãããã§ãã IE11ãšWindows10ã®Edgeã§ãã¹ãããŸãããChromeãšFirefoxã§æ£ããèµ·åããŸãã
ããªãã¡9ã§ã¯ã挢åãååºŠå ¥åãããšãChangeã€ãã³ããäœåºŠãçºçããŸã
ããã«ã¡ã¯ãFacebookã®äººã¯ãå®éã«ã¯ãã®åé¡ã¯æ·±å»ãªåé¡ãçºçããŸããæã
ã¯äžåœã®å
¥åãšéåæå
¥åãæŽæ°ããããšã¯ã§ããŸããã
ããšãã°ããã¹ãŠã®ãã£ãŒãããã¯ãéåæã§æŽæ°ããããããæµæåå¿ããŒã¿ãœãŒã¹ãreduxã®ãããªã¹ãã¢ã䜿çšããããšã¯ã§ããŸããã
ãã®åé¡ã瀺ãæãç°¡åãªäŸã次ã«ç€ºããŸããsetTimeoutã䜿çšããŠéåææŽæ°ãå®è¡ããŸãã
https://jsfiddle.net/liyatang/bq6oss6z/1/
ãããè¿ éã«ä¿®æ£ããŠãäœåºŠãäœåºŠãåé¿ããããã®åªåãç¡é§ã«ããªãããã«ããŠãã ããã
ããããšãã
ãããç§ã®åé¿çã§ãã 誰ããåãåé¡ã«çŽé¢ããŠãããªããããªãã¯èŠãããšãã§ããŸã
compositionstart
compositionend
ã€ãã³ããšonchange
ã€ãã³ãã®åé¡ã§äžåœèªã®IMEãå
¥åãããªãããã«ããæ¹æ³ããã¢ããç°¡åãªäŸãäœæããŸããã
ãªã³ã¯ã¯æ¬¡ã®ãšããã§ãïŒ https ïŒ
@eyesofkidsçŽ æŽãããä»äºãããã¯å
¥åãtextarea ...ã®onChange
ã®ããã©ã«ãå®è£
ãšããŠäœæã§ããŸãã
ãããã£ã ïŒ
ç§ã¯åãåé¡ã«ã¶ã€ãã£ãŠããŸããããããŠ@eyesofkidsã®åé¿çã¯å®å šã«æ©èœããŸãïŒããããšãïŒïŒã
åé¿çãè¬ããåŸãç§ã¯Reactã®ãœãŒã¹ã³ãŒãã«é£ã³èŸŒãã§ãå°ãªããšãããã«å¯Ÿãã倱æãããã¹ããè¿œå ããããšããŸãããåŸã§ã©ã€ãã©ãªã«æåŸ ãããåäœãè¿œå ããããšæã£ãŠããŸããããå éšã«äžæ £ããªäººã«ãšã£ãŠã¯å°ãè€éã«æããŸãã
åœåã ChangeEventPlugin
ãã§ã«å©çšå¯èœãªãã®ãšåæ§ã®ãã¹ããæ©èœããããšãæåŸ
ããŠããŸãããã€ãŸãããã€ãã£ãã®compositionStart
/ compositionUpdate
ãã·ãã¥ã¬ãŒããã onChange
ã³ãŒã«ããã¯ããªãããšã確èªããŸããã解éããã; ãŸãã onChange
ãã§ãã¯ã¯ã compositionEnd
ãã·ãã¥ã¬ãŒããããå Žåã«ã®ã¿çºçããŸãã ãã ããããã¯æ©èœããŠããªãããã§ãã
ãããã£ãŠã ChangeEventPlugin.extractEvents()
ããã§ãã¯ããããšã¯ã SelectEventPlugin
ãã¹ãã§è¡ãããã®ãšåæ§ã«ãå®è¡å¯èœãªã¢ãããŒãã«ãªããšèããŠããŸããã ããã§ã¯ãäœããã®çç±ã§ãã€ãã³ããæœåºãããšãã«åžžã«undefined
ååŸããŸãã
åèãŸã§ã«ãããã¯_ChangeEventPlugin-test.js_å
ã§è©Šãããã¹ãã³ãŒãã§ãã
var EventConstants = require('EventConstants');
var ReactDOMComponentTree = require('ReactDOMComponentTree');
var topLevelTypes = EventConstants.topLevelTypes;
function extract(node, topLevelEvent) {
return ChangeEventPlugin.extractEvents(
topLevelEvent,
ReactDOMComponentTree.getInstanceFromNode(node),
{target: node},
node
);
}
function cb(e) {
expect(e.type).toBe('change');
}
var input = ReactTestUtils.renderIntoDocument(
<input onChange={cb} value='foo' />
);
ReactTestUtils.SimulateNative.compositionStart(input);
var change = extract(input, topLevelTypes.topChange);
expect(change).toBe(null);
ãããã®ãã¹ããã©ã®ããã«ãããã°ããã®ãæ£ç¢ºã«ã¯ããããªãã®ã§ã¯ãªãããšæããŸããããããªããšãäœãèµ·ãã£ãŠããã®ããããæ確ã«ææ¡ã§ããŸãã é²ãæ¹ããã®ä»ã®æéã«ã€ããŠã®ã¬ã€ãã³ã¹ãããã ããã°å¹žãã§ãã
Chrome 53+ã§åé¿çãçªç¶å£ãã compositionend
ãèµ·åãããé åºãå€æŽããããããç¡å¹ã«ãªã£ãŠããããã§ãã以åtextInput
åã«çºçããŠããŸããããçŸåšã¯textInput
ãŸãã ãã®çµæãã³ã³ããžã·ã§ã³äžã«change
ãäžæ¢ãããŠãã
https://github.com/suhaotian/react-inputå€å誰ããå©ãã
Chromev53ã«ã¯ããªãããŒãªãœãªã¥ãŒã·ã§ã³ããããŸãã compositionend
ãçºçããåŸã«handlechangeãåŒã³åºãããã
handleComposition = (event) => {
if(event.type === 'compositionend'){
onComposition = false
//fire change method to update for Chrome v53
this.handleChange(event)
} else{
onComposition = true
}
}
ããã§ãã¢ã確èªããŠãã ããïŒ https ïŒ
@chenxsanããªãã¯è§£æ±ºçãèŠã€ããŸãããïŒ
CompositionStartãæ€åºããå€æ°ãtrueã«çããããããšãã§ããŸãã
次ã«ãonChangeã§èšå®ããå€æ°ã䜿çšããŠãã¯ãšãªãå®è¡ããå¿
èŠããããã©ããã確èªããŸã
ïŒ8683ã§å¶åŸ¡ã³ã³ããŒãã³ãã®æ°ããåé¡ã
å¶åŸ¡ãããŠããªãã³ã³ããŒãã³ããšå¶åŸ¡ãããŠããã³ã³ããŒãã³ãïŒinputãtextareaïŒã®äžæçãªãœãªã¥ãŒã·ã§ã³ã¯ã react-compositioneventã«ã¢ããããŒããããŸãã
https://github.com/facebook/react/pull/8438ãå®çŸãããŸãããã
@yesmeckã¯ãã®ãã¥ãŒã¹ãèŠãŠãšãŠã幞ãã§ãã
ãã¹ãã¯Webkitã®ã¿ã«çŠç¹ãåœãŠãŠããã®ãèŠãŸããããChromeã¯53+以éã«compositionend
ã€ãã³ãããªã¬ãŒã®é åºãå€æŽãããããChromeãšSafariã«åããå¿
èŠããããŸãã
@ eyesofkids53æ³æªæºã®Chromeã®æ°ãããã¹ãã±ãŒã¹ãè¿œå ããŸããã
ç«ã«çæãè¿œå ããããã«ãç§ã¯ãã®åé¡ãåé¿ããããšããŸããããçŸåšã®ããŒãžã§ã³ã®iOSãµãã¡ãªãæ¥æ¬ã®ã²ãããªIMEã䜿çšããŠãããšãã«compositionend
ã€ãã³ããããªã¬ãŒããªãããšãçºèŠããŸãããããã¯æå³çãªãã®ã ãšæããŸããäœæ²ã¡ãã¥ãŒãéããããŠããªãããã§ãã
@eyesofkidsã®äŸã§ã¯ãinputValueãæŽæ°ãããããšã¯ãããŸããããç§ã«ãšã£ãŠã¯https://github.com/zhaoyao91/react-optimistic-inputã§æ¥æ¬ã®IMEã®åé¡ãä¿®æ£ãããŠã
ããã«å¯Ÿãã解決çãæ¢ããŠãã人ã®ããã«ãããã«äœ¿çšã§ããã³ã³ããŒãã³ãããããŸãã https://github.com/aprilandjan/react-starter/blob/test/search-input/src/components/SearchInput.jséåžžã®ããã¹ãå ¥åèŠçŽ ã®ä»£ããã«äœ¿çšããã ãã§ããã¹ãŠåé¡ãããŸããã
@ zhaoyao91ããªãã®åé¿çã¯ããŸããããŸãïŒ ããããšãã
ããã¿ããªãã®åé¡ã®ããã€ãã®ãã¥ãŒã¹ïŒ
onChangeã®èµ·åãé »ç¹ã«çºçããŠãåé¡ãçºçããããšã¯ãã£ãã«ãªããããåªå 床ã¯é«ããããŸããã ã¢ããªã®ã©ãã§åé¡ãçºçããŠããŸããïŒ
@sophiebitsç³ãèš³ãããŸããã誀ã£ãŠãXããã¯ãªãã¯ããŸããã ããã«ãããå€æŽã€ãã³ããã³ãã©ãŒã§äœ¿çšããããã£ã«ã¿ãªã³ã°æäœãŸãã¯ãµãŒããŒã³ãŒã«ããã¯ãããå Žåãããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãã https://github.com/facebook/react/issues/3926#issuecomment -316049951ã«ç€ºãããŠããã¢ãããŒãã¯ãå¶åŸ¡ãããŠããªãå ¥åãŸãã¯ãã€ãã£ãå ¥åã«å¯Ÿããåªããåé¿çã§ãããReactã§å¶åŸ¡ãããå ¥åã«é©åã«ãããã³ã°ãããŸããã ãã®ã¹ã¬ããã®äžéšãPRãéçºããããšããããå éšãå°ãè€éã§ããããšãããã£ãããã§ãããããŒã ã®ãšã³ãžãã¢ãããè¿ éã«äœæ¥ã§ããã®ã§ã¯ãªãã§ããããã https://github.com/facebook/react/issues/8683ã¯ãå®éã®åé¡IMOã®ã¯ããã«åªãã説æã§ãã
誰ããç§ãç解ããã®ãæäŒã£ãŠãããŸãããïŒåé¡ã¯å³å¯ã«éäžã®äœåãªonChange
åŒã³åºãã«ãããŸããïŒ ãããšããæçµçã«ééã£ãå€ãååŸããŸããïŒ
onChange
ãåŒã³åºãããåæ°ã«é¢ããã¢ãµãŒã·ã§ã³ãåé€ãããšã httpsïŒ//github.com/facebook/react/pull/8438ã§ã®ä¿®æ£è©Šè¡ã®ãã¹ãã«åæ ŒãonChange
åŒã³åºãã«é¢ãããã®ã ãšæããŸãã
äœåãªonChangeåŒã³åºãã¯ãããŸãããæåŸã«èª€ã£ãå€ãååŸããŠããã ãã§ãonCompositionã®åé¡ã®ããã§ãã
@crochefluidããã«å¯ŸããŠå€±æãããã¹ããäœæã§ããŸããïŒ ïŒ8438ãããããšããããšãšäŒŒãŠããŸãã ãã®ãã¹ãã§ã¯ã誀ã£ãå€ã¯ãããŸããã§ããã
@gaearonãã£ãŠã¿ãŸãã ãµãã¡ãªïŒmac / IOSïŒã§ãã®ãã¹ããè©ŠããŸãããïŒ
ããã¯ããŒããã¹ãã§ãããããŸããŸãªãã©ãŠã¶ãããã€ã¹ãããã£ããã£ãããã·ãŒã±ã³ã¹ããšã³ã³ãŒãããŸãã ãã®ãœãŒã¹ãåç §ããŠãã ããã 倱æããŠããã·ãŒã±ã³ã¹ãè¿œå ããå¿ èŠããããŸãã
ãããã£ãŠããã®åé¡ã¯è¿œå ã®onChangeåŒã³åºãã«é¢ãããã®ã ãšæããŸãã
äžåºŠã
ç§ã¯ãŸã ãã®åé¡ãæ±ããŠããŸãã ãã®åé¡ã¯3幎ééããŠããããã§ãããReactã¯çŸåšãå¶åŸ¡ãããã³ã³ããŒãã³ãã§ã®äžåœèªå ¥åããµããŒãããŠããŸããïŒ
ãããæ¥æ¬èªã§ç¹å®ã®æåã§èŠãŠããŸã...
ãããç§ã®åé¡ãåçŸããã³ãŒããµã³ãããã¯ã¹ã§ãã ãã©ãŒã ã«é¢é£ããŠããããã§ãã å ¥åãçŽæ¥äœ¿çšããããšã¯åé¡ãããŸããã
ç§ã¯ããã€ãã®ã±ãŒã¹ãè¿œå ããŸããïŒ
åå¿ç¶æ
ãšãã¬ãŒã³å
¥åã®äœ¿çšã¯åé¡ãããŸãã
åå¿ç¶æ
ããã¬ãŒã³ãã©ãŒã ããã¬ãŒã³å
¥åã®äœ¿çšã¯åé¡ãããŸãã
åäœããŠããªãã³ã³ããã¹ãããŒã¹ã®ãã©ãŒã ã³ã³ããŒãã³ãã䜿çšããŠããŸãã ã³ã³ããã¹ãé¢é£ã®åé¡ã§ããå¯èœæ§ããããŸãã
åé¡ã¯è§£æ±ºããŸããïŒcodepenã§åäœãããŸããã äœããã®çç±ã§ãïŒpropsïŒ=>ãæž¡ããšãã«ãã³ã³ããŒãã³ããšããŠãinputããæž¡ãããšãæ©èœããŸããããªãã£ãã
誰ããéããäœã§ãããã«ã€ããŠã®èããæã£ãŠããŸããïŒ
å®éãç§ãè©ŠããŸããïŒ
äœå
<Field {...otherProps} component="input" />
åäœããŸãã
<Field {...otherProps} component={(props) => <input {...props} />} />
å¥åŠãªããšã«ååã«æ©èœããŸã
const WrappedInput = (props) => <input {...props} />
...
<Field {...otherProps} component={WrappedInput} />
æããã«ãç§ãç解ããŠããªãéæ³ãããã§èµ·ãã£ãŠããŸãã ð
æŽæ°ã¯ãããŸããïŒ
IMEãæå¹ã«ãããšã誀ã£ãçµæãçºçããããã§ã
@otakustayãšåãåé¡ãçºçããŸãã
IMEå
¥åã§å¶åŸ¡ãããå
¥åããµããŒãããããšã¯äžå¯èœã®ããã§ãã ã€ãã³ãã®ã·ãŒã±ã³ã¹ã次ã®ããã«è¿œè·¡ããŸããã
w
value
å±æ§ãä»ããŠinput
äŒæãããŸããw
æååããããŸãw
æååããããŸãa
a
ã®æååã¯ãIMEãããã¡ã®æååãšçµåããŠã wwa
ãçæããŸãããã°ã¯ã次ã®åæç»åŸã®compositionUpdateã€ãã³ãã®15ms以äžåŸã«å
¥åãåã¬ã³ããªã³ã°ãããå Žåã«ã®ã¿çºçããããšã«æ°ã¥ããŸããã
ä»ã®ãšãããç§ã®å¯äžã®è§£æ±ºçã¯ãå¶åŸ¡ãããå ¥åããåãæ¿ããããšã§ãã
ç·šéïŒããã¯åçŽãªè€è£œã§ãïŒ https ïŒ
Edit2 ïŒãããç§ã®ããããŒãªåé¿çã§ãïŒ https ïŒ //jsfiddle.net/m792qtys/ ccïŒ
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ
æŽæ°??
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ
åç¶ãšããŸãããç§ã¯ãã®è³ªåã«çŽé¢ããŸãã
èå³æ·±ãããšã«ãåé¡ã¯è€æ°åã®onChangeã ãã§ã¯ãªãããã§ãã onCompositionStart
ãšonCompositionEnd
éã«setStateããªãå Žåãreactã¯å€ããã®ãŸãŸãå¶åŸ¡ãããŸãã ãã®ã¢ã¯ã·ã§ã³ã«ãããæ§æãäžæãããŸãã ã€ãŸãã onCompositionEnd
ã€ãã³ããçºçããªãããšãæå³ããŸã......ïŒééã£ãŠããå Žåã¯plzãšèšã£ãŠãã ããïŒããããç¶æ
ãããã«å€æŽããããšããã§ããŸããïŒããã§ãªãå Žåã¯ãåé¡ã«çŽé¢ããå¿
èŠããããŸã@ knubieã®èšåïŒã ããã§ã®è€è£œïŒãååå¶åŸ¡ããããã³ã³ããŒãã³ãã®ããã«èŠããŸãïŒïŒ https ïŒ
ããããç§ã¯ãã®åé¡ã5幎éä¿®æ£ãããªãããšã«ãšãŠãé©ããŠããŸãð¢
@hellendag IMEæååãã³ãããããããŸã§ãonChangeãèµ·åããã¹ãã§ã¯ãªããšæããŸãã
ã³ã³ããŒãã³ãããã³ããããããŠããªããIMEæååãç¥ãããå Žåããããããããã¯æå¹ãªè§£æ±ºçã§ã¯ãªããšæããŸããããšãã°ããŠãŒã¶ãŒãå ¥åãããšãã«ãªã¹ãå ã®ãªãã·ã§ã³ããã£ã«ã¿ãªã³ã°ããŸãã
ãã®ä»ã®ã¹ã¬ããã§äœ¿çšããŠããã¢ãããŒãããã®åé¡ã«ã¶ã€ãã人ã«åœ¹ç«ã€ãã©ããã¯ããããŸãããã念ã®ããã«ãªã³ã¯ã瀺ããŸãïŒ //github.com/facebook/react/issues/13104#issuecomment -691393940
æŽæ°ã¯ãããŸããïŒ
æãåèã«ãªãã³ã¡ã³ã
ããã«ã¡ã¯ãFacebookã®äººã¯ãå®éã«ã¯ãã®åé¡ã¯æ·±å»ãªåé¡ãçºçããŸããæã ã¯äžåœã®å ¥åãšéåæå ¥åãæŽæ°ããããšã¯ã§ããŸããã
ããšãã°ããã¹ãŠã®ãã£ãŒãããã¯ãéåæã§æŽæ°ããããããæµæåå¿ããŒã¿ãœãŒã¹ãreduxã®ãããªã¹ãã¢ã䜿çšããããšã¯ã§ããŸããã
ãã®åé¡ã瀺ãæãç°¡åãªäŸã次ã«ç€ºããŸããsetTimeoutã䜿çšããŠéåææŽæ°ãå®è¡ããŸãã
https://jsfiddle.net/liyatang/bq6oss6z/1/
ãããè¿ éã«ä¿®æ£ããŠãäœåºŠãäœåºŠãåé¿ããããã®åªåãç¡é§ã«ããªãããã«ããŠãã ããã
ããããšãã
ãããç§ã®åé¿çã§ãã 誰ããåãåé¡ã«çŽé¢ããŠãããªããããªãã¯èŠãããšãã§ããŸã