React.js setState异步

时间:2019-01-03 20:20:34

标签: reactjs asynchronous fetch setstate

我正在构建一个小的搜索引擎,并遇到以下问题:

每次输入查询时,最后一个字母都会丢失。我发现,这与 setState 有关,并且不是异步 ...但是我无法针对我的情况提出解决方案。

她是我的职责:

  searchHandler = ({ target: { value } }) => {

  this.setState({ term: value });
    this.updateMessage(value);

    if(this.state.message.length === 0){
      this.setState({hasMoreItems: false})

      this.componentDidMount();
    }else{

  var requestUrl = 'https://questdb.herokuapp.com/all?q='
  fetch(requestUrl + this.state.message).then((response)=>{
      return response.json();
  }) .then((data)=>{
      this.setState({ tracks: data});

  })
}
}


updateMessage = message => this.setState({ message });

您对我有什么建议吗?

非常感谢!

2 个答案:

答案 0 :(得分:2)

可以向

this.setState()传递一个回调函数,该回调函数将在状态实际设置为新值后执行。您可以像这样使用它:

this.setState({something: newValue}, () => {
    console.log(this.state.something) // this will print out the new value
});

答案 1 :(得分:2)

通常,您要使用setState()的第二个参数,该参数接受将以更新状态运行的回调函数。这是一个示例:

import React, { Component } from 'react';
import { render } from 'react-dom';

class App extends React.Component { 
  state = {
    value: '',
  }

  handleChange = (e) => {
    e.preventDefault();
    const { value } = e.target;
    this.setState({ value }, () => {
      console.log('Value is:', this.state.value );
    })
  }

  render() { 
    return (
      <input value={this.state.value} onChange={this.handleChange} />
    )
  }
}

render(<App />, document.getElementById('root'));

实时示例here