Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs React中的搜索栏:由于setState,建议和查询不匹配_Reactjs_Setstate - Fatal编程技术网

Reactjs React中的搜索栏:由于setState,建议和查询不匹配

Reactjs React中的搜索栏:由于setState,建议和查询不匹配,reactjs,setstate,Reactjs,Setstate,我基本上是创建一个城市建议搜索栏。它调用了一个API,在此基础上我给出了一些建议。但由于我必须调用setState,因此查询和建议不匹配 重新创建错误:如果键入Indore并在一个连续笔划中通过退格完全清除查询。即使输入字段为空,您仍然可以看到留下的建议 import React, { Component} from 'react'; import './App.css'; class App extends Component { constructor(props) { s

我基本上是创建一个城市建议搜索栏。它调用了一个API,在此基础上我给出了一些建议。但由于我必须调用setState,因此查询和建议不匹配

重新创建错误:如果键入Indore并在一个连续笔划中通过退格完全清除查询。即使输入字段为空,您仍然可以看到留下的建议

import React, { Component} from 'react';
import './App.css';


class App extends Component {

  constructor(props) {
    super(props);
    this.state = {
      inputText: "",
      listItems: []
    }
    this.handleChange = this.handleChange.bind(this);
  }

  handleChange(event){
    if (event.target.value.length > 0){
      var apiKey = process.env.REACT_APP_HERE_API_KEY;
      fetch("https://autocomplete.geocoder.ls.hereapi.com/6.2/suggest.json?apikey="+ apiKey +"&query="+event.target.value)
      .then(res => res.json())
      .then(data => {
        data = data.suggestions;
        var lst = []
        for (var i=0; i<data.length; i++) {
          if (data[i].matchLevel === "city") {
            var city = data[i].address.city;
            var state = data[i].address.state;
            var country = data[i].address.country;
            var finalString = city;
            if (state !== undefined) {
              finalString += ", "+state;
            }
            if (country !== undefined) {
              finalString += ", "+country;
            }
            if (i === data.length - 1) {
              lst.push(<li className="search-result-last-item" key={city}>{finalString}</li>)
            }
            else {
              lst.push(<li key={city}>{finalString}</li>)
            }
          }
        }
        this.setState({
          listItems: lst
        });
      })
    }
    else {
      this.setState({
        listItems: []
      })
    }
  } 

  render() {
    return (
      <div>
        <div className="search-box">
          <input className="search-input" type="text" onChange={this.handleChange}></input>
          <ul className="search-result">
            {this.state.listItems}
          </ul>
        </div>

      </div>
    );
  }
}

export default App;

import React,{Component}来自'React';
导入“/App.css”;
类应用程序扩展组件{
建造师(道具){
超级(道具);
此.state={
输入文本:“”,
清单项目:[]
}
this.handleChange=this.handleChange.bind(this);
}
手变(活动){
如果(event.target.value.length>0){
var apiKey=process.env.REACT\u APP\u HERE\u API\u KEY;
取回(“https://autocomplete.geocoder.ls.hereapi.com/6.2/suggest.json?apikey=“+apiKey+”&query=“+event.target.value)
.then(res=>res.json())
。然后(数据=>{
数据=数据。建议;
var lst=[]

对于(var i=0;i尝试删除target.length上的条件,而不是让API获取数据并决定是否有数据,并相应地调用setState。

我猜不匹配是由于多个setState调用造成的,当您清除所有文本时,会触发多个setState调用,最后一次调用清空该文本list的运行时间早于promise API调用中的setState调用。是的,情况就是这样。解决方案是什么?你是否应用了我之前告诉你的修复程序?这可能会完成你的工作。因此,当你收到API的响应时,setState将始终被调用,如果是空文本,数据将为空,因此你的列表也将为空。实际上hats不是问题。问题是,如果我提供输入,我将保留以前输入的结果。这是因为提供输入和获取结果之间存在延迟。您的意思是,每个输入获取数据并显示以前输入的结果不是最新的,还是始终保留第一次获取的数据?