javascript - 异步调用 axios API 后使用 React hook 和 redux 设置状态

标签 javascript reactjs redux react-redux axios

我正在使用 axios 从服务器获取产品,并在 CatalogProducts 组件中呈现数据,如下所示:

const CatalogProducts = props => {
  const classes = useStyles();

  const [data, setData] = useState([]);

  const fetchProducts = async () => {
    await props.getProducts();
  };

  useEffect(async () => {
    fetchProducts();
    setData(props.products);
  }, []);

  const { products } = props.products;

  const items = products.map((product, index) => {
    return (
      <Grid item xs={12} sm={6} md={3} key={index}>
        <CatalogProduct product={product} />
      </Grid>
    );
  });

  if (products.length === 0) {
    return <p>Loading ...</p>;
  } else {
    return (
      <Container maxWidth="xl" className={classes.root}>
        <Grid
          container
          direction="row"
          justify="center"
          alignItems="center"
          spacing={3}
        >
          {items}
        </Grid>
      </Container>
    );
  }
};

const mapStateToProps = state => {
  return {
    products: state.products
  };
};

const mapDispatchToProps = dispatch => ({
  getProducts: () => dispatch(actions.getProductsAction())
});

export default connect(mapStateToProps, mapDispatchToProps)(CatalogProducts);

我可以使用 props.products 访问产品数据,但是当我想使用 data 变量访问它们时,我不知道这是否是一个好主意与 setData() 一起使用吗?

最佳答案

在您的功能组件中,您可以使用新的 useDispatchuseSelector更易于使用的功能。

您可以用此替换 CatalogProducts 代码,导入其他必要的导入并尝试吗?

import React, { useEffect, useCallback } from "react";
import { useSelector, useDispatch } from "react-redux";
//other imports

const CatalogProducts = () => {
  const classes = useStyles();
  const dispatch = useDispatch();
  const products = useSelector(state => state.products);
  console.log("Products: ", products);

  const fetchProducts = useCallback(() => {
    dispatch(actions.getProductsAction());
  }, [dispatch]);

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

  const items = products.map((product, index) => {
    return (
      <Grid item xs={12} sm={6} md={3} key={index}>
        <CatalogProduct product={product} />
      </Grid>
    );
  });

  if (!products) {
    return <p>Loading ...</p>;
  } else if (products.length === 0) {
    return <div>No products found</div>;
  } else {
    return (
      <Container maxWidth="xl" className={classes.root}>
        <Grid
          container
          direction="row"
          justify="center"
          alignItems="center"
          spacing={3}
        >
          {items}
        </Grid>
      </Container>
    );
  }
};

export default CatalogProducts;

样本codesandbox使用 jsonplaceholder fake api。

关于javascript - 异步调用 axios API 后使用 React hook 和 redux 设置状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59284606/

相关文章:

HTML 形式的 Javascript 多维

javascript - 如何以 angularjs 方式执行以下 jquery 代码

javascript - redux 不会通过 browserHistory.push() 强制使用 mapStateToProps

javascript - React/Redux 应用程序中的动态 header 子组件

javascript - 不使用正则表达式匹配嵌套出现的情况

javascript - 如何在reactjs中强制从父组件更新子组件

reactjs - React应用程序在本地运行,但部署到Azure Web App时不起作用

ios - 在没有 ssl 证书的情况下在 WebView 中打开 Https URL

javascript - react-syntax-highlighter 不是美化代码?

javascript - 如何正确处理聊天消息应用程序的 'read' - 'unread' 状态?