javascript - react modal实现的思路是怎样的?
高洛峰
高洛峰 2017-04-11 09:06:38
[JavaScript讨论组]

react modal实现的思路是通过改变display来控制显示与否吗?
还是动态加载modal?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(3)
PHP中文网

都可以吧,react-bootstrap 里面是使用显隐的方式的,不过要改成 DOM 实时加载的方式也不困难。显隐的方式需要在 componentWillReceiveProps 里面初始化状态保证再次打开弹窗也是初始化的。如果是动态加载的方式的话倒是没有这个问题,但是如果碰上需要保存状态的情况就 gg 了。所以你可以看情况使用。

巴扎黑

有做过简单的semantic-ui modal的react化,可以参考下

import React, { Component, PropTypes } from 'react';
import ReactDOM from 'react-dom';
import classnames from 'classnames';

import $ from 'jquery';

function getInitState() {
    return {
        visible: false
    };
}


export default class Modal extends Component {

    constructor(props) {
        super(props);
        this.state = getInitState();
    }

    componentDidMount() {
        let that = this;
        let { eventNamePri } = this.props;
        $(window).on(`${eventNamePri}visible`, (ev) => {
            that.setState({ visible: true });
        });
        $(window).on(`${eventNamePri}hidden`, (ev) => {
            that.setState(getInitState());
        });

        // TODO : 可能需要添加resize到window上(函数节流)
    }

    onResize() {
        // 调整大小
        let contentDOM = ReactDOM.findDOMNode(this.refs.modalContent);
        if (contentDOM) {
            $(contentDOM).css('marginTop', ($(contentDOM).height() - $(window).height()) / 2);
        }
    }

    componentDidUpdate(prevProp, prevState) {
        if (!prevState.visible && this.state.visible || prevProp.children != this.props.children) {
            this.onResize();
        }
    }

    componentWillUnmount() {
        let { eventNamePri } = this.props;
        $(window).off(`${eventNamePri}visible`);
        $(window).off(`${eventNamePri}hidden`);
    }

    handleClick(ev) {
        let { eventNamePri } = this.props;

        if (ev.target == ReactDOM.findDOMNode(this.refs.modalPage)) {
            $(window).trigger(`${eventNamePri}hidden`);
        }
    }

    render() {
        let { visible } = this.state;
        let { title } = this.props;

        return (
            <p className="dimmable scrolling dimmed">
                <p ref="modalPage"
                     className={classnames('ui dimmer modals page transition', {
                         ' visible active ': visible,
                         ' hidden ': !visible
                     })} onClick={this.handleClick.bind(this)}>


                    <p ref="modalContent" style={{ fontSize: '14px' }}
                         className={classnames('ui scrolling modal transition ', {
                             ' visible active ': visible,
                             ' hidden ': !visible
                         })}>

                        <p className="ui center aligned header">{title}</p>

                        <p className="content">
                            {this.props.children}
                        </p>


                    </p>
                </p>
            </p>
        );
    }
}

Modal.propTypes = {
    // 触发事件的前缀,后面加hidden 代表隐藏, 添加visible代表显示
    eventNamePri: PropTypes.string,
    title: PropTypes.string
};

Modal.defaultProps = {
    eventNamePri: 'modal.',
    title: 'modal example'
};
PHP中文网

看过antd里面的modal, 就是通过控制display来实现的

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号