首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询接口调用触发useEffect

查询接口调用触发useEffect
EN

Stack Overflow用户
提问于 2019-12-16 03:55:57
回答 2查看 2.3K关注 0票数 0

我正在尝试使用React Hooks构建一个搜索组件,其主要功能是当我将一个单词放入我的输入中时,我使用该单词进行API调用,它将返回匹配的单词

现在,该组件如下所示

代码语言:javascript
复制
import React, { useState, useEffect } from 'react';
import axios from 'axios';
import './SearchBar.css';

export function SearchBar() {
  const [query, setQuery] = useState('');
  const [searchResults, setSearchResults] = useState([]);
  const handleChange = event => {
    setQuery(event.target.value);
    console.log(event);
  };

  useEffect(() => {
    const fetchCities = query => {
      const uri = 'http://0.0.0.0:8000/v1/autocomplete/';
      axios
        .get(uri, {
          params: {
            q: query
          }
        })
        .then(response => {
          const data = response.data.filter(name =>
            name.toLowercase().includes(query)
          );
          setSearchResults(data);
          console.log('searchResults' + searchResults);
        })
        .catch(err => {
          console.log(err); //I know this is nothign but im running out of time tbh
        });
    };

    fetchCities();
  }, [query]);

  const handleSubmit = evt => {
    /*  evt.preventDefault();
    alert(apiCall());
    reset(); */
  };
  return (
    <form onSubmit={handleChange} className='display'>
      <input
        type='text'
        placeholder='Search'
        onChange={event => setQuery(event.target.value)}
      />
      <input type='submit' value='Submit' className='resize' />
      <ul>
        {searchResults.map(item => (
          <li>{item}</li>
        ))}
      </ul>
      <div></div>
    </form>
  );
}

现在,在页面加载时,我得到了这个错误

代码语言:javascript
复制
xhr.js:166 GET http://0.0.0.0:8000/v1/autocomplete/ 400 (Bad Request)
dispatchXhrRequest @ xhr.js:166
xhrAdapter @ xhr.js:16
dispatchRequest @ dispatchRequest.js:49
Promise.then (async)

当我只想在提交表单时进行API调用时。有什么帮助吗?

EN

回答 2

Stack Overflow用户

发布于 2019-12-16 04:13:49

我对你的代码样本做了一点更新:

在我看来,主要问题是抓取url没有运行。

代码语言:javascript
复制
import ReactDOM from "react-dom";
import React, { useState, useEffect } from "react";
import axios from "axios";

function App() {
  const [query, setQuery] = useState("");
  const [searchResults, setSearchResults] = useState([]);
  const handleChange = event => {
    setQuery(event.target.value);
  };

  useEffect(() => {
    const fetchCities = qry => {
      const uri = "https://www.mocky.io/v2/5df693273400002900e5a5f3";

      axios
        .get(uri, {
          params: {
            q: qry
          }
        })
        .then(response => {
          const data = response.data.tags.filter(name =>
            name.toLowerCase().includes(qry)
          );
          setSearchResults(data);
        })
        .catch(err => {
          console.log("error", err); //I know this is nothign but im running out of time tbh
        });
    };

    fetchCities(query);
  }, [query]);

  const handleSubmit = evt => {
    evt.preventDefault();
  };
  return (
    <form method="POST" onSubmit={handleChange} className="display">
      <input
        type="text"
        placeholder="Search"
        onChange={event => setQuery(event.target.value)}
      />
      <input
        type="submit"
        onClick={handleSubmit}
        value="Submit"
        className="resize"
      />
      <ul>
        {searchResults.map(item => (
          <li>{item}</li>
        ))}
      </ul>
      <div />
    </form>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
票数 0
EN

Stack Overflow用户

发布于 2019-12-16 04:21:45

useEffect将在组件首次挂载时触发,因此您需要在其内部使用一条if语句来决定是否要进行API调用:

代码语言:javascript
复制
useEffect(() => {
  if (query === "") return

  const fetchCities = query => {
    // ...
  }
  fetchCities()
}, [query])

但是,如果您只想在提交表单时触发API调用,我会简化您的代码:

代码语言:javascript
复制
function SearchBar() {
  const [query, setQuery] = useState('')
  // ...
  const handleSubmit = (event) => {
    event.preventDefault()

    const uri = '...'
    axios.get(uri, { params: { q: query } })
      .then(response => {
        // ...
        setSearchResults(data)
      })
      .catch(err => { ... })
  }

  const handleQueryChange = (event) => {
    setQuery(event.target.value)
  }

  return (
    <form onSubmit={handleSubmit}>
      <input type="text" placeholder="Search" onChange={handleQueryChange} />
      <input type="submit" value="Submit" /> 
      {...}
    </form>
  )

这样,您就不会在每次向search字段中键入新字符时都调用您的API端点。当您单击submit时,它将只被调用一次。

有关示例,请参阅以下CodeSandbox链接:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59347562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档