Redux 等待异步操作完成
Redux Wait for Async Action to Fnish
我收到 TypeError: Cannot read 属性 'map' of undefined in Products 因为它是在商店中的产品更新之前呈现的。因此我正在映射一个空数组。
我的问题是 - 如何在呈现产品组件之前等待异步操作 (fetchProducts) 完成?
fetchProducts 的工作原理:
在App中,fetchProducts从api中抓取数据;同时 state.status 是 ""。
它调度 (fetchProductsRequest()) 并将 state.status 更改为 "loading"。
最后,如果成功获取产品,它会调度 (fetchProductsSuccess()) 并将 state.status 更改为 "success"。
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);
获取Products.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;
使 ProductsContainer 成为 class 组件,而不是功能组件
在 ProductsContainer 中的 componentDidMount 调用动作。
在 ProductsContainer 的 render 方法中做这样的事情。
render(){
if (!this.state.products){
return <div>Loading</div>
}
return (
<Products products={this.state.products} />
);
}
我收到 TypeError: Cannot read 属性 'map' of undefined in Products 因为它是在商店中的产品更新之前呈现的。因此我正在映射一个空数组。
我的问题是 - 如何在呈现产品组件之前等待异步操作 (fetchProducts) 完成?
fetchProducts 的工作原理:
在App中,fetchProducts从api中抓取数据;同时 state.status 是 ""。
它调度 (fetchProductsRequest()) 并将 state.status 更改为 "loading"。
最后,如果成功获取产品,它会调度 (fetchProductsSuccess()) 并将 state.status 更改为 "success"。
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);
获取Products.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;
使 ProductsContainer 成为 class 组件,而不是功能组件
在 ProductsContainer 中的 componentDidMount 调用动作。
在 ProductsContainer 的 render 方法中做这样的事情。
render(){
if (!this.state.products){
return <div>Loading</div>
}
return (
<Products products={this.state.products} />
);
}