DaoCloud/dao-style

dao-dialog 重构计划

Closed this issue · 3 comments

为了保证 dao-style 的 dao-dialog 能够具有足够的可扩展性从而满足花式需求,需要重构 dao-dialog。因此我先写了一份新的 dialog 使用文档,大家看是否有问题,或者是否有哪些场景没有覆盖到?

至于其他各种花式 dialog(multistep, 带 tab ...),我将会在 demo 站中以示例形式开发,

另: 该设计不会在 DCE 2.0 里使用,而是在新版 3.0 中,但考虑到有其他项目也在使用 dao-dialog, 因此,会尽可能保证副作用最小(涉及到必要的改动,之后将会出方案)

组件参数

dialog

接受的参数

参数名 类型 说明 默认值 是否必填
visible Boolean 控制 dao-dialog 是否显示的参数, 与父组件双向绑定 ( 需要加 sync 修饰符 ) false
header Object/Boolean header 配置对象, 具体内容见 header 对象 (当传入 header slot 时,该配置将不会生效), 当任何时候都不需要 header 时可以传入 false header
footer Object footer 配置对象, 具体内容见 footer 对象 (当传入 footer slot 时,该配置将不会生效), 当任何时候都不需要 footer 时可以传入 false footer
size String/Object 设置 dialog 的大小。 可选 sm, md, lg, 或者传入 { width: *, height: * } 具体指定 { height: auto; width: auto}
containerClass String dialog 的容器类名 -
closeOnClickOutside Boolean 设置点击 dialog 外面( 遮罩层 ) 是否关闭 dialog true
closeOnPressEscape Boolean 设置按键 ESC 时是否关闭 dialog true
allowResize Boolean 设置是否可以拖拽调整 dialog 大小 false
lockScroll Boolean 对话框出现时是否将 body 锁定不滚动 true

header 对象

参数名 类型 说明 默认值 是否必填
title String 对话框 title -
showClose Boolean 是否显示关闭图标(为 true 时 title 向左对齐, 为 false 时 title 居中对齐) false

footer 对象

参数名 类型 说明 默认值 是否必填
confirmText String confrim text 确认
cancelText String cancel text 取消
confirmDisabled Boolean 禁用 confirm false

dialog 触发的事件

事件名称 说明 回调参数
before-open Dialog 即将打开时的回调, 内部 DOM 还未渲染 -
opened Dialog 打开时的回调 ,内部 DOM 已经渲染完成 -
before-close Dialog 即将关闭时的回调, 内部 DOM 还在(confirm 和 cancel 的下一跳也会触发 close) -
closed Dialog 关闭时的回调, 内部 DOM 已经被移除(confirm 和 cancel 的下一跳也会触发 close) -
confirm Dialog 点击 确定 时的触发 -
cancel Dialog 点击 取消 时的触发 -

dialog 的具名 slot

名称 说明
-- dialog body 内容
header dialog header 的内容
footer dialog footer 的内容

TLDR; 我想讨论一下:

  1. 对于模态对话框来说,它究竟是被关闭 close 了,还是被隐藏 hide 了。
  2. 对于模态对话框来说,close 和 hide 有区别吗?(站在开发者角度 & 站在用户角度)

closeOnClickOutside -> 设置点击 dialog 外面( 遮罩层 ) 是否隐藏 dialog
closeOnPressEscape -> 设置按键 ESC 时是否隐藏 dialog

我不太确定 “隐藏” 这个词是不是合适。

对于一个模态对话框来说,

模态对话框上一般有两个按钮,一个是默认按钮(比如,“确认”、“打印”、“清空回收站”),另一个是取消按钮。它们应当给用户清晰的选项。当用户点击任何一个按钮后,模态对话框就会关闭。为了提高熟练用户的效率,我们应该允许用户按 Esc 键终止对话框(效果和取消按钮相同)。

Alan Cooper 在 About Face 中用了 dismiss 这个词,没有用 close,也没有用 hide。

我猜测,这是因为模态对话框对用户算是比较明确的。大部分时候,都是下面这样:
要么确认 (然后关闭),要么不确认 (然后关闭)。
要么执行 (然后关闭),要么不执行 (然后关闭)。
要么提交 (然后关闭),要么不提交 (然后关闭)。
要么保存 (然后关闭),要么不保存 (然后关闭)。

所以,在模态对话框中,我觉得 “隐藏” 这个词有点模糊。有人可能会问,“隐藏对话框”后,对话框到底保存还是不保存表单上已经填了数据呢?

通常,在模态对话框中,取消 = 不确认 / 不执行 / 不提交 / 不保存,然后对话框关闭消失不见。
通常,在模态对话框中,ESC = 取消

并且,如果模态对话框中没有任何表单需要填写,比如一个典型的确认用户操作的 Alert,用户往往点 Enter 回车键 就可以 “确定”。

用户一般比较习惯这样。


但是,在非模态对话框中,情况会模糊一些。

其实,我比较倾向,我们把 modal dialog 模态对话框 和 modeless dialog 非模态对护框 区分来看。
比如 Apple HIG 中,分了三个:

  1. Document-Modal Dialogs
  2. App-Modal Dialogs
  3. Modeless Dialogs

我觉得我们可以先关注 模态对话框。因为模态对话框更明确,也更常见。
非模态对话框的一大特点是:用户可以同时在主视图和非模态对话框的视图中切换。这对用户来说恐怕不是那么容易理解。

举个例子,在模态对话框中,当用户点击了下方的按钮后,对话框就会关闭;但是在非模态对话框中,当用户点击了按钮后,对话框不会立刻关闭。(除非用户主动点击非模态对话框上的关闭控件。)

image

此外,因为非模态对话框不会随着次要任务的结束而自动关闭,未及时关掉的非模态对话框可能浪费屏幕空间。在 Page 中,用户可以用一个非模态对话框在当前打开的文档里查找内容。如果用户不主动关闭它,哪怕他不想继续查找,这个对话框仍会出现在屏幕上。(当用户打开第二个文档时,Page 会关闭这个非模态对话框。用户可以再次打开它。此时,这个非模态对话框的搜索范围是当前活跃窗口里的内容。)

@jamiefang 感谢总监的严谨,的确在模态对话框中只有打开和关闭两种状态

重构之后的 dialog

  1. 为了保证现有业务不奔溃,兼容了旧版 dialog 的配置方式
  2. 去除了 mutilstep dialog,在 demo 站里有推荐写法

在升级 dao-style 时候,请务必检查项目里是否使用了旧版 mutilstep dialog,请及时做迁移工作。