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

标签 javascript reactjs react-hooks

我在 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钩子(Hook)确实正确打印了产品数组,并且该组件也正确呈现了产品标题。

但是当我尝试访问productsgetProducts 内的变量函数它没有获取更新的产品值,它获取我在 useState 中设置的值钩子(Hook)。

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

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

知道为什么会发生这种情况吗?能够访问useState内的产品状态钩子(Hook)但不在 getProducts 内功能?

最佳答案

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

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

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

关于javascript - 无法访问 React 函数组件中函数内部的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60458187/

相关文章:

javascript - 减少数组的数组

javascript - 警报提示功能在 native react 中不起作用

reactjs - 基本理解 - React 应用程序中公共(public)目录的位置

reactjs - 对一组对象使用 useMemo/React.memo 以防止在编辑其中一个对象后重新渲染的最佳方法?

javascript - Leaflet.js geoJson 没有出现在 map 上 - 我试图显示方向

javascript - 在 Google 折线图中的线注释之上添加图像

javascript - React State 与 Props - 为什么状态变化没有反射(reflect)在组件中?

javascript - 如何在 css 中使用 javaScript 对象键的值?

reactjs - React 原生 setInterval useState

reactjs - 从API获取数据后如何设置react-select的默认值