React: IME ์ž‘์„ฑ์ด ๋๋‚˜๊ธฐ ์ „์— ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๊ฐ€ ์ถ”๊ฐ€๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2015๋…„ 05์›” 21์ผ  ยท  48์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react

์ถ”๊ฐ€ ์„ธ๋ถ€ ์ •๋ณด

  • ์ถ”๊ฐ€ ์„ธ๋ถ€ ์‚ฌํ•ญ ๋ฐ ์žฌํ˜„ ๋ถ„์„๊ณผ ์œ ์‚ฌํ•œ ํ† ๋ก  : https://github.com/facebook/react/issues/8683
  • ์ˆ˜์ •์„์œ„ํ•œ ์ด์ „ ์‹œ๋„ : https://github.com/facebook/react/pull/8438 (์ผ๋ถ€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜์ง€๋งŒ ์ˆ˜์ •์— ๋Œ€ํ•ด ํ™•์‹ ํ•˜๊ธฐ์— ์ถฉ๋ถ„ ํ•จ)

์›๋ž˜ ๋ฌธ์ œ

https://facebook.github.io/react/blog/2013/11/05/thinking-in-react.html ์—์„œ์ด ์˜ˆ์ œ ๋ฅผ ์‹œ๋„ ํ•  ๋•Œ ์ค‘๊ตญ์–ด ๋ณ‘์Œ ์ž…๋ ฅ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž…๋ ฅ ๋œ ์ค‘๊ตญ์–ด ๋ฌธ์ž๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ๋ Œ๋”๋ง์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. :

screen shot 2015-05-21 at 14 04 36

์‚ฌ์‹ค ๋‚˜๋Š” ํ•œ์ž๋ฅผ ํ™•์ธํ•˜๊ธฐ ์ „์— ๋ฐœ์‚ฌ๋˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์ž…๋ ฅ ๋ฐฉ๋ฒ•-wubi ์ž…๋ ฅ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

screen shot 2015-05-21 at 14 17 15

๊ทธ๊ฒƒ๋„ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ jQuery ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ

screen shot 2015-05-21 at 14 05 12

์ŠคํŽ˜์ด์Šค ๋ฐ”๋ฅผ ๋ˆŒ๋Ÿฌ ๋ฌธ์ž๋ฅผ ํ™•์ธํ•œ ํ›„์— ๋งŒ keyup ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

jQuery keyup ๊ณผ react onChange ๊ฐ„์— ์ฐจ์ด๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ jQuery keyup ๊ฐ€ react์˜ onChange ๋Œ€์‹  ์ค‘๊ตญ์–ด ๋ฌธ์ž๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

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

์•ˆ๋…•ํ•˜์„ธ์š”, Facebook ์—ฌ๋Ÿฌ๋ถ„, ์‚ฌ์‹ค์ด ๋ฌธ์ œ๋Š” ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ฅผ ์ผ์œผ ํ‚ต๋‹ˆ๋‹ค. ์ค‘๊ตญ์–ด ์ž…๋ ฅ๊ณผ ๋น„๋™๊ธฐ ์ ์œผ๋กœ ์ž…๋ ฅ์„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ํ”ผ๋“œ๋ฐฑ์ด ๋น„๋™๊ธฐ ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์„ฑ ๋ฐ˜์‘ ๋ฐ์ดํ„ฐ ์†Œ์Šค ๋˜๋Š” redux์™€ ๊ฐ™์€ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์€์ด ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. setTimeout์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
https://jsfiddle.net/liyatang/bq6oss6z/1/

์ด ๋ฌธ์ œ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ ์—ฌ๊ธฐ์ €๊ธฐ์„œ ๋ฐ˜๋ณตํ•ด์„œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋…ธ๋ ฅ์„ ๋‚ญ๋น„ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌ.

๋‚ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๋ฉด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

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

cc @salier :) โ€“ ์—ฌ๊ธฐ์„œ ๋ฌด์—‡์„ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

IME ๋ฌธ์ž์—ด์ด ์ปค๋ฐ‹ ๋  ๋•Œ๊นŒ์ง€ onChange ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ChangeEventPlugin ์—์„œ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ compositionstart ์—์„œ compositionend ์‚ฌ์ด์˜ ๋ชจ๋“  input ์ด๋ฒคํŠธ๋ฅผ ๋ฌด์‹œํ•œ ๋‹ค์Œ ์ฆ‰์‹œ input ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ compositionend .

OSX Chrome๊ณผ Firefox์—์„œ Simplified Pinyin๊ณผ 2-Set Korean์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ๋น ๋ฅธ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๋Š”๋ฐ ์ด๋ฒคํŠธ ์ˆœ์„œ์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ •ํ™• ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. (IE Korean์— ๋ฌธ์ œ๊ฐ€์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€๋งŒ ์šด์ด ์ข‹์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.)

