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
์์์ด๋ฅผ ์ฒ๋ฆฌํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ 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๋ ํ์ฌ ์ ์ด ๋ ๊ตฌ์ฑ ์์์์ ์ค๊ตญ์ด ์ ๋ ฅ์ ์ง์ํฉ๋๊น?
ํน์ ๋ฌธ์๋ก ์ผ๋ณธ์ด๋ก๋ ๋ณผ ์ ์์ต๋๋ค ...
๋ด ๋ฌธ์ ๋ฅผ ์ฌํํ๋ ์ฝ๋ ์๋ ๋ฐ์ค๊ฐ ์์ต๋๋ค. ์์๊ณผ ๊ด๋ จ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ง์ ์ ๋ ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ช ๊ฐ์ง ์ฌ๋ก๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
๋ฐ์ ์ํ์ ์ผ๋ฐ ์
๋ ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ฐ์ ์ํ, ์ผ๋ฐ ํ์ ๋ฐ ์ผ๋ฐ ์
๋ ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์๋ํ์ง ์๋ ์ปจํ
์คํธ ๊ธฐ๋ฐ ์์ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ปจํ
์คํธ ๊ด๋ จ ๋ฌธ์ ์ผ ์ ์์ต๋๋ค.
๋ฌธ์ ํด๊ฒฐ : ์ฝ๋ ํ์์ ์๋ํฉ๋๋ค. ์ด๋ค ์ด์ ๋ก ์ธํด '์ ๋ ฅ'์ ๊ตฌ์ฑ ์์๋ก ์ ๋ฌํ๋ฉด (props) => ํ์ง ์์๋ค.
๋๊ตฌ๋ ์ง ์ฐจ์ด์ ์ด ๋ฌด์์ธ์ง ์๊ณ ์์ต๋๊น?
์ฌ์ค, ๋๋ ๋ํ ์๋ํ๋ค :
๊ณต์ฅ
<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 ์ด๋ฒคํธ ํ ์
๋ ฅ์ด
์ง๊ธ ๋ด ์ ์ผํ ํด๊ฒฐ์ฑ ์ ์ ์ด ๋ ์ ๋ ฅ์์ ์ ํํ๋ ๊ฒ์ ๋๋ค.
ํธ์ง : ๋ค์์ ๊ฐ๋จํ ๋ณต์ ์
๋๋ค : 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
์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ ํ์ธ์, Facebook ์ฌ๋ฌ๋ถ, ์ฌ์ค์ด ๋ฌธ์ ๋ ์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ์ผ์ผ ํต๋๋ค. ์ค๊ตญ์ด ์ ๋ ฅ๊ณผ ๋น๋๊ธฐ ์ ์ผ๋ก ์ ๋ ฅ์ ์ ๋ฐ์ดํธ ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ฐ๋ฆฌ๋ ๋ชจ๋ ํผ๋๋ฐฑ์ด ๋น๋๊ธฐ ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋๊ธฐ ๋๋ฌธ์ ์ ์ฑ ๋ฐ์ ๋ฐ์ดํฐ ์์ค ๋๋ redux์ ๊ฐ์ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ค์์์ด ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฐ์ฅ ๊ฐ๋จํ ์์ ๋๋ค. setTimeout์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์ ๋ฐ์ดํธ๋ฅผ ์ํํฉ๋๋ค.
https://jsfiddle.net/liyatang/bq6oss6z/1/
์ด ๋ฌธ์ ๋ฅผ ์ ์ํ๊ฒ ํด๊ฒฐํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๋์ผ ์ฌ๊ธฐ์ ๊ธฐ์ ๋ฐ๋ณตํด์ ํด๊ฒฐํ๋ ๋ฐ ๋ ธ๋ ฅ์ ๋ญ๋นํ์ง ์์ ๊ฒ์ ๋๋ค.
๊ฐ์ฌ.
๋ด ํด๊ฒฐ ๋ฐฉ๋ฒ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋๊ตฌ๋ ์ง ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ๋ฉด ๋ณผ ์ ์์ต๋๋ค