React中的onChange不捕获文本的最后一个字符

ree*_*rix 36 javascript reactjs

这是我的渲染功能:

  render: function() {
    return  <div className="input-group search-box">
              <input
                onChange={this.handleTextChange}
                type="text"
                value={this.state.text}
                className="form-control search-item" />
              <span className="input-group-btn"></span>
        </div>
   }
Run Code Online (Sandbox Code Playgroud)

我有这个作为我的事件处理程序:

   handleTextChange: function(event) {
     console.log(event.target.value);
     this.setState({
       text: event.target.value
     });
   }
Run Code Online (Sandbox Code Playgroud)

问题是当我"保存"一个项目,或者console.log打印输出时,最后一个字符丢失了 - 例如,如果我输入"first",我将打印出"firs",并且需要是捕获最后一个角色的另一个关键事件.我已经试过onKeyUp-这并不让我在任何类型的,我也试着onKeyDownonKeyPress,其输出什么.这里发生了什么,为什么?我怎样才能让最后一个角色出现?

Mic*_*ley 38

你什么时候登录州?请记住,这setState是异步的,因此如果要打印状态,则必须使用callback参数.想象一下这个组件:

let Comp = React.createClass({
  getInitialState() {
    return { text: "abc" };
  },

  render() {
    return (
      <div>
        <input type="text" value={this.state.text}
               onChange={this.handleChange} />
        <button onClick={this.printValue}>Print Value</button>
      </div>
    );
  },

  handleChange(event) {
    console.log("Value from event:", event.target.value);

    this.setState({
      text: event.target.value
    }, () => {
      console.log("New state in ASYNC callback:", this.state.text);
    });

    console.log("New state DIRECTLY after setState:", this.state.text);
  },

  printValue() {
    console.log("Current value:", this.state.text);
  }
});
Run Code Online (Sandbox Code Playgroud)

d在输入的末尾键入a 将导致以下内容记录到控制台:

Value from event: abcd
New state DIRECTLY after setState: abc
New state in ASYNC callback: abcd
Run Code Online (Sandbox Code Playgroud)

请注意,中间值缺少最后一个字符.这是一个有效的例子.

  • 该死的.这很烦人 (6认同)

小智 8

import React, { useState, useEffect } from 'react';

const MyComponent = () => {

    const [userInput, setUserInput] = useState("");

    const changeHandler = (e) => {
        setUserInput(e.target.value);
    }

    useEffect(()=> {
        //here you will have correct value in userInput 
    },[userInput])

    return (
        <div>
             <input onChange={changeHandler} value={userInput}></input>
        </div>
    )
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供此代码片段,它可能会提供一些有限的即时帮助。[正确的解释](https://meta.stackexchange.com/q/114762/349538)将通过展示为什么这是一个很好的问题解决方案来极大地提高其长期价值,并将使其对未来的读者更有用与其他类似的问题。请[编辑]您的答案以添加一些解释,包括您所做的假设。 (2认同)

Ama*_*man 5

由于setState()函数是异步的,因此我使用了await。我通过async和await实现了这一点,这是我的代码

render: function() {
    return  <div className="input-group search-box">
              <input
                onChange={(e) => {this.handleTextChange(e)}}
                type="text"
                value={this.state.text}
                className="form-control search-item" />
              <span className="input-group-btn"></span>
        </div>
   }
Run Code Online (Sandbox Code Playgroud)

handleTextCahnge函数:

handleTextChange = async function(event) {

     await this.setState({text: event.target.value});
     console.log(this.state.text);
   }
Run Code Online (Sandbox Code Playgroud)


wri*_*ris 5

由于 React v.16.8 反应钩子可能会有所帮助。我会推荐 useState 和 useEffect。示例在 React Native 中,但它应该展示如何使用 useEffect。有关 useEffect 的更多信息:https ://reactjs.org/docs/hooks-effect.html

import React, {useState, useEffect} from 'react';
import { TextInput } from 'react-native';

export interface Props{}
 
const InformationInputs: React.FC<Props> = (props) => {
  const [textInputs, setTextInputs] = useState("");

  const handleValueChange = () => {
    console.log(textInputs);
  }

  useEffect(() => {
    handleValueChange();
  }, [textInputs]);

return (
    <TextInput
    placeholder={'Text'}
    onChangeText={(value: string) => { setTextInputs(value) }}
    />
);
};
Run Code Online (Sandbox Code Playgroud)