Javascript 重音和延迟反应';s在更改输入时设置状态

Javascript 重音和延迟反应';s在更改输入时设置状态,javascript,reactjs,deferred,Javascript,Reactjs,Deferred,我正在创建一个小实用程序,需要调用一个setState延迟到输入的onChange处理程序触发的下一个勾号。下面是显示基本概念的简单片段 类MyComponent扩展了React.Component{ 构造函数(){ 超级(…参数); this.state={}; } onChange(值){ 设置超时(v=>{ this.setState({name:v}); }.bind(这个,值),0); } 渲染(){ 返回( this.onChange(evt.target.value)}/> );

我正在创建一个小实用程序,需要调用一个
setState
延迟到输入的
onChange
处理程序触发的下一个勾号。下面是显示基本概念的简单片段

类MyComponent扩展了React.Component{ 构造函数(){ 超级(…参数); this.state={}; } onChange(值){ 设置超时(v=>{ this.setState({name:v}); }.bind(这个,值),0); } 渲染(){ 返回( this.onChange(evt.target.value)}/> ); } }; ReactDOM.render( , document.getElementById(“应用程序容器”) ); 如果您在Mac OS上的浏览器中运行此代码段,并尝试键入带有重音的字母,则在每个浏览器上都会出现不同的尴尬行为。在Chrome浏览器上,在不再应用重音后,重音只在第一次起作用(请看下面的gif)。在Firefox上,重音和字母不会出现

你们有什么线索吗


p、 s:我在React 0.13、0.14和15.0.2上测试了这种行为。

基本上你不应该推迟设置状态。React在这种情况下不能正常工作

看:

正在发生的事情:

假设您按下字母
A

  • 在字段中触发
    onChange
    时,React处理所有状态突变

  • 在状态变异过程之后,React执行DOM diff以更新组件,在此阶段,此字段的状态值为空值,因此React执行
    node.value=“”

  • 在下一个勾选中,我们的延迟
    设置状态
    被触发,应用带有
    node.value=“A”
    的字母
    A

  • 这种行为会破坏MacOS上的浏览器,浏览器会将“中间状态”上的重音替换为键入的重音,从而阻止用户键入带重音的字符


    因此,遗憾的是,没有解决方案。

    不确定您所面临的问题。但是您认为将
    字符集设置为UTF-8或ISO-8859-1可以解决这个问题吗?@anoop JSFIDLE已经使用UTF-8运行了。我相信这不是一个字符集问题。我用gif更新了问题,显示了问题,以帮助大家理解。
    
    class MyComponent extends React.Component {
      constructor () {
        super(...arguments);
        this.state = {};
      }
    
      onChange (value) {
        setTimeout(v => {
          this.setState({ name: v });
        }.bind(this, value), 0);
      }
    
      render () {
        return (
          <div>
            <input
              type="text"
              value={this.state.name}
              onChange={evt => this.onChange(evt.target.value)} />
          </div>
        );
      }
    };
    
    ReactDOM.render(
      <MyComponent/>,
      document.getElementById("app-container")
    );