Google ์ž…๋ ฅ๊ธฐ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๊ฐ™์€ ๋Œ€์ฒด ์ž…๋ ฅ ๋ฐฉ๋ฒ•์— ๊ณ„์† ๋ฌธ์ œ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋˜ํ•œ ๋ผํ‹ด ์–ธ์–ด์— ๋Œ€ํ•ด ๋ณ€์ฆ๋ฒ• ๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. e ๊ธธ๊ฒŒ ๋ˆ„๋ฅธ ๋‹ค์Œ ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์—ฌ๊ธฐ์„œ๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ จ์ด์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ๋กœ๋„ ๊ณ ํ†ต๋ฐ›์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ง€๊ธˆ ๋‹น์žฅ ์šฐ๋ฆฌ์—๊ฒŒ ๋†’์€ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋›ฐ์–ด ๋“ค๋ฉด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

@salier IE๊ฐ€ compositionend ์ดํ›„์— input ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Windows 10์˜ IE11 ๋ฐ Edge์—์„œ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. Chrome ๋ฐ Firefox์—์„œ ์ œ๋Œ€๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, 9์—์„œ ํ•œ์ž๋ฅผ ๋‹ค์‹œ ์ž…๋ ฅํ•˜๋ฉด Change ์ด๋ฒคํŠธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, Facebook ์—ฌ๋Ÿฌ๋ถ„, ์‚ฌ์‹ค์ด ๋ฌธ์ œ๋Š” ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ฅผ ์ผ์œผ ํ‚ต๋‹ˆ๋‹ค. ์ค‘๊ตญ์–ด ์ž…๋ ฅ๊ณผ ๋น„๋™๊ธฐ ์ ์œผ๋กœ ์ž…๋ ฅ์„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ํ”ผ๋“œ๋ฐฑ์ด ๋น„๋™๊ธฐ ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์„ฑ ๋ฐ˜์‘ ๋ฐ์ดํ„ฐ ์†Œ์Šค ๋˜๋Š” redux์™€ ๊ฐ™์€ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์€์ด ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. setTimeout์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
https://jsfiddle.net/liyatang/bq6oss6z/1/

์ด ๋ฌธ์ œ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ ์—ฌ๊ธฐ์ €๊ธฐ์„œ ๋ฐ˜๋ณตํ•ด์„œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋…ธ๋ ฅ์„ ๋‚ญ๋น„ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌ.

๋‚ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๋ฉด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

onchange ์ด๋ฒคํŠธ ๋ฌธ์ œ์—์„œ ์ค‘๊ตญ์–ด IME ์ž…๋ ฅ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด compositionstart ๋ฐ compositionend ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
๋งํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค : https://jsfiddle.net/eyesofkids/dcxvas28/8/

@eyesofkids ์ข‹์€ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž…๋ ฅ, ํ…์ŠคํŠธ ์˜์—ญ์— ๋Œ€ํ•œ 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);

์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •ํ™•ํžˆ ์•Œ์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ด ๋‘๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง„ํ–‰ ๋ฐฉ๋ฒ• ๋˜๋Š” ๊ธฐํƒ€ ์ง€์นจ์— ๋Œ€ํ•œ ์ง€์นจ์€ ๋†’์ด ํ‰๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๊ฐ‘์ž๊ธฐ ํฌ๋กฌ 53+์— ํŒŒ์‚ฐ ๊ทธ๋ฆฌ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™๋‹ค ๊ทธ๋“ค์ด ์ˆœ์„œ ๋ณ€๊ฒฝ compositionend ํ•ด๊ณ ๋ฅผ : ์ด์ „์— ์ „์— ๋ฌด์Šจ ์ผ์ด ์žˆ์—ˆ textInput ํ›„ ์ง€๊ธˆ textInput . ๊ฒฐ๊ณผ์ ์œผ๋กœ change ๋Š” ๊ตฌ์„ฑ ์ค‘์— ์ค‘๋‹จ๋˜๋ฉด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ๐Ÿ˜•.

https://github.com/suhaotian/react-input ์–ด์ฉŒ๋ฉด ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

Chrome v53์—๋Š” ๊นŒ๋‹ค๋กœ์šด ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. 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://jsfiddle.net/eyesofkids/dcxvas28/11/

@chenxsan ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?
compositionStart๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋ณ€์ˆ˜๋ฅผ true๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ onChange์—์„œ ์„ค์ • ํ•œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด์•ผํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ œ์–ด ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ # 8683์— ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

