【问题标题】:Make an http request and parse the data in React发出 http 请求并在 React 中解析数据
【发布时间】:2021-12-17 20:58:58
【问题描述】:

我正在尝试使用基于 React 的前端向我的后端服务器(在 java springboot 上运行)发出一个 http 请求,该前端返回一个我想要解析并分配给值的字符串。从我在语法页面上看到的内容来看,我想相信我正确地调用了请求。我的错误消息提到“无法读取未定义的属性(读取'split')”,我认为这意味着 split() 不是 js 或 React 的有效操作?有谁知道这个的正确方法是什么?

import React from 'react';
import './App.css';
import Exchange from './Exchange'
import Recommendations from './Recommendations';
import axios from "axios";


function Middle(){
    const response = axios.get("http://localhost:8080/run");
    const data = response.data;
    const dataArr = data.split(",");
    
    return (

        <div className = 'Middle'>
            <h1>{data}</h1>
           <Exchange name = "Coinbase" btcBuy = {dataArr[1]} btcSell = "" ethBuy = "" ethSell = ""/>
           <Exchange name = "Binance" btcBuy = "" btcSell = "" ethBuy = "" ethSell = ""/>
           <Recommendations/>
        </div>

    );
};
export default Middle;

【问题讨论】:

标签: javascript reactjs axios httprequest


【解决方案1】:

这是因为尚未设置数据。 axios 返回您必须为此目的使用 await 的承诺。并且你不应该调用 api 那样的 useeffect 是为此目的而构建的

import React from 'react';
import './App.css';
import Exchange from './Exchange'
import Recommendations from './Recommendations';
import axios from "axios";


function Middle(){
    const [data,setData] = React.useState(null)

    useEffect(()=>{
     //will get rid of warning of memory leak
    let mounted = false 
    if(!mounted){
    axios.get("http://localhost:8080/run")
   .then(data=>setData(data))
   .catch(err=>//do something);
    }
   return ()=>mounted= true
   
},[])
    
    
    return (

        <div className = 'Middle'>
            <h1>{data}</h1>
           <Exchange name = "Coinbase" btcBuy = {dataArr[1]} btcSell = "" ethBuy = "" ethSell = ""/>
           <Exchange name = "Binance" btcBuy = "" btcSell = "" ethBuy = "" ethSell = ""/>
           <Recommendations/>
        </div>

    );
};
export default Middle;

【讨论】:

  • 使用异步函数作为 useEffect 回调是一种不好的做法。
  • 进一步扩展,useEffect 期望您返回一个 函数(如果有的话)进行清理,而不是未定义的 Promise。
  • @jaredSmith 你说得对,返回清理功能。我添加了一些更改
  • 挂载检查是怎么回事?那是known React anti-pattern。只是不要返回任何东西。此外,.then(data =&gt; setData(data)) 可以只是 .then(setData)
  • @JaredSmith 请仔细检查代码我是否使用过时的 isMounted() 方法?我正在手动跟踪安装状态,据我所知这是一个很好的做法。关于.then(setData)你确定吗,请解释一下。
【解决方案2】:

表示data 变量不是字符串。如果要获取数据,还需要使用 useEffect。

import React, { useState, useEffect } from "react";

function Middle(){

    const [data, setData] = useState([]);

    useEffect(() => {

      (async () => {
        try {
          const response = await axios.get("http://localhost:8080/run");
          const data = response.data;
          setData(data); // use split if you have to, I dont think you need that.
        } catch(err) {
          console.error(err);
        }
      })()

    }, [])
    

【讨论】:

  • 请注意,这将在每次渲染时再次获取数据。您可能希望将依赖项数组添加到 useEffect
  • 当我这样做时,我得到一堆编译错误,说 data、setData 和 useState 没有定义。我需要导入其他东西吗?我不相信我必须
  • 哦...导入 useState 和 React。让我编辑一下。
  • 我也忘记了 const [data, setData]。
  • 那是服务器问题。我很高兴它有所帮助。
【解决方案3】:

实际上您没有正确阅读response,因为它是一个异步操作,并且在您按顺序对其进行操作时您的响应是undefined

您必须将代码放在.then 的正文中,如下所示:

let dataArr = [];
axios.get("http://localhost:8080/run")
    .then(response => {
        const data = response.data;
        dataArr = data.split(",");
    });

【讨论】:

  • 你不能在 React 函数组件中做任意的副作用(比如 axios 请求)。查看其他答案。
  • 所以他可以将其拆分为多个功能,我的回答只是为了给人一种asyncivity..的感觉
  • 除了 OP 显然是一个没有经验的开发人员,并且会将您的答案复制粘贴到他们的 React 函数组件中,然后不明白为什么它不起作用或仅偶尔起作用.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多