【问题标题】:React JS API Post RequestReact JS API 发布请求
【发布时间】:2020-05-14 05:12:22
【问题描述】:

伙计们,我需要帮助来发出 API 搜索请求,该请求应在页面准备就绪时完成。 这是状态对象:

 const [state, setState] = useState({
    s: "",
    results: [],
    selected: {}
  });

  const apiurl = ....;

这就是我的搜索输入的实际工作方式:

  const search = (e) => {
    if (e.key === "Enter") {
      axios(apiurl + "&s=" + state.s).then(({data}) => {
        let results = data.Search;
        setState(prevState => {
          return {...prevState, results: results }
        });
      });
    }
  }

  const handleInput = (e) => {
    let s = e.target.value;

    setState(prevState => {
      return { ...prevState, s: s }
    });
  }

我的组件:

 return (
   <div className='basic'>
     <Header />
     <Search handleInput={handleInput} search={search} />
     <Container>
       <Results results={state.results} openPopup={openPopup} />
       {(typeof state.selected.Title != "undefined") ? <Popup selected={state.selected} closePopup={closePopup} /> : false }
     </Container>
    </div>
  );

Search.js:

function Search ({ handleInput, search}) 
  return (
    <Container bg="dark" variant="dark">
      <section className="searchbox-wrap">
        <input
          type="text"
          placeholder="Поиск фильма"
          className="searchbox"
          onChange={handleInput}
          onKeyPress={search}
        />
      </section>
    </Container>
  )

Results.js:

function Results ({ results, openPopup }) {
  return (
    <section className="results">
      {results.map(result => (  
        <Result key={result.imdbID} result={result} openPopup={openPopup} />
      ))}
    </section>
  );
}

那么我怎样才能在页面加载时完成搜索请求(例如:超人)?谢谢!

【问题讨论】:

  • 请参阅:reactjs.org/docs/react-component.html#the-component-lifecycle。你需要componentDidMount()
  • 您的search 函数似乎只有在按下"Enter" 键时才会被调用。您的意思是要阻止search 的调用,即使在您的页面仍在加载时按下了键?
  • PLUS) 应将"Enter" 的按键事件与其事件值e.keyCode === 13 进行比较。
  • @cadenzah 不是真的,我因此被卡住了,所以现在我尝试在不触及这个常量的情况下找出解决方案
  • @TimurIvanov 那么我认为你的search 没有太大问题,但可能你在 JSX 组件中放错了。为什么不将组件的代码放在问题中?

标签: javascript reactjs api


【解决方案1】:

您可以使用useEffect 钩子来做到这一点,当一个空数组作为第二个参数传递时,这相当于componentDidMount() 生命周期方法。所以修改后的代码如下所示:

import React, { useState, useEffect, useCallback } from 'react';

function SearchComponent() {
  const [state, setState] = useState({
    s: "Superman",
    results: [],
    selected: {}
  });
  const apiurl = "";

  const makeSearchRequest = useCallback(
    searchString => {
      axios(apiurl + "&s=" + searchString)
        .then(({ data }) => data.Search)
        .then(results => setState(prevState => ({ ...prevState, results })));
    },
    [setState]
  );

  // This will be invoked only on component mount
  useEffect(() => makeSearchRequest(state.s), []);

  const handleInput = useCallback(
    e => {
      e.persist();
      setState(prevState => ({ ...prevState, s: e.target.value }));
    },
    [setState]
  );

  const search = useCallback(
    e => {
      if (e.key === "Enter") {
        makeSearchRequest(state.s);
      }
    },
    [makeSearchRequest, state.s]
  );

  return (
      <input
        type="text"
        value={state.s}
        onChange={handleInput}
        onKeyPress={search}
      />
  );
}

【讨论】:

  • @oozywatees 非常感谢你,但现在当我尝试在 input4 中输入任何内容时页面都崩溃了
  • ``` 33 | useEffect(() => makeSearchRequest(state.s), []); 34 | 35 | const handleInput = useCallback( > 36 | (e) => setState(prevState => ({ ...prevState, s: e.target.value }), | ^ 37 | [] 38 | )) 39 | ```
  • 知道了。这是因为事件池。更新了我的代码,现在它可以正常工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多