redux: Array.find () не является функцией - PullRequest
0 голосов
/ 02 апреля 2020

Я работаю над собственным приложением реагирования, использую Basi c Redux для управления состоянием и начинающим к этому. В этой конкретной задаче c Я получаю данные из моего магазина Redx на экране редактирования, где у меня также есть опция для обновления данных

import React,{useState,useEffect,useCallback} from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { View,Text,StyleSheet,ScrollView,TextInput} from 'react-native';
import {Item, HeaderButtons} from 'react-navigation-header-buttons';
import HeaderButton from '../../components/UI/HeaderButton';
import * as productActions from '../../store/actions/products';

const EditProductScreen= ({navigation}) => {

    const prodId= navigation.getParam('productId');
    const editedProduct= useSelector(state => state.product.userProducts.find(prod => prod.id === prodId));

    const dispatch= useDispatch();
   const [title,setTitle]=useState(editedProduct ? editedProduct.title : '');
   const [imageUrl,setImageUrl]=useState(editedProduct ? editedProduct.imageUrl : '')
   const [price,setPrice]=useState(editedProduct ? editedProduct.price : '');
   const [description,setDescription]=useState(editedProduct ? editedProduct.description : '');

const submitHandler = useCallback(() =>{

     if(editedProduct){
       navigation.navigate({routeName:'UserProducts'});
      dispatch(productActions.updateProduct(prodId,title,imageUrl,description));

      }else{
       dispatch(productActions.createProduct(title,imageUrl,description, +price));
     }
   },[dispatch,prodId,title,imageUrl,description,price]);

   useEffect(()=>{
       navigation.setParams({submit:submitHandler});
   },[submitHandler]);

, но как только обработчик отправки выполнен и диспетчеризация действия заканчивается, когда экран перерисовывается, извлечение данных из приведения не работает!

    const editedProduct= useSelector(state => state.product.userProducts.find(prod => prod.id === prodId));

он дает эту ошибку - enter image description here, но сначала без диспетчерского действия этот код работает отлично. Нужно решить это, любые предложения ???? мое обновление редуктор-

  case UPDATE_PRODUCT:
           const productIndex=state.userProducts.findIndex(prod => prod.id===action.pid);

           console.log(state.userProducts[productIndex].price);
           const updatedProduct= new Product(
            action.pid,
            state.userProducts[productIndex].ownerId,
            action.productData.title,
            action.productData.imageUrl,
            action.productData.description,
            state.userProducts[productIndex].price
           );
         const updatedUserProducts= {...state.userProducts};
         updatedUserProducts[productIndex]=updatedProduct;
         const availableProductIndex=state.availableProducts.findIndex(prod => prod.id===action.pid);

         const updatedAvailableProducts= {...state.availableProducts};
         updatedAvailableProducts[availableProductIndex]=updatedProduct;

         return{
        ...state,
        userProducts:updatedUserProducts,
        availableProducts:updatedAvailableProducts
         };

1 Ответ

0 голосов
/ 02 апреля 2020

Похоже, требуется еще одна проверка:

const editedProduct= useSelector(state => state.product.userProducts.find(prod => prod.id === prodId));

to

const editedProduct= useSelector(({product}) => product && product.userProducts && product.userProducts.find(prod => prod.id === prodId));

, чтобы быть уверенным, что userProducts хотя бы там, прежде чем найти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...