์ œ์–ด๋˜์ง€ ์•Š๊ณ  ์ œ์–ด๋˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ (์ž…๋ ฅ, ํ…์ŠคํŠธ ์˜์—ญ)์— ๋Œ€ํ•œ ์ž„์‹œ ์†”๋ฃจ์…˜์ด react-compositionevent์— ์—…๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

https://github.com/facebook/react/pull/8438 ์ด ์ผ์–ด๋‚˜๋„๋กํ•ฉ์‹œ๋‹ค.

@yesmeck ์ด ์†Œ์‹์„๋ณด๊ณ  ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ Webkit์—๋งŒ ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. Chrome์€ 53+ ์ดํ›„์— compositionend ์ด๋ฒคํŠธ ํŠธ๋ฆฌ๊ฑฐ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— Chrome๊ณผ Safari๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@eyesofkids 53 ์„ธ ๋ฏธ๋งŒ์˜ 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 ํ˜ธ์ถœ ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๊ฒฐ๊ตญ ์ž˜๋ชป๋œ ๊ฐ€์น˜๋ฅผ ์–ป์Šต๋‹ˆ๊นŒ?

https://github.com/facebook/react/pull/8438 ์˜ ์ˆ˜์ • ์‹œ๋„ ํ…Œ์ŠคํŠธ๋Š” onChange ํ˜ธ์ถœ ํšŸ์ˆ˜์— ๋Œ€ํ•œ ์–ด์„ค ์…˜์„ ์ œ๊ฑฐํ•˜๋ฉด ํ†ต๊ณผ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ์ด ๋ฌธ์ œ๋Š” ์ถ”๊ฐ€ onChange ํ˜ธ์ถœ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถ”๊ฐ€ onChange ํ˜ธ์ถœ์ด ์—†์œผ๋ฉฐ ๋์— ์ž˜๋ชป๋œ ๊ฐ’์ด ํ‘œ์‹œ๋˜๊ณ  onComposition ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

@crochefluid ์ด๊ฒƒ์— ๋Œ€ํ•œ ์‹คํŒจ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? # 8438์ด ์‹œ๋„ํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์ž˜๋ชป๋œ ๊ฐ’์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

@gaearon ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ ํ•  ๊ฒƒ์ด๋‹ค. Safari (mac / IOS)์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์…จ์Šต๋‹ˆ๊นŒ?

๋…ธ๋“œ ํ…Œ์ŠคํŠธ์ด์ง€๋งŒ ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €์™€ ์žฅ์น˜์—์„œ ์บก์ฒ˜ ํ•œ ์‹œํ€€์Šค๋ฅผ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค. ์ถœ์ฒ˜๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์‹คํŒจํ•œ ์‹œํ€€์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ์ด ๋ฌธ์ œ๋Š” ์ถ”๊ฐ€ onChange ํ˜ธ์ถœ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ”๋กœ ๊ทธ๊ฑฐ์ฃ .

์—ฌ์ „ํžˆ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” 3 ๋…„ ๋™์•ˆ ์—ด๋ ค์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. React๋Š” ํ˜„์žฌ ์ œ์–ด ๋œ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ค‘๊ตญ์–ด ์ž…๋ ฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ?

ํŠน์ • ๋ฌธ์ž๋กœ ์ผ๋ณธ์–ด๋กœ๋„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ...

๋‚ด ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ ์ƒŒ๋“œ ๋ฐ•์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–‘์‹๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ง์ ‘ ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

https://codesandbox.io/s/0m1760xqnl

๋ช‡ ๊ฐ€์ง€ ์‚ฌ๋ก€๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ฐ˜์‘ ์ƒํƒœ์™€ ์ผ๋ฐ˜ ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
๋ฐ˜์‘ ์ƒํƒœ, ์ผ๋ฐ˜ ํ˜•์‹ ๋ฐ ์ผ๋ฐ˜ ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ปจํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ์–‘์‹ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ ๊ด€๋ จ ๋ฌธ์ œ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ : ์ฝ”๋“œ ํŽœ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ ์ธํ•ด '์ž…๋ ฅ'์„ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ „๋‹ฌํ•˜๋ฉด (props) => ํ•˜์ง€ ์•Š์•˜๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์‚ฌ์‹ค, ๋‚˜๋Š” ๋˜ํ•œ ์‹œ๋„ํ–ˆ๋‹ค :

๊ณต์žฅ

<Field {...otherProps} component="input" />

์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

<Field {...otherProps} component={(props) => <input {...props} />} />

์ด์ƒํ•˜๊ฒŒ ์ž‘๋™

const WrappedInput = (props) => <input {...props} />
...
<Field {...otherProps} component={WrappedInput} />

