【问题标题】:Redux Wait for Async Action to FnishRedux 等待异步操作完成
【发布时间】:2019-01-30 00:05:42
【问题描述】:

我收到 TypeError: Cannot read property 'map' of undefined in Products,因为它是在商店中的产品更新之前呈现的。因此我正在映射一个空数组。

我的问题是 - 如何在渲染 Products 组件之前等待异步操作 (fetchProducts) 完成?

fetchProducts 的工作原理:

在App中,fetchProducts从api中抓取数据;同时 state.status 是“”。

它 dispatch(fetchProductsRequest()) 并将 state.status 更改为“正在加载”。

最后,如果获取产品成功,它 dispatch(fetchProductsSuccess()) 并将 state.status 更改为“成功”。

Products.js

import React, { Component } from 'react';
import Product from './Product';

const Products = ({ products, addToCart }) => {
  console.log(products);
  console.log(addToCart);

  return (
    <div className='img-container'>
      {products.map((product, index) => {
        let num = index + 1;
        return (
          <Product key={product.name} image={product.image} name={product.name}
            price={product.price} num={num} addToCart={addToCart} />
        );
      })}
    </div>
  );
}; 

ProductsContainer.js

import React from 'react';
import { connect } from 'react-redux';
import AddToCart from '../actions/AddToCart';
import Products from '../components/Products';

const ProductsContainer = ({ products, addToCart }) => {
  console.log(products);
  return (
    <Products products={products} addToCart={addToCart} />
  );
}

const mapStateToProps = state => ({
  products: state.products
});

const mapDispatchToProps = dispatch => ({
  AddToCart: (num, cartItem) => dispatch(AddToCart(num, cartItem))
});

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

FetchProducts.js

import FetchProductsRequest from './FetchProductsRequest';
import FetchProductsSuccess from './FetchProductsSuccess';

const FetchProducts = () => {
  return (dispatch) => {
    fetch('/products')
      .then(res => res.json())
      .then(res => dispatch(FetchProductsSuccess(res)))
      .catch(err => console.log(err));
      dispatch(FetchProductsRequest());
  }
}

export default FetchProducts;

【问题讨论】:

  • 您的FetchProducts 函数在哪里调用?你也应该在FetchProductsSuccess之前发送FetchProductsRequest

标签: redux react-redux redux-thunk


【解决方案1】:

使 ProductsContainer 成为类组件,而不是功能组件

在 ProductsContainer 中的 componentDidMount 调用操作。

在 ProductsContainer 的渲染方法中做这样的事情。

render(){
    if (!this.state.products){
        return <div>Loading</div>
    }
    return (
        <Products products={this.state.products} />
    );
}

【讨论】:

  • fetchProducts 在 App 而不是 ProductsContainer 中被调用,让我编辑我的帖子
  • 所以在这种情况下你不需要在componentDidMount中调用它。跳过这一步。其余的都是一样的。
猜你喜欢
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 2013-06-09
  • 2013-08-10
  • 2020-10-04
  • 2019-05-31
  • 2021-04-16
相关资源
最近更新 更多