使用 React、Redux 和 Immutable.js 创建模态弹出窗口

Creating modal popups with React, Redux, and Immutable.js

本文关键字:模态 创建 窗口 js Immutable React Redux 使用      更新时间:2023-09-26

在我的项目中,我希望能够为登录和注册帐户等事情调度模式弹出窗口。我遇到的问题是我希望它们能够用于任何目的,但我不确定如何以"React 方式"做到这一点。起初,我想这样做:

/

常量/模态.js

export const DISPATCH = 'MODAL/DISPATCH';
export const UPDATE = 'MODAL/UPDATE';
export const DISMISS = 'MODAL/DISMISS';
/

动作/模态.js

import {
    DISPATCH,
    UPDATE,
    DISMISS
} from '../constants/Modal';
export function dispatch(type, props) {
    return {
        type: DISPATCH,
        payload: {type, props}
    };
}
export function update(props) {
    return {
        type: UPDATE,
        payload: {props}
    };
}
export function dismiss() {
    return {type: DISMISS};
}
/

减速器/模态.js

import {Map} from 'immutable';
import {
    DISPATCH,
    UPDATE,
    DISMISS
} from '../constants/Modal';
const initialState = Map({
    type: '',
    props: Map(),
    isDispatched: false
});
export default function modalReducer(state = initialState, action) {
    switch (action.type) {
        case DISPATCH:
            return state.set('type', action.payload.type)
                .set('props', Map(action.payload.props))
                .set('isDispatched', true);
        case UPDATE:
            return state.set('props', Map(action.payload.props));
        case DISMISS:
            return state.set('isDispatched', false);
        default:
            return state;
    }
}
然后,

组件将触发这些操作,然后 ModalContainer 组件将根据state.modal.get('type')呈现相应的弹出窗口,并将state.modal.get('props')传递给模态组件。这样做的问题是道具最终会包括组件的子项和各种方法,这些方法在商店中没有业务。如何在不执行类似 React.render(<Modal {...props}>, document.getElementById('modal-container')) 的操作的情况下从不是 ModalContainer 组件子级的组件中渲染弹出窗口?

我在这个答案中描述了一种类似的模态对话方式。
根据我的经验,我只是不会使用有效载荷传递不可序列化的道具。

例如,

与其传递子项,我会将行为封装在适当的模态组件本身中,例如 <DeleteUserModal kind='sad' userId={42} hasErrors={false} /> .然后,DeleteUserModal根据需要连接到存储、检索所需的数据、调度操作以及选择要呈现的子项。

或者,您可以完全避免通过 Redux 路由模态,而只需使用类似 react-modal 的东西,它实际上为您执行此操作:

做一些像React.render(<Modal {...props}>, document.getElementById('modal-container'))?这样的阿西宁

(这不是asinine,人们称这种模式为"门户"。