无法访问 React 函数组件中的函数内部状态

IT技术 javascript reactjs react-hooks
2022-07-07 01:12:48

我在 React 中有以下组件:

import React, { useState, useEffect } from 'react';
import api from '../../services/api';

const Store = () => {
  const [products, setProducts] = useState([]);
  let pagination = null;

  const getProducts = async (page = 1) => {
    const { data } = await api.get('products', { params: { page } });

    setProducts([...products, ...data.products]);
    pagination = data.pagination;

    if (pagination.current < pagination.max) {
      document.addEventListener('scroll', loadMore);
    }
  };

  const loadMore = () => {
    const { scrollTop, clientHeight, scrollHeight } = document.documentElement;

    if (scrollTop + clientHeight >= scrollHeight - 300) {
      getProducts(pagination.current + 1);
      document.removeEventListener('scroll', loadMore);
    }
  };

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

  useEffect(() => {
    console.log(products);
  }, [products]);

  return (
    <div>
      {products.map(product => (
        <p>{product.name}</p>
      ))}
    </div>
  );
};

export default Store;

我的console.log内部useEffect钩子确实正确打印了产品数组,并且该组件也正确地呈现了产品标题。

但是,当我尝试访问函数products内部的变量时,getProducts它没有获得更新的产品值,而是获得了我在useState钩子中设置的值。

例如,如果我从一种产品开始状态,则productsgetProducts函数内调用将始终带来这一种产品,而不是从 API fetch 加载的产品,这些产品已正确记录在控制台中。

因此,当我尝试将更多产品添加到数组的末尾时,它实际上只是将产品添加到一个空数组中。

知道为什么会这样吗?能够访问useState钩子内部的产品状态但不能访问getProducts函数内部?

1个回答

发生这种情况是因为使用的是声明getProducts的值,而不是调用函数时的 值。当您想直接在非内联函数中访问最新状态时,总是会出现这种情况。大多数情况下,您需要通过函数参数传递更新的值。productsgetProductsproductsgetProducts

但这不是您的选择。在您的情况下,唯一的选择是使用前一个值作为传递给 setState 的回调的参数(在您的情况下,setProducts)。

希望这对将来的其他人有所帮助:)。