当前位置: 首页 > 知识库问答 >
问题:

如何用钩子在ReactJS中设置API请求的状态响应

慕通
2023-03-14

当您通过提交表单调用API请求时,如何设置Axios响应?我想从/在POST方法中发送表单,并获得API响应,然后用API响应重定向到/result页面。我的代码在下面,它引发

警告:无法对卸载的组件执行React状态更新。
这是一个no-op,但它表示应用程序中存在内存泄漏。
若要修复,请取消useEffect清理函数中的所有订阅和异步任务。在家(在app.js:21)

完成handleSubmit后,Submited存储true,但res仍然初始化为{},而不存储API响应。甚至console.log(response)也显示API的正确响应。我想做一个文本分类器WEB服务。我可能不得不使用warning所说的useEffect,但我不确定。并且不知道如何将其与表单提交一起使用。谢谢.

js prettyprint-override">function App() {
  return (
    <BrowserRouter>
      <div>
        <Switch>
          <Route exact path="/">
            <Home />
          </Route>
          <Route path="/result">
            <Result />
          </Route>
        </Switch>
      </div>
    </BrowserRouter>
  );
}

function Home() {
  const useInput = initialValue => {
    const [value, setValue] = useState(initialValue)
    return {
      value, 
      setValue,
      reset: () => setValue(''),
      bind: {
        value,
        onChange: event => {setValue(event.target.value)}
      }
    }
  }

  const [submitted, setSubmitted] = useState(false);
  const {value: url, bind: bindUrl, reset: resetUrl} = useInput('')
  const {value: content, bind: bindContent, reset: resetContent} = useInput('')
  const [res, setRes] = useState({})

  const handleSubmit = (event) => {
    event.preventDefault()
    axios.post('http://127.0.0.1:5000/predict', {url:url, content:content}) // My API
    .then(response => {
      setSubmitted(true)
      console.log(response)
      setRes(response) // This doesn't work
    })
  }
  if (submitted) {
    return <Redirect push to={{
      pathname: '/result',
      state: {response: res}
    }}
    />
  }   
  return (
  <div>
    <h1>Send URL and Content</h1>
    <form onSubmit={handleSubmit}>
        <label>
          URL:
          <input name="url" type="text" {...bindUrl} />
        </label>
        <br />
        <label>
          content:
          <input name="content" type="text" {...bindContent} />
        </label>
        <br />
        <input type="submit" value="Submit" />
        </form>
  </div>
  );
}

共有1个答案

吴英武
2023-03-14

您可以将此代码段添加到代码

useEffect(() => {
  if(Object.values(response).length) {  // Here place an valid check to know if valid response is present
      setSubmitted(submitted => !submitted)
  }
}, [response])

并将API调用方法更改为

const handleSubmit = (event) => {
event.preventDefault()
axios.post('http://127.0.0.1:5000/predict', {url:url, content:content}) // My API
.then(response => {
  setRes(response)
})
}
 类似资料:
  • 提前谢了。我有一个状态数组,如下所示。 我需要添加一个项目到状态数组,我发现我们不需要做状态突变。如何使用PrevState设置状态。 如何调用set State以追加此状态数组。 像这样的东西?

  • 这两个是等价的吗?如果不是,哪一个是最好的,为什么?

  • 问题内容: 我有以下基于渲染下拉列表呈现用户的类。如果我选择“字母”,则将按字母顺序列出用户;当我选择“组”时,将按组顺序列出用户。 在组件中,我正在通过props.members中的函数设置组件状态对象。 当我选择“组”排序时,组件正在卸载并且正在DOM中安装。同样,当我切换回“字母”排序时,在组件中预先设置的状态变量(成员)将变为NULL,因为该组件已从DOM中删除。 重新渲染b’coz时道具

  • 我有一个类组件,它返回使用Redux存储完全填充的状态: 但是,当我将上面的类组件切换到下面的功能组件,以便可以在代码中使用ReactJS钩子时,状态始终为空。

  • 问题内容: 如何在axios中设置获取响应的状态? 问题答案: 您在这里遇到语法错误。你应该试试这个 这里有几件事要注意: 是一个异步函数,这意味着其余代码将被执行。当服务器的响应到达时,传递给的函数将被执行。的返回值称为承诺对象。您可以在此处了解更多信息 关键字根据调用的位置而具有不同的值。in 应该 引用构造函数对象,并且在函数内部调用时,它引用该对象。这就是为什么我分配给变量的原因。您可以在

  • 我想用React useState钩子设置多个状态值,这样我就可以用useEffect钩子分别更新它们。我有以下代码: 但是当我用React DevTools检查应用程序时,我会看到钩子的多个“状态”值,而不是“订单”、“支付”、“提交”等。