封装全局modal

使用方式

openModal ({
   title: 'Modal',
   content: <RealationInfo node={node} />
});

封裝方法

import { newInstance } from '../components/sideModal/index';
import { history } from '../../store/createStore';

let sideModal = null;

history.listen(() => {
    if (sideModal) {
        sideModal.destroy();
        sideModal = null;
    }
});

export const openModal = async (params, callback, getContainer) => {
    if (!sideModal) {
        newInstance({}, n => (sideModal = n));
    }
    const fallback = () => {
        sideModal.destroy();
        sideModal = null;
        if (_.isFunction(callback)) {
            callback();
        }
    };

    sideModal.open({
        getContainer,
        title: 'MyModal',
        content: <MyModal />
    });
};

newInstance 文件

import { ConnectedRouter } from 'connected-react-router';
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { getCookie } from '~/common/utils';
import store, { history } from '../../store/createStore';
import SideModalList from './SideModalList';
import RequestProvider from './RequestProvider';
import request from '~/common/request';

export const newInstance = function newModalInstance(props, callback) {
    const div = document.createElement('div');
    document.body.appendChild(div);
    let called = false;
    function ref(sideModal) {
        if (called) {
            return;
        }
        called = true;
        callback({
            open(props) {
                sideModal.add(props);
            },
            remove(key) {
                sideModal.remove(key);
            },
            destroy() {
                const unmountResult = ReactDOM.unmountComponentAtNode(div);
                if (unmountResult && div.parentNode) {
                    div.parentNode.removeChild(div);
                }
            }
        });
    }
    ReactDOM.render(
            <Provider store={store}>
                <ConnectedRouter history={history}>
                    <RequestProvider value={request}>
                        <SideModalList {...props} ref={ref} />
                    </RequestProvider>
                </ConnectedRouter>
            </Provider>,
        div
    );
};

SideModalList

import React from 'react';
import { Drawer, ConfigProvider } from 'antd';
 
let seed = 0;
const now = Date.now();

function getUuid() {
    return `sideModal_${now}_${seed++}`;
}

class SideModalList extends React.Component {
    drawer = [];
    state = {
        data: []
    };
    add = notice => {
        notice.key = getUuid();
        notice.visible = true;
        this.setState(previousState => {
            const data = previousState.data;
            const updatedData = data.concat();
            updatedData.push(notice);
            return {
                data: updatedData
            };
        });
    };

    remove = key => {
        this.setState(previousState => {
            return {
                data: previousState.data.map(item => {
                    if (item.key === key) {
                        return { ...item, visible: false };
                    } else {
                        return item;
                    }
                })
            };
        });
    };
    saveDrawer = index => node => {
        this.drawer[index] = node;
    };
    render() {
        return this.state.data.map((item, i) => {
            return (
                <Drawer
                    getContainer={item.getContainer}
                    visible={item.visible}
                    key={item.key}
                    title={item.title}
                    ref={this.saveDrawer(i)}
                    onClose={() => this.remove(item.key)}
                >
                    <ConfigProvider getPopupContainer={() => this.drawer[i].bodyNode}>{item.content}</ConfigProvider>
                </Drawer>
            );
        });
    }
}

export default SideModalList;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaxLoongLvs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值