๋ถ„๋ช…ํžˆ ๋‚ด๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๋งˆ๋ฒ•์ด ์—ฌ๊ธฐ์—์„œ ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜•

์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

IME๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

e84721f3ec71a5ce043ef8290

@otakustay์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค
IME ์ž…๋ ฅ์œผ๋กœ ์ œ์–ด ๋œ ์ž…๋ ฅ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ๊ฑด์˜ ์ˆœ์„œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”์ ํ–ˆ๋‹ค.

  1. ์‚ฌ์šฉ์ž๊ฐ€ w ์™€ ๊ฐ™์ด ๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  2. onChange๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
  3. ์ƒํƒœ๊ฐ€ ์ƒˆ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
  4. ์ƒˆ ๊ฐ’์€ value ์†์„ฑ์„ ํ†ตํ•ด input ๋กœ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค.
  5. ์ด ์‹œ์ ์—์„œ IME "์ปดํฌ์ง€์…˜"์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

    • ์ž…๋ ฅ ์š”์†Œ์— w ๋ฌธ์ž์—ด์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • IME ๋ฒ„ํผ์— ์ €์žฅ๋œ ๋ณ„๋„์˜ w ๋ฌธ์ž์—ด๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  6. ์‚ฌ์šฉ์ž๊ฐ€ a ์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  7. ์ž…๋ ฅ a ์˜ ๋ฌธ์ž์—ด์€ IME ๋ฒ„ํผ์˜ ๋ฌธ์ž์—ด๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ wwa ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  8. 1-7 ๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ค‘๋ณต ๋ฌธ์ž๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ฒˆ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ ํ›„ compositionUpdate ์ด๋ฒคํŠธ ํ›„ ์ž…๋ ฅ์ด

์ง€๊ธˆ ๋‚ด ์œ ์ผํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์ œ์–ด ๋œ ์ž…๋ ฅ์—์„œ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๋‹ค์Œ์€ ๊ฐ„๋‹จํ•œ ๋ณต์ œ์ž…๋‹ˆ๋‹ค : https://jsfiddle.net/kbhg3xna/
Edit2 : ๋‚ด ํ•ดํ‚ค ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค : https://jsfiddle.net/m792qtys/ cc : @otakustay

์ด๊ฒƒ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์—…๋ฐ์ดํŠธ ??

์ด๊ฒƒ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๊นœ์ง ๋†€๋ž์Šต๋‹ˆ๋‹ค.์ด ์งˆ๋ฌธ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๋ฌธ์ œ๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ onChange์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. onCompositionStart ์™€ onCompositionEnd ์‚ฌ์ด์— setState๊ฐ€ ์—†์œผ๋ฉด ๋ฐ˜์‘์€ ๊ฐ’์„์žˆ๋Š” ๊ทธ๋Œ€๋กœ "์ œ์–ด"ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ๊ตฌ์„ฑ์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, onCompositionEnd ์ด๋ฒคํŠธ๋ฅผ๋ฐ›์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ...... (์ž˜๋ชปํ•˜๋ฉด plz๋ฅผ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.) ๊ทธ๋Ÿฌ๋‚˜ ์ƒํƒœ๋ฅผ ์ฆ‰์‹œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ์— ์ง๋ฉดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค @ knubie ์–ธ๊ธ‰). ์—ฌ๊ธฐ์—์„œ ๋ณต์ œํ’ˆ ( "๋ฐ˜ ์ œ์–ด"๊ตฌ์„ฑ ์š”์†Œ์ฒ˜๋Ÿผ ๋ณด์ž„) : https://gist.github.com/cpdyj/6567437d96c315e9162778c8efdfb6e8

ํ•˜์ง€๋งŒ 5 ๋…„ ๋™์•ˆ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•„์„œ ๋„ˆ๋ฌด ๋†€๋ž์Šต๋‹ˆ๋‹ค ๐Ÿ˜ข

@hellendag IME ๋ฌธ์ž์—ด์ด ์ปค๋ฐ‹ ๋  ๋•Œ๊นŒ์ง€ onChange๋ฅผ ์‹คํ–‰ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅ ํ•  ๋•Œ ๋ชฉ๋ก์˜ ํ•„ํ„ฐ๋ง ์˜ต์…˜์— ๋Œ€ํ•ด "์ปค๋ฐ‹๋˜์ง€ ์•Š์€"IME ๋ฌธ์ž์—ด์„ ์•Œ๊ณ  ์‹ถ์–ด ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์ด ์œ ํšจํ•œ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ด์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ ํ•œ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/facebook/react/issues/13104#issuecomment -691393940

์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

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