代码之家  ›  专栏  ›  技术社区  ›  charitht99 perera

移除项后状态数组将取消绑定

  •  0
  • charitht99 perera  · 技术社区  · 4 年前

    我是React新手,目前正在处理React Redux应用程序,我想删除处于Redux状态的数组中的项。删除后,一个项(移动)列表在UseSelector中显示为未定义

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

    列表组件

    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 回复  |  直到 4 年前
        1
  •  1
  •   Prime    4 年前

    你需要像这样修理减速机。删除项目时,需要保留 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