Массив состояний не определяется после удаления элемента

#reactjs #redux #react-redux

#reactjs #redux #реагировать-redux

Вопрос:

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

 const mobileList = useSelector((state) => state.MobileReducer.mobileList);
 

и из-за этого map не работает, поскольку список не определен, но после того, как я получил сообщение об ошибке, я проверил состояние с помощью Redux dev tools, и он показывает массив внутри списка без удаленного элемента, и этот код работает нормально при добавлении элемента, обновления состояния и список также отображаются с последними.

Компонент списка

 import React, { useEffect, useState } from "react";
import { useSelector, useDispatch } from "react-redux";
import Table from "react-bootstrap/Table";
import Button from "react-bootstrap/Button";
import allActions from "../Actions/index";
import EditModal from "./EditModal";

const MobileList = () => {
  const dispatch = useDispatch();
  debugger;
  const mobileList = useSelector((state) => state.MobileReducer.mobileList);
  const [modalShow, setModalShow] = useState(false);
  const editingItem = useSelector((state) => state.editingItem);
  const [editItem, setEditItem] = useState(false);

  useEffect(() => {
    if(editItem){
      setModalShow(true);
    }else{
      setModalShow(false);
    }
    
  }, [editItem]);

  return (
    <>
      <h1>Available Mobiles</h1>
      <Table responsive>
        <thead>
          <tr>
            <th>Model Name</th>
            <th>Brand Name</th>
            <th>Year</th>
            <th>Price</th>
            <th>Edit</th>
            <th>Delete</th>
          </tr>
        </thead>
        <tbody>
          {mobileList.map((item, i) => {
            return [
              <tr key={i}>
                <td>{item.ModelName}</td>
                <td>{item.Brand}</td>
                <td>{item.Year}</td>
                <td>{item.Price}</td>
                <td>
                  <Button variant="info" onClick={() => setEditItem(item)}>
                    Edit
                  </Button>
                </td>
                <td>
                  <Button
                    variant="danger"
                    onClick={() =>
                      dispatch(allActions.MobileActions.deleteItem(item))
                    }
                  >
                    Delete
                  </Button>{" "}
                </td>
              </tr>,
            ];
          })}
        </tbody>
      </Table>
      {modalShow ? (
        <EditModal
          show={modalShow}
          onHide={() => setModalShow(false)}
          item={editItem}
          onClean={() => setEditItem(null)}
        />
      ) : null}
    </>
  );
};

export default MobileList;
 

Редуктор

 const initialMobileListState = {
    mobileList:[],
    editingItem:null
}


const counter = (state = initialMobileListState, action) => {
    debugger;
    switch(action.type){
        case "SAVE":
            return {
                ...state,
                mobileList:[...state.mobileList, action.mobile]
            }
        case "EDIT":
            return {
                ...state,
                editingItem:[action.mobile]
            }
        case "DELETE":
            return state.mobileList.filter(a=>a.Id !== action.mobile.Id)
        
        default: 
            return state
    }
}

export default counter
 

Ответ №1:

Вам нужно исправить редуктор следующим образом. При удалении элемента вам необходимо сохранить state исходную структуру объекта, как и при сохранении элемента.

 const initialMobileListState = {
    mobileList:[],
    editingItem:null
}


const counter = (state = initialMobileListState, action) => {
    debugger;
    switch(action.type){
        case "SAVE":
            return {
                ...state,
                mobileList:[...state.mobileList, action.mobile]
            }
        case "EDIT":
            return {
                ...state,
                editingItem:[action.mobile]
            }
        case "DELETE":  // <--------------------------------
            return {
                ...state,
                mobileList: state.mobileList.filter(a=>a.Id !== action.mobile.Id)
            }
        default: 
            return state
    }
}

export default counter