首页 > 解决方案 > TypeError:无法读取 react-redux 中未定义的属性“产品”

问题描述

此部分应该返回产品列表。在下面的代码 mapStatetoProps 部分抛出错误,我是 react-redux 的新手,有人可以向我解释这个问题以及如何解决它。如果有人能推荐任何教程或书籍以更好地理解 reactjs 和 redux,我将不胜感激。提前致谢。

import React, { useState, useEffect } from 'react';
import { connect } from 'react-redux';
import {
  getAllProducts,
  getRestProducts,
  showCartModal,
} from './../../redux/actions/product/productActions';
import Product from './Product';
import { Button } from 'react-bootstrap';

const Products = props => {
  const [products, setProducts] = useState([]);
  const [hasProduct, setHasProduct] = useState(false);
  let isMounted = false;
  useEffect(() => {
    isMounted = true;
    if (isMounted) {
      if (props.products < 1) {
        props.getAllProducts();
      }
      setProducts(props.products);
    }
    return () => {
      isMounted = false;
    };
  }, [props.products]);

  useEffect(() => {
    Object.keys(props.product).length > 0 && setHasProduct(true);
  }, [props.product]);

  const handleOnScrolledEnd = () => {
    if (
      products.length &&
      products.length < props.productsTotal &&
      props.productsTotal !== 0
    ) {
      props.getRestProducts(products.length + 50);
    }
  };
  const productList = props.loading ? (
    <div>loading</div>
  ) : (
    <li
      numColumns={2}
      columnWrapperStyle={{ flex: 1, justifyContent: 'space-around' }}
      data={products}
      renderItem={({ item }) => <Product item={item.name} id={item.id} />}
      keyExtractor={item => item.id.toString()}
      onEndReached={() => handleOnScrolledEnd()}
      onEndReachedThreshold={0.5}
    />
  );

  return <div>{productList}</div>;
};
Products.navigationOptions = ({ navigation }) => ({
  headerRight: () => (
    <div>
      <Button activeOpacity={0.9} onPress={() => navigation.navigate('Filter')}>
        <i name={'filter'} size={25} />
      </Button>
    </div>
  ),
});

const mapStateToProps = state => {
  return {
    products: state.products.products,
    product: state.products.product,
    productsTotal: state.products.productsTotal,
    showCartModalState: state.products.showCartModal,
    loading: state.products.productLoading,
  };
};

const mapDispatchToProps = { getAllProducts, getRestProducts, showCartModal };
export default connect(mapStateToProps, mapDispatchToProps)(Products);

产品.js

import React, { useContext, useState, useEffect} from 'react'
import { WishListContext } from './../../contexts/WishListContext'
import { Modal } from 'react-bootstrap'
import notification from './../Helpers/functions'
function Product({data}) {
    const product = data.data;
    const {wishListState, wishListDispatch } = useContext(WishListContext)

    useEffect(()=> {
        if(wishListState.products.length > 0) {
          //  localStorage.setItem('wish-list', JSON.stringify(wishListState.products))
        }
    }, )

    
    const handleClickWish = source => {
        const data = source.data;
        let stopMapping = false,
            pVariation = null,
            pOption = null,
            pPrice = null
        source.data.priceOptions.map(item => {
            pVariation = item.variation
            if (stopMapping === true) {
                return
            }
            item.options.map(optionItem => {
                if (optionItem.is_available === 'Yes') {
                    pOption = optionItem.option
                    pPrice = optionItem.price
                    stopMapping = true
                    return
                }
            })
        });
        const obj = {
            id: source.id,
            name: data.productName,
            image:data.cover,
            variation: pVariation,
            option: pOption,
            price:Number(pPrice),
            unit:1,
            total: Number(pPrice)
        }
        if (obj.id && obj.name && obj.option && obj.image && obj.variation && obj.price && obj.unit && obj.total) {
            wishListDispatch({
                type:"ADD_WISH",
                payload: obj
            })
            notification('Wish', 'New product added to wish list!', 'success')
        } else {
            notification('Wish', 'Failed to add to wish list!', 'danger')
        }
    }
    return (
        product?.priceOptions[0]?.options.length > 0 ?
        <div className="card">
            <div className="card-wrapper">
                <img className="card-img" src={ product.cover ? product.cover : product.productImages[0] } alt={ product.productName } />
                <div className="card-body">
                    <p className="card-price">Rs { product.priceOptions[0]?.options[0]?.price } </p>
                    <h4 className="card-title">{ product.productName }</h4>
                    <span className="card-cart" onClick={() => handleClickWish(data)}><ion-icon name="heart-empty"></ion-icon></span> 
                </div>
            </div>
        </div> :
        ''
     )
  }
export default Product;

标签: reactjsreact-nativereact-redux

解决方案


推荐阅读