Визуализировать дочерний компонент после добавления данных в состояние

Я новичок в React и работаю над приложением React Redux. Когда я добавляю новый элемент в состояние, я хочу отобразить дочерний компонент, который показывает список элементов. В настоящее время список элементов отображается в состоянии, и новый элемент также добавляется в этот список (mobileList). Как я могу визуализировать дочерний компонент, когда в состояние добавляется новый элемент? В настоящее время дочерний компонент ничего не показывает.

Родительский компонент

import React, { useEffect, useState ,ComponentState} from "react";
import { useSelector, useDispatch } from "react-redux";
import { Button, Container, Row, Col, Form } from "react-bootstrap";
import uuid from "react-uuid";
import allActions from '../Actions/index'
import MobileList from './MobileList';

const MobileCreation = () => {
  const dispatch = useDispatch();

  const initialMobileState = {
    id: "",
    modelName: "",
    brand: "",
    year: "",
    price: "",
  };

  const [mobile, setMobile] = useState(initialMobileState);
  const [submitted, setSubmitted] = useState(false);
  const [submitSuccesful, setSubmitSuccesful] = useState(false);

  const handleInputChange = (event) => {
    const { name, value } = event.target;
    setMobile({ ...mobile, [name]: value });
  };

  const saveMobile = (event) => {
    event.preventDefault();
    setSubmitted(true);

    if (mobile.modelName && mobile.brand && mobile.year && mobile.price) {
      var data = {
        Id: uuid(),
        ModelName: mobile.modelName,
        Brand: mobile.brand,
        Year: mobile.year,
        Price: mobile.price,
      };
    }

   dispatch(allActions.MobileActions.save(data));
   setSubmitted(false);
   setMobile(initialMobileState);
  };

  return (
      <>
    <Form onSubmit = {saveMobile}>
      <Form.Group controlId = "mobile.ModelName">
        <Form.Label>Model Name</Form.Label>
        <Form.Control
          type = "text"
          placeholder = "Enter model name"
          name = "modelName"
          value = {mobile.modelName}
          onChange = {handleInputChange}
        />
        {submitted && !mobile.modelName && <div>Model name is required</div>}
      </Form.Group>
      <Form.Group controlId = "mobile.Brand">
        <Form.Label>Brand Name</Form.Label>
        <Form.Control
          type = "text"
          placeholder = "Enter Brand name"
          name = "brand"
          value = {mobile.brand}
          onChange = {handleInputChange}
        />
        {submitted && !mobile.brand && <div>Brand name is required</div>}
      </Form.Group>
      <Form.Group controlId = "mobile.Year">
        <Form.Label>Year</Form.Label>
        <Form.Control
          type = "text"
          placeholder = "Enter year"
          name = "year"
          value = {mobile.year}
          onChange = {handleInputChange}
        />
        {submitted && !mobile.year && <div>Year is required</div>}
      </Form.Group>
      <Form.Group controlId = "mobile.Price">
        <Form.Label>Price</Form.Label>
        <Form.Control
          type = "text"
          placeholder = "Enter price"
          name = "price"
          value = {mobile.price}
          onChange = {handleInputChange}
        />
        {submitted && !mobile.price && <div>Price is required</div>}
      </Form.Group>
      <Button variant = "primary" type = "submit">
        Submit
      </Button>
    </Form>
    <MobileList/>
    </>
  );
};

export default MobileCreation;

Дочерний компонент

import React, { useEffect } from "react";
import { useSelector, useDispatch ,} from "react-redux";
import Table from 'react-bootstrap/Table'

const MobileList = () => {
  const mobileList = useSelector((state) => state.mobileList);

  return (
    <>
      <Table striped bordered hover size = "sm">
        <thead>
          <tr>
            <th>Model Name</th>
            <th>Brand Name</th>
            <th>Year</th>
            <th>Price</th>
          </tr>
        </thead>
        <tbody>{mobileList ? 
             mobileList.map(function(item, i){
            <tr>
                <td>item.ModelName</td>
                <td>item.Brand</td>
                <td>item.Year</td>
                <td>item.Price</td>
            </tr>
            }) :
           <tr>
               <td>No data</td>
           </tr>
        
            }
        </tbody>
      </Table>
    </>
  );
};

export default MobileList;

Редуктор

const initialMobileListState = {
    mobileList:[]
}


const mobileReducer= (state = initialMobileListState, action) => {
    switch(action.type){
        case "SAVE":
            return {
                ...state,
                mobileList:[...state.mobileList, action.mobile]
            }
        case "FAIL":
            return state 
        default: 
            return state
    }
}

export default mobileReducer

Как я вижу, ваш дочерний компонент отрисовывается в любом случае. И он будет обновляться автоматически при обновлении state.mobileList. Кажется, проблема в том, как вы обновляете состояние. Он включает в себя, как работает «allActions.MobileActions.save» и как вы обновляете значения в редюсере.

Eugene 24.12.2020 17:45

Я обновил вопрос с кодом редуктора

charitht99 perera 24.12.2020 17:49

Я вижу, вы правильно обновляете редуктор. Тогда возникает вопрос: проверьте, действительно ли он обновляется при отправке формы? Поставьте туда какой-нибудь отладчик. И еще вопрос, действительно ли state.mobileList является правильным путем для получения данных.

Eugene 24.12.2020 17:56

Я проверил его с помощью инструментов разработчика redux, и он показывает элементы мобильного списка, я добавил изображение

charitht99 perera 24.12.2020 17:58

Хорошо, и вы проверили этот путь правильно? Разве это не похоже на state.MobileReducer.mobileList? Если нет, то мне нужна рабочий пример JS, чтобы увидеть весь код.

Eugene 24.12.2020 18:00

Спасибо за помощь, Евгений, проблема отсортирована после изменения state.mobileList на state.MobileReducer.mobileList.

charitht99 perera 24.12.2020 18:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
6
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в неправильном значении в селекторе. Вам нужно было использовать

state.MobileReducer.mobileList

вместо

state.mobileList

Другие вопросы по теме