React - Axios 调用发出过多请求

Posted

技术标签:

【中文标题】React - Axios 调用发出过多请求【英文标题】:React - Axios call make too many requests 【发布时间】:2020-01-27 01:32:15 【问题描述】:

我正在通过制作游戏项目来学习 React 和 Redux。我想通过 API 获取数据(属性),但它会导致太多请求。猜猜可以将 axios 调用直接放在功能性反应组件中,但我不知道如何修复它。

function Attributes( attributes, dispatch ) 
  axios.get(`/api/heroes/1/get-attributes`).then(res => 
    dispatch(AttribAction.set(objectToArray(res.data)));
  );

  return (
    <div className="content">
      attributes.map((attrib, index) => (
        <div
          key=index
          className=attrib.id == null ? "attrib-block empty" : "attrib-block"
        >
          <p>
            <strong>attrib.name</strong>: attrib.value
          </p>
          <div>
            <button
              className="attrib-button"
              onClick=() => dispatch(AttribAction.increment(attrib.id))
            >
              +
            </button>
            <button
              className="attrib-button"
              onClick=() => dispatch(AttribAction.decrement(attrib.id))
            >
              -
            </button>
          </div>
        </div>
      ))
    </div>
  );


【问题讨论】:

【参考方案1】:

您可以使用useEffect 挂钩来运行数据提取。

传递一个空数组作为依赖意味着效果只会运行一次。

import React,  useEffect  from 'react';

function Attributes( attributes, dispatch )

    useEffect(() => 
        axios.get(`/api/heroes/1/get-attributes`)
            .then(res => 
               dispatch(AttribAction.set(objectToArray(res.data)));
            );
    , [])

    return(
        <div className="content">
            attributes.map((attrib, index) =>
                <div key=index className=attrib.id == null ? "attrib-block empty" : "attrib-block">
                    <p><strong>attrib.name</strong>: attrib.value</p>
                    <div>
                        <button className="attrib-button" onClick=() => dispatch(AttribAction.increment(attrib.id))>+</button>
                        <button className="attrib-button" onClick=() => dispatch(AttribAction.decrement(attrib.id))>-</button>
                    </div>
                </div>
            )
        </div>
    );


【讨论】:

【参考方案2】:

将代码放在一个useEffect钩子中,然后传入一个数组作为第二个参数,以指定哪些变量应该在它们发生变化时使其重复效果。一个空数组表示永远不要重复它。

import React,  useEffect  from 'react';

function Attributes( attributes, dispatch ) 
  useEffect(
   axios.get(`/api/heroes/1/get-attributes`)
     .then(res => 
       dispatch(AttribAction.set(objectToArray(res.data)));
     );
  , []);

  // ... etc

【讨论】:

以上是关于React - Axios 调用发出过多请求的主要内容,如果未能解决你的问题,请参考以下文章

React - Axios 获取请求将数据返回为 NULL

调用使用 v-for 中的信息发出 axios 请求的函数的好方法是啥?

来自 Storybook 的模拟 api 调用

Axios-一次发出多个请求(vue.js)

React 请求 URL 会自行更改,具体取决于调用的位置。 (axios 和 fetch 都有)

如何使用 Axios 通过 React 发出循环请求?