首页 > 解决方案 > Redux 组件没有重新渲染

问题描述

在 React-Redux 上需要一些帮助,我无法弄清楚我缺少什么来使我的模态工作。你能帮我解决这个问题吗?我看到状态正在改变,但组件没有呈现并且模式没有显示。

这是我的代码。你可以在这里找到回购

Entity

 export interface IModal {
        modalType: string;
        modalProps:IModalProps
    }

    export interface IModalProps {
        open:boolean;
    }

    export interface IModalManagerProps {
        currentModal?:IModal;
        closeModal?:()=>void;
    }

    export interface ILoginModalProps {
        closeModal:()=>void;
    }

    export interface IRegisterModalProps {
        closeModal:()=>void;
    }
   export interface IModalState {
     modal:IModal 
   }

Actions

import { ActionCreator } from 'redux';
import { IModalOpenAction, ModalActionTypes, IModalCloseAction } from './modalConstant';
import { IModal } from './Entity/modal';


export const openModalAction:ActionCreator<IModalOpenAction>=(modalpayload:IModal)=>{
    return {
         type:ModalActionTypes.MODAL_OPEN,
         payload:modalpayload 
    }
 }

 export const closeModalAction:ActionCreator<IModalCloseAction>=(modalpayload:IModal)=>{
     return {
         type:ModalActionTypes.MODAL_CLOSE,
         payload: modalpayload
     }
 }

Reducer

import { ModalAction, ModalActionTypes } from "./modalConstant";
import { IModalState } from "./Entity/IModalState";
import { IModal } from "./Entity/modal";
import { Reducer } from "redux";

const initialModal: IModal = {
  modalType: "",
  modalProps: {
    open: false
  }
};
const initialModalState: IModalState = {
  modal: initialModal
};

export const modalReducer: Reducer<IModalState, ModalAction> = (
  state = initialModalState,
  action: ModalAction
):IModalState => {
  switch (action.type) {
    case ModalActionTypes.MODAL_OPEN: {
      return {
        modal:{
          modalType: action.payload.modalType,
          modalProps: action.payload.modalProps
        }
      };
    }
    case ModalActionTypes.MODAL_CLOSE: {
      return initialModalState;
    }
    default:
      return state;
  }
};

export default modalReducer;

RootReducer

import { ModalAction, ModalActionTypes } from "./modalConstant";
import { IModalState } from "./Entity/IModalState";
import { IModal } from "./Entity/modal";
import { Reducer } from "redux";

const initialModal: IModal = {
  modalType: "",
  modalProps: {
    open: false
  }
};
const initialModalState: IModalState = {
  modal: initialModal
};

export const modalReducer: Reducer<IModalState, ModalAction> = (
  state = initialModalState,
  action: ModalAction
):IModalState => {
  switch (action.type) {
    case ModalActionTypes.MODAL_OPEN: {
      return {
        modal:{
          modalType: action.payload.modalType,
          modalProps: action.payload.modalProps
        }
      };
    }
    case ModalActionTypes.MODAL_CLOSE: {
      return initialModalState;
    }
    default:
      return state;
  }
};

export default modalReducer;

config store

import { IModalState } from './../../features/modals/Entity/IModalState';

import { createStore, Store  } from "redux"

import {composeWithDevTools } from 'redux-devtools-extension';
import rootReducer from '../reducers/rootReducer';

export interface IApplicationState {

    form:any,
    modals:IModalState 

}
export  function configureStore(): Store<IApplicationState> {
    const store = createStore(rootReducer,composeWithDevTools());
    return store;
  }

App

import React, { FC } from 'react';
import logo from './logo.svg';
import './App.css';
import { Button } from 'semantic-ui-react';
import {openModalAction } from './features/modals/modalActions'
import { connect } from 'react-redux';
import { IModal } from './features/modals/Entity/modal';
import { ModalManager } from './features/modals/modalManager';
export interface IAppProps {
  openModal:(modal:IModal)=>void,
}
const  App:FC<IAppProps>=(props)=> {
 const{openModal}=props;
  const handleOpenModal =()=>{
    openModal({
      modalType:'TestModal',
      modalProps:{
        open:true
      }
    })
  }
  return (
    <div className="App">
    <ModalManager></ModalManager>
    <Button onClick={handleOpenModal}>
    Open modal
  </Button>
    </div>
  );
}
const mapDispatchToProps = {

  openModal:openModalAction
};
export default connect(null, mapDispatchToProps)(App);

Modal Manager

import React, { FC } from "react";
import { connect } from "react-redux";
import { IModalManagerProps } from "./Entity/modal";
import { IApplicationState } from "../../app/store/configureStore";
import LoginModal from "./LoginModal";
import RegisterModal from "./RegisterModal";
import TestModal from "./TestModal";

const modalLookUp: any = {
  TestModal: TestModal,
  LoginModal: LoginModal,
  RegisterModal: RegisterModal
};
//export const ModalManager= (props:any) => {
export const ModalManager: FC<IModalManagerProps> = props => {
  const { currentModal } = props;

  console.log(currentModal);
  let renderedModal = null;
  if (currentModal) {
    const { modalProps } = currentModal;
    const ModalComponent = modalLookUp['TestModal'];
    renderedModal = <ModalComponent {...modalProps} />;
  }

  return <span>{renderedModal}</span>;
};

const mapStateToProps = (store: IApplicationState) => {
  return {
    currentModal: store.modals.modal
  };
};

export default connect(mapStateToProps)(ModalManager);

test modal

import React from "react";
import { Modal } from "semantic-ui-react";
import { closeModalAction } from "./modalActions";
import { connect } from "react-redux";


export const TestModal = () => {
  return (
    <div>
      <Modal closeIcon="close" open={true}>
        <Modal.Header>Test Modal</Modal.Header>
        <Modal.Content>
          <Modal.Description>
            <p>Test Modal... nothing to see here</p>
          </Modal.Description>
        </Modal.Content>
      </Modal>
    </div>
  );
};
const mapDispatchToProps = {
  closeModal:closeModalAction
 };
export default connect(null, mapDispatchToProps)(TestModal);

标签: reactjsreduxreact-redux

解决方案


我能够找到问题所在。

我正在导入如下

import { ModalManager } from './features/modals/modalManager';

但应该是

import  ModalManager  from './features/modals/modalManager';

推荐阅读