首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React服务器每秒向后端API发送4个请求

React服务器每秒向后端API发送4个请求
EN

Stack Overflow用户
提问于 2021-03-20 20:23:55
回答 2查看 37关注 0票数 0

所以我正在尝试制作一个web应用程序,它从后端API获取产品并将其显示到React前端,但这里的问题是React前端服务器每秒发送4-5个请求,这对后端服务器来说可能是非常有压力的。有没有办法让它在每次页面加载时只发送一个请求?

下面是我的代码:

代码语言:javascript
复制
import React, {useState, useEffect} from 'react'
import { Card } from 'react-bootstrap'
import axios from 'axios'


function HomeScreen() {
    const [products, setProducts] = useState([])

    async function getProducts() {
        try {
          const response = await axios.get('http://localhost:8000/api/products/');
          setProducts(response.data);
        } catch (error) {
          console.error(error);
        }
      }
      getProducts()
    return (
        <div>
            {products.map(product => (
                <Card className="my-3 p-3 rounded">
            <Card.Img src={'http://localhost:8000' + product.image} />
            <Card.Body>
            <Card.Title as="div">
                <strong>{product.name}</strong>
            </Card.Title>
            <Card.Text as="div">
            
            </Card.Text>
            <Card.Text as="h3">
            ${product.price}
            </Card.Text>
            </Card.Body>
        </Card>
            ))}
        </div>
    )
}

export default HomeScreen
EN

回答 2

Stack Overflow用户

发布于 2021-03-20 20:31:57

您应该将yoUr请求包装在useEffect钩子中。这防止了每次组件状态改变时都调用函数。

代码语言:javascript
复制
useEffect(() => {
    async function getProducts() {
        try {
          const response = await axios.get('http://localhost:8000/api/products/');
          setProducts(response.data);
        } catch (error) {
          console.error(error);
        }
      }
   getProducts()
},[])

现在,您的请求将仅在组件挂载后发送一次。

票数 2
EN

Stack Overflow用户

发布于 2021-03-20 20:30:27

这里的问题是,您在函数组件中使用getProducts方法时没有任何条件,因此它会不断地重新呈现。下面是修复它的方法:

挂载组件时,使用名为useEffect的挂接调用getProducts方法

代码语言:javascript
复制
import React, {useState, useEffect,useEffect} from 'react'
import { Card } from 'react-bootstrap'
import axios from 'axios'


function HomeScreen() {
    const [products, setProducts] = useState([])
    useEffect(()=>{
        // eslint-disable-next-line   
        getProducts();
    },[]);
    async function getProducts() {
        try {
          const response = await axios.get('http://localhost:8000/api/products/');
          setProducts(response.data);
        } catch (error) {
          console.error(error);
        }
      }
      
    return (
        <div>
            {products.map(product => (
                <Card className="my-3 p-3 rounded">
            <Card.Img src={'http://localhost:8000' + product.image} />
            <Card.Body>
            <Card.Title as="div">
                <strong>{product.name}</strong>
            </Card.Title>
            <Card.Text as="div">
            
            </Card.Text>
            <Card.Text as="h3">
            ${product.price}
            </Card.Text>
            </Card.Body>
        </Card>
            ))}
        </div>
    )
}

export default HomeScreen

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66721547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档