前端开发那些事代码改变世界

ant-design二次封装-实现全屏弹窗

2019-10-20  本文已影响0人  Jkanon

最近正在开发自己开源的通用爬虫的前端界面,用的是ant-design-pro进行的二次开发,遇到的坑还是很多的,因此接下来分享的内容大多都是和ant-design有关的,经验都来自于自己的填坑之旅。本篇我们来讲讲怎么实现Modal组件的全屏功能。

我们希望实现一下功能

寻找图标嵌入点

按照惯例,全屏控制图标都是放置在弹窗的头部区域,靠近关闭按钮附近。在浏览过官方组件使用文档之后,大致发现有两个地方可以实现此功能。

嵌入控制图标

此处我们选择title属性来实现,通过增加一个中间层在用户传入的title中添加一个全屏控制弹窗

const { title } = this.props;
return (
      <>
        {title}
          <button
            type="button"
            className="ant-modal-close"
            style={{ right: 42 }}
          >
            <span className="ant-modal-close-x">
              <Icon className="ant-modal-close-icon" type="arrows-alt" />
            </span>
          </button>
      </>
    );

上述代码中的全屏控制按钮copy自弹窗中的关闭按钮,唯一的不同就是图标的位置及图标类型。我们将上述代码封装成一个函数,将其执行结果赋予modaltitle属性。
实现效果如下:

实现全屏控制功能

上述我们提到要实现用户能够自由控制全屏及退出全屏的功能。因此我们定义一个名为fullScreenstate属性来控制当前的弹窗状态。

// 切换当前全屏状态
toggleFullScreen = () => {
    const { fullScreen } = this.state;
    this.setState({
      fullScreen: !fullScreen,
    });
  };

titleRender = () => {
  const { title } = this.props;
  const { fullScreen } = this.state;
  return (
      <>
        {title}
          <button
            type="button"
            className="ant-modal-close"
            style={{ right: 42 }}
            onClick={this.toggleFullScreen}
          >
            <span className="ant-modal-close-x">
              <Icon className="ant-modal-close-icon" type={fullScreen ? 'shrink' : 'arrows-alt'} />
            </span>
          </button>
      </>
    );
  };

同时我们希望通过css来控制全屏的样式,因此我们需要通过上述fullScreen来给予modal不同的样式名。

const { fullScreen } = this.state;
render() {
  <Modal
                wrapClassName={`${fullScreen ? 'modal-wrap-fullscreen' : ''}`}
                title={this.titleRender()}
                {...rest}
 />
}

上述代码我们通过modal-wrap-fullscreen来控制全屏的时候的样式,这边需要css控制的样式主要有:

其它控制参数

titleRender = () => {
  const { title, maxmin } = this.props;
  const { fullScreen } = this.state;
  return (
      <>
        {title}
        {maxmin && (
          <button
            type="button"
            className="ant-modal-close"
            style={{ right: 42 }}
            onClick={this.toggleFullScreen}
          >
            <span className="ant-modal-close-x">
              <Icon className="ant-modal-close-icon" type={fullScreen ? 'shrink' : 'arrows-alt'} />
            </span>
          </button>
        )}
      </>
    );
  };

结语

上述代码只是为了说明实现思路作为参考,可能并不完整。详细可以查看我托管的代码,当然我封装的代码中实现的功能会更多一点,具体可以看这

上一篇 下一篇

猜你喜欢

热点阅读