这是一个功能组件.在这里,我使用useEffect钩子来实现API对搜索的依赖性.我正在做控制台的地方.log(${search})正在控制台中显示当前搜索.如何在数组中获取最后五个搜索,然后显示它们?

    const [city, setCity] = useState(null);
    const [search, setSearch] = useState("Dehradun");


useEffect ( () => {
        const fetchApi = async () => {
            const url = `https://api.openweathermap.org/data/2.5/weather?q=${search}&units=metric&appid=7938d9005e68d8b258a109c716436c91`
            const response = await fetch(url);
            fetch("https://api.openweathermap.org/data/2.5/weather?q=${search}&units=metric&appid=7938d9005e68d8b258a109c716436c91")
            .then(result => console.log(`${search}`, result))
            const resJson = await response.json();
            setCity(resJson.main);
        };
        fetchApi();

    },[search] )```

推荐答案

下面的代码能够像您所期望的那样跟踪以前的搜索.它只是将之前对数组的响应与结果一起堆叠,并在大小超过5时从末尾排除项目.

function App() {
  const [search, setSearch] = React.useState("Dehradun");
  const [searchHistory, setSearchHistory] = React.useState([]);

  const doSearch = () => {
    if (search.length > 0) {
      fetch(
        `https://api.openweathermap.org/data/2.5/weather?q=${search}&units=metric&appid=7938d9005e68d8b258a109c716436c91`
      )
        .then((res) => res.json())
        .then((result) => {
          setSearchHistory((prevState) => [
            [search, result],
            ...prevState.slice(0, 4)
          ]);
          setSearch("");
        });
    }
  };

  return (
    <div>
      <input onChange={(e) => setSearch(e.target.value)} value={search} />
      <button onClick={doSearch}>search</button>
      {searchHistory.map(([search, result], index) => (
        <div key={index}>
          <b>{search}</b> : {JSON.stringify(result)}
        </div>
      ))}
    </div>
  );
}

ReactDOM.render(<App />, document.querySelector('.react'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div class='react'></div>

Javascript相关问答推荐

如何用变量productId替换 1"

try 在addEventHandler内设置表单的文件输入.值=空

Express.js:以块形式发送响应

React:如何将表格收件箱正确渲染为表格主体内的组件?

Vue Quill css仅应用于我的第一个Quill Editor组件+如何自定义工具栏

如何在JavaScript中通过一次单击即可举办多个活动

为什么在获取回调内设置状态(不会)会导致无限循环?

成帧器运动中的运动组件为何以收件箱开始?

我应该在redux reducer中调用其他reducer函数吗?

如何找出摆线表面上y与x相交的地方?

未捕获错误:[]:getActivePinia()被调用,但没有活动Pinia.🍍""在调用app.use(pinia)之前,您是否try 使用store ?""

如何从URL获取令牌?

使用Promise.All并发解决时,每个promise 的线性时间增加?

从Nextjs中的 Select 项收集值,但当单击以处理时,未发生任何情况

为什么可选参数的顺序会导致问题?

使用父标签中的Find函数查找元素

当从其他文件创建类实例时,为什么工作线程不工作?

如何为仅有数据可用的点显示X轴标签?

React:防止useContext重新渲染整个应用程序或在组件之间共享数据而不重新渲染所有组件

如何在FiRestore中的事务中使用getCountFromServer