首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在setTimeout中输入setState会破坏中文输入法?

为什么在setTimeout中输入setState会破坏中文输入法?
EN

Stack Overflow用户
提问于 2018-11-15 11:38:20
回答 2查看 116关注 0票数 0

我在React中有一个简单的受控输入组件,我正试图理解这个行为。

如果我按正常方式操作,一切都会正常工作,中文输入法也能正常工作:

代码语言:javascript
复制
<input
  type="text"
  value={this.state.value}
  onChange={(event) => {
    this.setState({ value: event.target.value });
  }}
/>

但是如果我在外面包装了一个setTimeout或另一个setState,中文输入法就不能工作了,好像在每次setState的时候都被中断了?

代码语言:javascript
复制
# 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 });
    });
  }}
/>

我并不是在寻找正确的方法来让中文输入法发挥作用,我只是发现它非常有趣,并想知道是什么导致了这种行为。我有点理解每个setState操作都有一个"update循环“,但我不确定这会如何破坏中文输入法。这是否与事件循环有关,以及setTimeout如何将操作推到队列的后面?

非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2018-11-15 12:20:41

尝尝这个。不建议您在用户输入事件处理函数中执行setTimeout。不要使用设置状态的setTimeout

代码语言:javascript
复制
   handleChange = event = > {
         const value = event.target.value;
         this.setState({ value });
  }

   <input
     type="text"
     value={this.state.value}
   onChange={event => this.handleChange(event)}
  />

即使是0毫秒,setTimeout也会延迟设置用户输入。有关以0毫秒使用setTimeout的更多详细信息,请查看以下线程

票数 0
EN

Stack Overflow用户

发布于 2018-11-15 12:26:41

代码语言:javascript
复制
 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>)
  }
}

导出默认AdvanceApp;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53312079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档