弹窗是咱们熟视无睹的一种交互方式,常常用到,但从没好好想过这种交互行为背地的意义...

弹窗是Windows的灵魂

Windows的灵魂是什么?当然是Window,当方便快捷的多窗口进入人们视线的时候,大家无不为之惊呼太好用了!!

弹窗其实是一种多线程

当你须要放弃当前任务运行,同时开启一个新工作时,就须要多线程。弹窗何尝不是一种交互畛域的多线程?它能够挂起以后的操作流,而后开拓一片全新的操作区域,让用户从新开始一条新的操作流,并且期待其实现后还能够从新返回之前的操作环境。

弹窗其实就是Page

有的UI设计师厌恶弹窗,感觉不美观,我不晓得为什么?当你把一个弹窗放到最大,充斥整个视口,你会发现这不就是一个所谓的Page吗?

弹窗是一种keep-alive

为了放弃以后的滚动地位,用户的操作环境等,最简略的方法就是应用弹窗,不销毁底下的Dom元素,这不就是keep-alive吗?

弹窗与Window

Window?Dialog?Modal?傻傻分不清楚,我也分不清楚,但咱们也不必去杠,就是一个命名而已。咱们能够约定,Window特指那些重量级的弹窗,而Dialog和Modal特指轻量级弹窗。

咱们借用浏览器的Tab窗口来看:

  • Window外面装的是独立的Page,而Dialog外面装的是一个独立的Fragment;
  • Window外面不仅Dom元素是独立的,运行环境也是独立的,而Dialog只是Dom元素独立;
  • Window领有独立的历史记录栈,能够后退/后退/刷新,而Dialog没有这些性能;

没有Window的SPA是不残缺的

咱们习惯用Single-Page-Application来模仿浏览器的多页,从而能够更自在的管制页面间的跳转体验,但始终不足一种对Window窗口的模仿。在多页中咱们能够一句话让一个页面在新窗口中关上,比方:<a href="xxx" target="_blank">或者window.open(xxx),然而在SPA中即使是操作一个Dialog都是绝对麻烦的事件,况且Dialog也不能算是Window。

实现虚构Window

基于以上剖析,集体实现了一个根本能满足需要的虚构Window。

先看看成果:虚构Window

之所以说它是虚构Window,而非Dialog,理由如下:

  • 它外面装的是独立的Page而非Fragment,仅依据Url就能够重建弹窗,例如http://admin-react-antd.eluxj...
  • 它外面装的Page,不仅有独立的Dom构造,还有独立的全局Store,相似于实现与外界隔离的运行环境。
  • 它自带独立的历史记录栈,基于它的每一个路由跳转都将主动造成一条历史记录。
  • 它提供相似浏览器窗口的工具条:敞开/后退/刷新。如:文章列表 => 点击题目 => 点击作者 => 点击文章数。而后你能够顺次回退每一步操作,也可一次性全副敞开。
  • 它提供窗口最大化、最小化按钮,如:文章详情,窗口左上角按钮;并反对默认最大化,如:创立文章
  • 只需一句话即可关上新窗口,例如

    • <Link to="/article/list/index" action="push" target="window">:新窗口关上 
    • <Link to="/article/list/index" action="push" target="page">:本窗口关上
  • Window中能够再开新窗口,最多可达10级,主动保护层级关系。
  • 弹窗再弹弹窗体验不好?多层弹窗时自动隐藏上层弹窗,敞开下层弹窗主动复原上层弹窗,保障每一时刻始终之会呈现一层弹窗。
  • 轻松实现是否keep-alive。keep-alive长处是用户体验好,毛病是太TM占资源(须要缓存所有Dom元素还有相干内存变量),当初应用虚构Windw,你想keep-alive你就在新窗口中关上,不想keep-alive就在原窗口中关上,随便管制。

我的项目地址

大家有什么意见、想法、改良思路,都欢送提供哦...

最初附上我的项目地址:

  • React版本

    • github: https://github.com/hiisea/elu...
    • gitee: https://gitee.com/hiisea/elux...
  • Vue版本

    • github: https://github.com/hiisea/elu...
    • gitee: https://gitee.com/hiisea/elux...