【问题标题】:How to prevent unwanted re-renders to stop another API call in react js?如何防止不需要的重新渲染以停止反应 js 中的另一个 API 调用?
【发布时间】:2021-08-29 22:28:36
【问题描述】:

这是一个组件(Cart)和一个组件(CartItem)。

父级中,有一个button,它依赖于通过道具传递给子级的checkAvailability函数改变的状态,

import {useState} from "react";
import CartItem from "./CartItem";

const Cart = ({cart}) => {
    const [available, setAvailable] = useState(true);

    const checkAvailability = (check) => {
        setAvailable(check)
    }


    return (
        <>
          {cart.items.map((item) => (
              item.is_valid && 

                  <CartItem 
                      key={item.id}
                      checkAvailability={checkAvailability}
                  />
          ))}


          <button disabled={available} >Click Me!</button>
        </>
    )
}

export default Cart;

child 组件中,API 调用 返回由useEffect 调用的true or false

import {useState, useEffect} from "react";


const CartItem = ({checkAvailability}) => {
const [newData, setNewData] = useState(null);


    const handleCheck = async () => {
    
       const data = await api.call();
        setNewData(data)
       
       if(newData.available === false) {
        checkAvailability(false)
       } else if(newData.available === true) {
        checkAvailability(true)
       }
    };

    useEffect(() => {
        handleCheck();
    }, []);



    
    return (
        <div> Item </div>
    )
};

export default CartItem;

问题:

每次挂载组件时,子组件中的 API 调用都会返回一个值,该值通过 checkAvailability 函数作为道具传递给父组件,这会更改父组件中的状态,当状态更改时 重新渲染发生,无限重启循环。

  • 主要是当 API 调用返回 {false} 值时按钮被禁用。如果这种方式不起作用,还有其他方法吗?

解决办法是什么?

【问题讨论】:

  • 我认为这里的问题是您没有为要映射的购物车项目指定任何 React 键。尝试添加每个购物车项目固有的键,例如 item.id
  • @DrewReese 在原始代码中,它们存在。为了简化代码,我决定不写它们。
  • 您能否更新您的问题以包含所有相关代码?它应该是一个Minimal, Complete, and Reproducible Code Example,足以让我们自己充分和(可能很容易地)复制。 Cart 组件是否因某种原因重新安装?我看不出为什么CartItem 组件会重新挂载。
  • 您是否尝试将 checkAvilability 添加为 useEffect 的依赖项?
  • 你应该在父组件中有api调用。为什么是子组件?

标签: javascript reactjs


【解决方案1】:

即使您解决了当前无限重新渲染的问题,如果有多个 &lt;CartItem/&gt; 组件,您仍然会有多个 API 请求。

更好的方法是将 API 调用移至父级。这将确保它被调用一次,而不管它有多少购物车项目。如果购物车项目需要知道available 的值,则将其传递给它们。

const CartItem = ({ available }) => {
  return <div> Item </div>
}

【讨论】:

  • 让我们说对于购物车中的每件商品,我想检查它是否在存储中可用,如果没有,API 将返回 false 值,因此在这种情况下,需要多个 API 请求。
  • 由于&lt;Cart /&gt; 呈现&lt;CartItem/&gt;s,它已经知道购物车项目应该是什么。您可以将一个请求中的项目 ID 数组发送到后端,并让它返回一个布尔数组,指示哪些项目在存储中可用...
猜你喜欢
  • 2023-03-04
  • 2022-01-23
  • 1970-01-01
  • 2022-11-07
  • 2020-07-25
  • 2020-07-04
  • 1970-01-01
  • 2020-12-07
  • 2019-12-01
相关资源
最近更新 更多