【问题标题】:Input output does not update straight away it is delayed输入输出不会立即更新,而是延迟
【发布时间】:2021-01-07 14:45:49
【问题描述】:

我创建了两个输入,并使用setState 更新了状态。当我输入输入然后console.log 它不会立即记录它。

例如,如果我在输入中键入“an”,它将在第二次击键时控制台记录“a”...

我知道this.setState 不会立即更新并批量更新状态,但是当我过去这样做时它已经工作了。 Why isn't my input value updating with React?

如何让我的输入立即更新?我希望这种情况发生,因为我需要使用用户输入作为搜索关键字并将每个输入值传递给函数。

代码:

export default class SearchBar extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      movieTitleSearch: "",
      searchByYear: "",
    };
  }

  handleOnChange = (event) => {
    const { movieTitleSearch } = this.state;
    const { searchByYear } = this.state;
    this.setState({    
          ...this.state, [event.target.name]: event.target.value, 
      },
      () => {
           if (movieTitleSearch || searchByYear > 1) {
           this.props.movieSearch(movieTitleSearch, searchByYear); 
       }
          console.log(movieTitleSearch) // does not update straight away in the console.
          console.log(searchByYear) // does not update straight away in the console.
      }
    );
  };

  render() {
    return (
      <div>
        <label>search film title</label>
        <input
          onChange={this.handleOnChange}
          type="text"
          name="movieTitleSearch"
          placeholder="search by film"
          value={this.state.movieTitleSearch}
        />
        <label>search by year</label>
        <input
          onChange={this.handleOnChange}
          type="text"
          name="searchByYear"
          placeholder="search by year"
          value={this.state.searchByYear}
        />
      </div>
    );
  }
}

更新的 ONCHANGE 函数

  handleOnChange = (event) => {
    const { movieTitleSearch } = this.state;
    const { searchByYear } = this.state;
    this.setState(
      {
       ...this.state, [event.target.name]: event.target.value, 
      },
    );
    this.props.movieSearch(this.state.movieTitleSearch, this.state.searchByYear) 
      console.log(this.state.movieTitleSearch) // why when i type in the inputs does this not log to the console straight away?
      console.log(this.state.searchByYear)
  };

【问题讨论】:

    标签: javascript reactjs input


    【解决方案1】:

    当您使用 const movieTitleSearch 时,您正在访问之前的状态。 你必须像this.state.movieTitleSearch一样使用它,然后你会得到更新的状态值。

    handleOnChange = (event) => {
        const { movieTitleSearch } = this.state;
        const { searchByYear } = this.state;
        this.setState({    
              ...this.state, [event.target.name]: event.target.value, 
          },
          () => {
               if (movieTitleSearch || searchByYear > 1) {
               this.props.movieSearch(this.state.movieTitleSearch, this.state.searchByYear); 
           }
              console.log(this.state.movieTitleSearch)
              console.log(this.state.searchByYear)
          }
        );
      };
    

    另外,我建议在setState 回调之外调用movieSearch,因为您已经在event.target.value 内部拥有它的价值

    【讨论】:

    • 感谢您的评论我现在明白我正在访问以前的状态,这是有道理的。但是,您认为我应该在哪里调用movieSearch,那么如果不在setState 回调中,您能给我举个例子吗? @Rinkesh
    • this.setState({...}); 通话后。
    • 谢谢!让我试试看:)
    • 我仍然遇到同样的问题...当我 console.log 时,控制台不会立即记录用户在输入框中输入的内容...我已经更新了原始问题,因此您可以查看我更新的handleOnChange
    • 您正在回调之外访问this.state。 setState 是一个不会立即更新的异步函数。正如我在回答中提到的那样,您必须使用event.target.value
    猜你喜欢
    • 2020-08-22
    • 1970-01-01
    • 2021-02-27
    • 2013-11-15
    • 2015-02-22
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多