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

弹窗是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.eluxjs.com/admin/member/item/edit/50?__c=_dialog
  • 它里面装的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就在原窗口中打开,随意控制。

项目地址

虚拟Window也算是摸着石头过河,大家有什么意见、想法、改进思路,都欢迎提供哦...

最后附上项目地址:

不想当Window的Dialog不是一个好Modal,弹窗翻身记的更多相关文章

  1. frame、window和dialog区别

    属性 Window Frame Dialog 模式化 不是 不是 不是(可设置) 可调大小 不可 可 可 标题栏 无 有 有 边界 无 有 有 标题 无 有 有 菜单栏 无 有 无 焦点管理器 有 有 ...

  2. 【Qt文档阅读】Window and Dialog Widgets

    Window and Dialog Widgets 没有嵌入到父控件中的控件(widget)称之为窗口(window).通常窗口带有边框和标题栏. Windows通常集成到桌面环境中,并且在某种程度上 ...

  3. 在EXCEL中如何让一列数字变成文本格式?就是想让单元格的左上角变一个绿绿的?

    如何在EXCEL中如何让一列数字变成文本格式?就是想让单元格的左上角变一个绿绿的? 解决方案:将整列单元格格式设为文本,然后,选中该列,数据--分列--完成 详细步骤: (1)选中1行或者1列,再单击 ...

  4. WPF 远程显示原图 当前主页面 工具栏 一个Window页面的元素适用一个效果

    http://www.jb51.net/article/98384.htm 1.wpf远程显示原图: Stretch="Fill" + ; 主要是因为那个950和650,据显示位置 ...

  5. 要想在for语句中直接定义一个变量

    要想在for语句中直接  定义一个变量  (如下的代码) 1 for(uint16_t i=0;i<10;i++); 2 if( GPIO_ReadInputDataBit(GPIOA, GPI ...

  6. 【Qt编程】Qt学习之Window and Dialog Widgets

    Qt Creator 提供的默认基类只要QMainWindow.QWidget和QDialog三种.其中,QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,这两个 ...

  7. 2016.8.19 在dialog上增加一个button出现错误:failed to execute setAttribute on Element...

    目标:想要在dialog上多加一个button. 语法来自: http://api.jqueryui.com/dialog/#option-buttons   可见新增在dialog上的button要 ...

  8. window.addEventListener来解决让一个js事件执行多个函数

    可能你也碰到过这种情况,就是在js的代码中用了window.onload后,可能会影响到body中的onload事件.这时就要用window.attachEvent和window.addEventLi ...

  9. 向Dialog中添加一个新的Menu

    1.创建一个新的Menu,在资源管理视图中,右键Menu-->传入Menu 2.设计新Menu,ID为IDR_MENU1 3.在该Dialog的源文件中,找到CTest001Dlg::OnIni ...

随机推荐

  1. 中国天气api接口xml,json

    http://m.weather.com.cn/data/101110101.html 大坑有木有??反应慢不说了,还老不更新!! 想贴段代码的,现在又打不 开了(貌似3月4号以后没更新过) ==== ...

  2. 开发工具-Redis Desktop Manager下载地址

    更新记录 2022年6月10日 完善标题. 官方: https://github.com/uglide/RedisDesktopManager 免费打包版: https://github.com/le ...

  3. Chrome自带功能实现网页截图

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年6月28日. 很简单,按下Ctrl+Shift+P,打开命令行窗口,如下图所示. 输入命令. Capture full size sc ...

  4. SAP 实例 1 Images in HTML

    REPORT zharpo_010 NO STANDARD PAGE HEADING. TABLES : t001. TYPE-POOLS: slis. DATA : w_repid LIKE sy- ...

  5. Hdfs存储策略

    一.磁盘选择策略 1.1.介绍 在HDFS中,所有的数据都是存在各个DataNode上的.而这些DataNode上的数据都是存放于节点机器上的各个目录中的,而一般每个目录我们会对应到1个独立的盘,以便 ...

  6. 交警也觉得妙——Python 识别车牌

    车牌识别在高速公路中有着广泛的应用,比如我们常见的电子收费(ETC)系统和交通违章车辆的检测,除此之外像小区或地下 车库门禁也会用到,基本上凡是需要对车辆进行身份检测的地方都会用到. 一些背景: 车牌 ...

  7. NC20241 [SCOI2005]扫雷MINE

    NC20241 [SCOI2005]扫雷MINE 题目 题目描述 相信大家都玩过扫雷的游戏.那是在一个 \(n \times m\) 的矩阵里面有一些雷,要你根据一些信息找出雷来. 万圣节到了 ,&q ...

  8. 一文搞懂 Netty 发送数据全流程 | 你想知道的细节全在这里

    欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 在<Netty如何高效接收网络数据 ...

  9. 使用高斯Redis实现二级索引

    摘要:高斯Redis 搭建业务二级索引,低成本,高性能,实现性能与成本的双赢. 本文分享自华为云社区<华为云GaussDB(for Redis)揭秘第21期:使用高斯Redis实现二级索引> ...

  10. Tapdata Cloud 版本上新!率先支持数据校验、类型映射等6大新功能

    Tapdata Cloud cloud.tapdata.net Tapdata Cloud 是国内首家异构数据库实时同步云平台,目前支持 Oracle.MySQL.PG.SQL Server.Mong ...