代码之家  ›  专栏  ›  技术社区  ›  user3348410

REACT SETSTATE第一次未启动

  •  1
  • user3348410  · 技术社区  · 4 年前

    我也看到过类似的问题,但无法找到解决办法。

    我有一些输入当你粘贴一些文本到输入我试图设置它的状态和呈现这个文本。但当粘贴第一次状态不变时,粘贴第二次时一切正常。

    我不明白为什么会这样,我已经为它使用了一些setTimeout函数,但没有帮助。

    这是我的代码:

    import React from "react";
    import { render } from "react-dom";
    
    class App extends React.Component {
      constructor() {
        super();
        this.state = {
          no: ""
        };
      }
    
      pasteSomeText = e => {
        this.setState({
          no: e.target.value
        });
      };
    
      render() {
        return (
          <div style={styles}>
            {this.state.no}
            <input onPaste={event => this.pasteSomeText(event)} />
          </div>
        );
      }
    }
    
    render(<App />, document.getElementById("root"));
    

    下面是代码沙盒示例: https://codesandbox.io/s/1-react-hello-world-tvscf?fontsize=14

    4 回复  |  直到 4 年前
        1
  •  3
  •   Ruan Mendes NMunro    4 年前

    要从事件中获取数据,请使用 e.clipboardData.getData('text') 是的。见 https://developer.mozilla.org/en-US/docs/Web/API/Element/paste_event

    e.target.value 在文本字段更新为粘贴数据之前为其提供值,因此可以根据需要取消/修改粘贴。

      pasteSomeText(e) {
        this.setState({
          no: e.clipboardData.getData('text')
        });
      };
    

    附带说明:对于来自html的调用,您不需要使用这个箭头函数(它使用更多内存),请参见上面的示例

        2
  •  3
  •   layonez    4 年前

    基本上就是为什么你会在第一次出现空状态 onpaste 是那个电话 OnPaste公司 在更改输入值之前激发。所以你就空了 event.target.value 对于所有其他调用,都会得到先前的值。

    如果你仍然决定继续 OnPaste公司 你应该记住你可以用 event.clipboardData.getData('Text') 但是它可以不同于在输入中粘贴的内容,因为 clipboardData 对于不同的输入类型。

    https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/types

    因此,对于使用剪贴板数据,我建议使用 DataTransfer 模块从 https://www.npmjs.com/package/fbjs 以便在不同的系统和浏览器中获得更一致的行为。

        3
  •  0
  •   Douglas R. Santos    4 年前

    是一种不同类型的事件,您需要从该事件获取剪贴板数据并将其设置为状态

    const value = e.clipboardData.getData('text')
    
        4
  •  -1
  •   Yahiya    4 年前

    使用

    onChange
    

    而不是使用

    onPaste
    

    更新 https://codesandbox.io/s/1-react-hello-world-h2jgv