【问题标题】:How to render a table from axios GET requests?如何从 axios GET 请求中渲染表格?
【发布时间】:2020-01-14 05:02:10
【问题描述】:

我正在尝试从 NBA API 呈现统计数据表。我正在使用 redux 来存储用户选择的玩家并通过我的 Table 组件请求 API。我适当地检索了统计信息,但它最终会无限地请求 API。我知道我在异步请求中设置钩子会导致这种行为,但我目前不确定解决方法。我认为这是一个生命周期错误,我是否应该尝试使用 useEffect 并将来自 redux 的播放器对象存储在依赖数组中?任何输入都会很棒。我将在下面发布代码。

这是我记录 cData 时的行为和控制台日志的屏幕截图: https://imgur.com/3WNsZt9

Table.js

const DataTable = () => {
  const [completeData, setCompleteData] = React.useState([]);
  const players = useSelector(state => state.players);
  var cData = [];

  const search = async val => {
    try {
      const res = await axios(
        `https://www.balldontlie.io/api/v1/season_averages?player_ids[]=${val}`
      );
      const responseData = res.data.data;
      console.log(responseData);
      return responseData;
    } catch (err) {
      console.log(err);
    }
  };

  return (
    <div>
      <h3>2019-2020 Season Averages</h3>

      <Table responsive>
        <thead>
          <tr>
            <th>Player</th>
            <th>Points</th>
            <th>Assists</th>
            <th>Rebounds</th>
            <th>Steals</th>
            <th>Blocks</th>
            <th>Turnovers</th>
          </tr>
        </thead>
        <tbody>
          {Object.keys(players).map(function(item, i) {
            var currentPlayerData = {};
            currentPlayerData = search(players[item])
              .then(result => {
                cData = JSON.parse(JSON.stringify(result[0]));
                console.log(cData);
                setCompleteData(old => [...old, cData]);

                // setCurrentData(cData);
              })
              .catch(err => {
                console.log(err);
              });
          })}
          {completeData &&
            completeData.map(function(item, i) {
              console.log(item);
              return (
                <tr key={i}>
                  <td>{item.id}</td>
                  <td>{item.pts}</td>
                  <td>{item.ast}</td>
                  <td>{item.reb}</td>
                  <td>{item.stl}</td>
                  <td>{item.blk}</td>
                  <td>{item.turnover}</td>
                </tr>
              );
            })}
        </tbody>
      </Table>
    </div>

【问题讨论】:

    标签: reactjs redux async-await axios react-hooks


    【解决方案1】:

    尝试这种方法(假设您希望在组件加载后立即从 NBA API 获取数据)。

    当您的表格组件加载时,在 componentDidMount() 中调用一个方法,例如在您的 action.js 中调用 this.getNBAdata(),这将从 API 获取数据。一旦您在.then() 中收到数据,您应该将带有有效负载数据的操作发送到reducer,我们可以通过添加mapStatetoProps() 您的表组件来使用它,因此一旦您在props 变量中收到数据,它将重新加载/刷新特定的组件,在 .map() 的帮助下,您应该能够在表格中显示数据。

    Action.js 示例请求:

    export const getNBAData = () => {
      return (dispatch) => {
    
    Axios.get("http://nbadataendpoint.com")
      .then(response => {
        //you will get the data in response object
        dispatch({ type: 'YOUR_SUCCESS', payload: 'SOME_VALUE' });
      })
      .catch(error => {
          dispatch({ type: 'UNAUTHORISED', payload: 'SOME_VALUE'});
        }
      });
     }
    };
    

    【讨论】:

    • 好的,我喜欢这个。但是我使用的是功能组件,所以对 React 有点陌生,我不确定如何使用 mapStatetoProps()。
    • 通常在 redux 中,所有异步流都经过中间件,例如 redux-thunk,然后到 reducer,然后是 mapStateToProps。如果您阅读功能组件 useEffect 中的一些 redux 文档会更好,它正在创建与 componentDidMount 类似的效果
    • 在你的表格组件中使用connect方法来使用mapstatetoProps,这里是例子:export default connect(mapStateToProps, { getNBAData })(TableComponent);
    • @mrbeans 好的,所以我已经根据您的建议设置了动作/减速器,但是我认为动作中存在问题。我不断收到此错误:错误:操作必须是普通对象。使用自定义中间件进行异步操作。这是我更新后的代码的样子:
    • 我可以看到在 action.js 代码中似乎有拼写错误。而不是 return function(dispatch) 你应该只使用 return (dispatch) 并返回 axios .get('url) 它应该是 axios.get('url')。请检查您编写的答案中的 action.js 代码 return 2 次。
    猜你喜欢
    • 2022-06-12
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 2022-01-05
    • 2018-02-01
    • 2020-03-25
    相关资源
    最近更新 更多