Why does input setState inside setTimeout break Chinese IME?
I have a simple controlled input component in React and I am trying to wrap my head around this behavior.
If I do it the normal way, everything works fine and Chinese IME works as expected:
<input
type="text"
value={this.state.value}
onChange={(event) => {
this.setState({ value: event.target.value });
}}
/>
But if I wrapped a setTimeout or another setState outside, Chinese IME does not work anymore, it seems like it's been interrupted during each setState?
# setTimeout
<input
type="text"
value={this.state.value}
onChange={(event) => {
const value = event.target.value;
setTimeout(() => {
this.setState({ value });
}, 0);
}}
/>
# another setState
<input
type="text"
value={this.state.value}
onChange={(event) => {
const value = event.target.value;
this.setState({ isTyping: true }, () => {
this.setState({ value });
});
}}
/>
I am not looking for the correct way to make Chinese IME work, I just find it very interesting and want to understand what causes this behavior. I sort of understand there's an "update loop" for each setState operation but I am not sure how that would break the Chinese IME. Is this related to event loop and how setTimeout pushes the operation to the back of the queue?
Many thanks!
javascript reactjs
add a comment |
I have a simple controlled input component in React and I am trying to wrap my head around this behavior.
If I do it the normal way, everything works fine and Chinese IME works as expected:
<input
type="text"
value={this.state.value}
onChange={(event) => {
this.setState({ value: event.target.value });
}}
/>
But if I wrapped a setTimeout or another setState outside, Chinese IME does not work anymore, it seems like it's been interrupted during each setState?
# setTimeout
<input
type="text"
value={this.state.value}
onChange={(event) => {
const value = event.target.value;
setTimeout(() => {
this.setState({ value });
}, 0);
}}
/>
# another setState
<input
type="text"
value={this.state.value}
onChange={(event) => {
const value = event.target.value;
this.setState({ isTyping: true }, () => {
this.setState({ value });
});
}}
/>
I am not looking for the correct way to make Chinese IME work, I just find it very interesting and want to understand what causes this behavior. I sort of understand there's an "update loop" for each setState operation but I am not sure how that would break the Chinese IME. Is this related to event loop and how setTimeout pushes the operation to the back of the queue?
Many thanks!
javascript reactjs
it should check the working code
– Mayank Shukla
Nov 15 '18 at 3:46
add a comment |
I have a simple controlled input component in React and I am trying to wrap my head around this behavior.
If I do it the normal way, everything works fine and Chinese IME works as expected:
<input
type="text"
value={this.state.value}
onChange={(event) => {
this.setState({ value: event.target.value });
}}
/>
But if I wrapped a setTimeout or another setState outside, Chinese IME does not work anymore, it seems like it's been interrupted during each setState?
# setTimeout
<input
type="text"
value={this.state.value}
onChange={(event) => {
const value = event.target.value;
setTimeout(() => {
this.setState({ value });
}, 0);
}}
/>
# another setState
<input
type="text"
value={this.state.value}
onChange={(event) => {
const value = event.target.value;
this.setState({ isTyping: true }, () => {
this.setState({ value });
});
}}
/>
I am not looking for the correct way to make Chinese IME work, I just find it very interesting and want to understand what causes this behavior. I sort of understand there's an "update loop" for each setState operation but I am not sure how that would break the Chinese IME. Is this related to event loop and how setTimeout pushes the operation to the back of the queue?
Many thanks!
javascript reactjs
I have a simple controlled input component in React and I am trying to wrap my head around this behavior.
If I do it the normal way, everything works fine and Chinese IME works as expected:
<input
type="text"
value={this.state.value}
onChange={(event) => {
this.setState({ value: event.target.value });
}}
/>
But if I wrapped a setTimeout or another setState outside, Chinese IME does not work anymore, it seems like it's been interrupted during each setState?
# setTimeout
<input
type="text"
value={this.state.value}
onChange={(event) => {
const value = event.target.value;
setTimeout(() => {
this.setState({ value });
}, 0);
}}
/>
# another setState
<input
type="text"
value={this.state.value}
onChange={(event) => {
const value = event.target.value;
this.setState({ isTyping: true }, () => {
this.setState({ value });
});
}}
/>
I am not looking for the correct way to make Chinese IME work, I just find it very interesting and want to understand what causes this behavior. I sort of understand there's an "update loop" for each setState operation but I am not sure how that would break the Chinese IME. Is this related to event loop and how setTimeout pushes the operation to the back of the queue?
Many thanks!
javascript reactjs
javascript reactjs
asked Nov 15 '18 at 3:38
colloquecolloque
333
333
it should check the working code
– Mayank Shukla
Nov 15 '18 at 3:46
add a comment |
it should check the working code
– Mayank Shukla
Nov 15 '18 at 3:46
it should check the working code
– Mayank Shukla
Nov 15 '18 at 3:46
it should check the working code
– Mayank Shukla
Nov 15 '18 at 3:46
add a comment |
2 Answers
2
active
oldest
votes
Try this. You are not recommended to do setTimeout in user input event handler function. Don’t use setTimeout of setting state
handleChange = event = > {
const value = event.target.value;
this.setState({ value });
}
<input
type="text"
value={this.state.value}
onChange={event => this.handleChange(event)}
/>
Even if it is 0 milliseconds setTimeout will delay setting user input. Check below thread for more details about using setTimeout with zero milliseconds
add a comment |
I checked your code amd I didn't found any issue on your code.
My react version is 16.6 and your code work fine on my machine.
import React from 'react';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
value: ''
}
}
onClick() {
this.setState({ showLazy: !this.state.showLazy });
}
render() {
return (<div>
<input
type="text"
value={this.state.value}
onChange={(event) => {
const value = event.target.value;
this.setState({ isTyping: true }, () => {
this.setState({ value });
});
}}
/>
<input
type="text"
value={this.state.value}
onChange={event => {
const value = event.target.value;
setTimeout(() => {
this.setState({ value })
}, 0);
}}
/>
</div>)
}
}
export default AdvanceApp;
Add some description as well with you answer.
– Busy Bee
Nov 15 '18 at 4:36
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53312079%2fwhy-does-input-setstate-inside-settimeout-break-chinese-ime%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Try this. You are not recommended to do setTimeout in user input event handler function. Don’t use setTimeout of setting state
handleChange = event = > {
const value = event.target.value;
this.setState({ value });
}
<input
type="text"
value={this.state.value}
onChange={event => this.handleChange(event)}
/>
Even if it is 0 milliseconds setTimeout will delay setting user input. Check below thread for more details about using setTimeout with zero milliseconds
add a comment |
Try this. You are not recommended to do setTimeout in user input event handler function. Don’t use setTimeout of setting state
handleChange = event = > {
const value = event.target.value;
this.setState({ value });
}
<input
type="text"
value={this.state.value}
onChange={event => this.handleChange(event)}
/>
Even if it is 0 milliseconds setTimeout will delay setting user input. Check below thread for more details about using setTimeout with zero milliseconds
add a comment |
Try this. You are not recommended to do setTimeout in user input event handler function. Don’t use setTimeout of setting state
handleChange = event = > {
const value = event.target.value;
this.setState({ value });
}
<input
type="text"
value={this.state.value}
onChange={event => this.handleChange(event)}
/>
Even if it is 0 milliseconds setTimeout will delay setting user input. Check below thread for more details about using setTimeout with zero milliseconds
Try this. You are not recommended to do setTimeout in user input event handler function. Don’t use setTimeout of setting state
handleChange = event = > {
const value = event.target.value;
this.setState({ value });
}
<input
type="text"
value={this.state.value}
onChange={event => this.handleChange(event)}
/>
Even if it is 0 milliseconds setTimeout will delay setting user input. Check below thread for more details about using setTimeout with zero milliseconds
edited Nov 15 '18 at 4:48
answered Nov 15 '18 at 4:20
Hemadri DasariHemadri Dasari
9,75531848
9,75531848
add a comment |
add a comment |
I checked your code amd I didn't found any issue on your code.
My react version is 16.6 and your code work fine on my machine.
import React from 'react';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
value: ''
}
}
onClick() {
this.setState({ showLazy: !this.state.showLazy });
}
render() {
return (<div>
<input
type="text"
value={this.state.value}
onChange={(event) => {
const value = event.target.value;
this.setState({ isTyping: true }, () => {
this.setState({ value });
});
}}
/>
<input
type="text"
value={this.state.value}
onChange={event => {
const value = event.target.value;
setTimeout(() => {
this.setState({ value })
}, 0);
}}
/>
</div>)
}
}
export default AdvanceApp;
Add some description as well with you answer.
– Busy Bee
Nov 15 '18 at 4:36
add a comment |
I checked your code amd I didn't found any issue on your code.
My react version is 16.6 and your code work fine on my machine.
import React from 'react';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
value: ''
}
}
onClick() {
this.setState({ showLazy: !this.state.showLazy });
}
render() {
return (<div>
<input
type="text"
value={this.state.value}
onChange={(event) => {
const value = event.target.value;
this.setState({ isTyping: true }, () => {
this.setState({ value });
});
}}
/>
<input
type="text"
value={this.state.value}
onChange={event => {
const value = event.target.value;
setTimeout(() => {
this.setState({ value })
}, 0);
}}
/>
</div>)
}
}
export default AdvanceApp;
Add some description as well with you answer.
– Busy Bee
Nov 15 '18 at 4:36
add a comment |
I checked your code amd I didn't found any issue on your code.
My react version is 16.6 and your code work fine on my machine.
import React from 'react';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
value: ''
}
}
onClick() {
this.setState({ showLazy: !this.state.showLazy });
}
render() {
return (<div>
<input
type="text"
value={this.state.value}
onChange={(event) => {
const value = event.target.value;
this.setState({ isTyping: true }, () => {
this.setState({ value });
});
}}
/>
<input
type="text"
value={this.state.value}
onChange={event => {
const value = event.target.value;
setTimeout(() => {
this.setState({ value })
}, 0);
}}
/>
</div>)
}
}
export default AdvanceApp;
I checked your code amd I didn't found any issue on your code.
My react version is 16.6 and your code work fine on my machine.
import React from 'react';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
value: ''
}
}
onClick() {
this.setState({ showLazy: !this.state.showLazy });
}
render() {
return (<div>
<input
type="text"
value={this.state.value}
onChange={(event) => {
const value = event.target.value;
this.setState({ isTyping: true }, () => {
this.setState({ value });
});
}}
/>
<input
type="text"
value={this.state.value}
onChange={event => {
const value = event.target.value;
setTimeout(() => {
this.setState({ value })
}, 0);
}}
/>
</div>)
}
}
export default AdvanceApp;
edited Nov 15 '18 at 5:35
answered Nov 15 '18 at 4:26
Biplab MalakarBiplab Malakar
42837
42837
Add some description as well with you answer.
– Busy Bee
Nov 15 '18 at 4:36
add a comment |
Add some description as well with you answer.
– Busy Bee
Nov 15 '18 at 4:36
Add some description as well with you answer.
– Busy Bee
Nov 15 '18 at 4:36
Add some description as well with you answer.
– Busy Bee
Nov 15 '18 at 4:36
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53312079%2fwhy-does-input-setstate-inside-settimeout-break-chinese-ime%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
it should check the working code
– Mayank Shukla
Nov 15 '18 at 3:46