【问题标题】:Fetch Multiple times per textinput in reactnative在本机反应中,每个文本输入多次获取
【发布时间】:2020-10-13 17:04:54
【问题描述】:

所以基本上我正在构建一个响应原生的天气应用程序,并将天气 API 用于天气 API。所以基本上我的问题是什么:假设我搜索了纽约的天气,它给了我 80F,我搜索了达拉斯的天气,但它给了我与纽约天气相同的详细信息。

我知道我的 API 被调用了一次,但是如何根据我的 textinput 更改多次调用我的 API? 代码如下:

constructor(props) {
super(props);
this.state = {
  weatherText: "Enter",
  isLoading: true,
  locationData: [],
  currentData: []
};

}

componentDidMount(){
   this.apiCALL()
 }



apiCALL(){
     return fetch(
       `http://api.weatherapi.com/v1/current.json?key=???&q=${this.state.weatherText}`//I took out the key on purpose.
     )
       .then((response) => response.json())
       .then((responseJson) => {
         this.setState({
           isLoading: false,
           locationData: responseJson.location,
           currentData: responseJson.current,
         });
       })
       .catch((error) => {
         console.log(error);
       });
  }

注意:我故意取出了 API 的密钥。

那么我怎样才能做到这一点。就像我之前说的,当 Textinput 发生变化时,如何调用 API? 我应该使用ComponentDidMount 还是有其他一些内置函数/方法来实现这一点?

【问题讨论】:

  • 您可以通过比较状态值或什至在文本输入 onTextChange 中调用它在您的 componentDidUpdate 内部调用它,但每次更改它有点太多了

标签: reactjs react-native fetch fetch-api


【解决方案1】:

不要在 componentDidMount 上调用 api,而是在文本输入更改时或在文本输入旁边的提交按钮上调用它。
假设你有TextInput,使用

<TextInput placeholder="eg. New York" onChange={(val)=>this.apiCALL(val)}/>

并将apiCALL修改为

apiCALL(city){
  return fetch(
    `http://api.weatherapi.com/v1/current.json?key=???&q=${city}`//I took out the key on purpose.
  )
    .then((response) => response.json())
    .then((responseJson) => {
      this.setState({
        isLoading: false,
        locationData: responseJson.location,
        currentData: responseJson.current,
      });
    })
    .catch((error) => {
      console.log(error);
    });
}

现在这个功能是可重复使用的,可用于所有城市。

【讨论】:

  • 这可能是一个愚蠢的问题:onChangeText 和 onChange 有什么区别
  • 是的。改用 onChangeText。这是正确的方法。您可以在这里reactnative.dev/docs/textinput#onchange 参考差异。并且纠正错误,因为所有这些代码都是异步运行的,它甚至在它准备好之前就获取了this.state.currentData["condition"]["text"]。所以用这个代替它。 this.state.currentData &amp;&amp; this.state.currentData["condition"] &amp;&amp; this.state.currentData["condition"]["text"]。因此,它仅在可用时才使用该值。另外,请对答案表示赞同。
  • 它说未定义不是一个对象(评估'this.state.dataSourceCurrent["temp_f"]')我尝试了你的代码,但它不起作用
  • 在上面的注释中使用与 && 相同的逻辑。
  • 没关系,我想通了。非常感谢你的代码帮助了很多
猜你喜欢
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2017-08-09
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
相关资源
最近更新 更多