查看详情弹框,公共组件思路

问题描述

最近做的后台管理系统,查看详情弹框用的页面比较多,想抽出来封装成公共组件。但是思路不是很明确,同学们给个思路,最好有代码看下,谢谢!
图片描述

阅读 3k
2 个回答

介于题主的目前水平,这里主要介绍基础原理以及热门开发库是怎么设计的

单例模式

试想以下,当我们单击登录按钮的时候,页面会出现一个登录浮窗,而这个浮窗是唯一的,
无论单击多少次登录按钮,这个浮窗都只会被创建一次,那么这个登录浮窗就适合用单例模式来创建。[1]

具体实现: 传送门-gist.github

进不去地看这里 ↓

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="hello"></div>
<button onclick="open1()">open</button>
<button onclick="close1()">close</button>
<script>
    var getSingle = function(fn){
        var result
        return function(){
            return result || ( result = fn.apply(this, arguments) )
        }
    }
    var createLoginLayer = function(){
        var div = document.createElement( 'div' )
        div.innerHTML = '我是登录浮窗'
        div.style.display = ' none '
        hello.appendChild( div )
        return div
    }
    //预渲染浮窗
    var LoginLayer = getSingle( createLoginLayer )
    //打开浮窗
    function open1(){
        LoginLayer().style.display = 'block'
    }
    //关闭浮窗
    function close1(){
        LoginLayer().style.display = 'none'
    }
</script>
</body>
</html>

React

React渲染原理基于虚拟DOM树,为避免污染树结构,而Modal又是典型的脱离树之外的DOM,
所以React提供了一个API叫Portals
Portals提供了一种将子项呈现为存在于父组件的DOM层次结构之外的DOM节点的第一类方法。[2]
简而言之,一般基于React开发都会使用这个API来创建Modal组件

详解文章:传送门-知乎专栏

ReactDOM.createPortal(child, container)
class Dialog extends React.Component {
    constructor() {
        super(...arguments);

        const doc = window.document;
        this.node = doc.createElement('div');
        doc.body.appendChild(this.node);
    }

    render() {
        return createPortal(
            <Fragment>
                {this.props.children}
            </Fragment>, //塞进传送门的JSX
            this.node //传送门的另一端DOM node
        );
    }

    componentWillUnmount() {
        window.document.body.removeChild(this.node);
    }
}

图片描述

Vue

为啥vue被放在最后面,因为我不怎么研究vue?
感觉vue就比较自由,没有那么多的约束,你可以放在body最后面像React那样,
也可以提前写好绝对定位,简单地利用v-if或者v-show控制展示和隐藏

这有个非常简单地Modal组件源码解析:传送门

以及我写地性能优化文章JavaScript惰性单例与vue性能优化应用

参考

一个弹窗要做的东西还是挺多的,建议参考一些著名组件的源代码或者思想,比如 artDialogBootstrap3-dialog

一个简单的弹窗可以分为顶部(标题、关闭等)、内容(任何内容)、底部(确定、取消等),注意组件要把 HTML、JavaScript 和 CSS 组织在一起,与其它代码解耦,只通过配置生成弹窗。

可以创建一个弹窗类,每次实例化一个弹窗,互相独立。实例化时传入配置对象如:

var d = new Dialog({
  // ...
  title: "",
  content: "",
  buttons: [{
    content: "",
    click: function(){},
  }],
  // ...
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题