跳转到内容

就地编辑 editable

数据录入组件。三层同源:无头内核给出解剖与状态机,Vue 组件与自定义元素只是它的两层外壳,行为完全一致。

示例

基础用法

预览与编辑两态轮流上场:点预览区或按「编辑」进编辑态,preview 不写内容、显示什么由组件填

曦寒

提交方式

submitMode 决定编辑态怎么收尾,不算提交的那些出口一律按撤销处理,值还回上一次提交的那个

失焦即提交
上次提交:失焦即提交
回车才提交
上次提交:回车才提交

受控

value 与 edit 都能受控,传了就由宿主说了算,用户交互只发出意图;外部按钮同样进得了编辑态

这个人很懒
当前:这个人很懒 · 预览中

禁用与只读

两者都进不了编辑态;值为空时预览区退回压淡的占位文字

改不动
只能看
未填写

表格里的单元格

一格一个就地编辑:点开就是输入框,收尾即写回行数据;autoResize 让输入框按内容宽窄走,不把列撑变形

姓名部门手机号
赵一
平台研发
13800000001
钱二
前端体验
13800000002
孙三
基础架构
13800000003
数据源:赵一/平台研发,钱二/前端体验,孙三/基础架构

整表进出编辑态

edit 受控就由宿主统一调度:一个开关把整张表切进编辑,放弃时宿主拿自己留的底稿还原

区域配额
北区
1200
南区
980
东区
1450

产物

自定义元素<xh-editable>
Vue 组件XhEditableArea XhEditableCancelTrigger XhEditableControl XhEditableEditTrigger XhEditableInput XhEditableLabel XhEditablePreview XhEditableRoot XhEditableSubmitTrigger
组合式函数useEditable
状态机editableMachine
皮肤@xihan-ui/styles/editable.css

解剖

部件名即 data-part 属性值,也是皮肤的选择器。加粗的是必备部件,不渲染它组件不工作(Web Components 适配器会在诊断通道上报 wc.missing-part)。

data-scope="editable"root · label · area · preview · input · edit-trigger · submit-trigger · cancel-trigger · control

Props

属性类型必填说明
valuestring受控值;给了就由宿主说了算,机器不自改(cell 原生受控,无影子事件)。
defaultValuestring非受控初值。
editboolean受控编辑态;给了就由宿主说了算,用户交互只发 onEditChange。
defaultEditboolean非受控初始编辑态。为真时挂载即进编辑态并把焦点搬进输入框。
placeholderstring值为空时预览区显示它,输入框也拿它当占位。
disabledboolean禁用:进不了编辑态,输入框带原生 disabled。
readOnlyboolean只读:进不了编辑态,但已在编辑态时仍能退出(撤销/提交都通)。
invalidboolean校验失败标注。
maxLengthnumber字符数上限;同时落成原生 maxlength 与机器侧截断。
namestring表单字段名;给了输入框才参与提交。
submitModeEditableSubmitMode编辑态的收尾方式,默认 both。
activationModeEditableActivationMode预览区的激活方式,默认 click。
selectOnFocusboolean进编辑态时全选已有内容,默认开。关掉则光标停在原处。
autoResizeboolean输入框宽度跟着内容走:连接层把字符数落成原生 size 属性。
onValueChange(details: EditableValueChangeDetails) => void值变化意图回调;编辑途中每次输入都发,受控时是唯一出口。
onValueCommit(details: EditableValueCommitDetails) => void提交那一刻才发;编辑途中的输入不会惊动它。
onValueRevert(details: EditableValueRevertDetails) => void撤销那一刻发(Escape、取消按钮、不算提交的离场)。
onEditChange(details: EditableEditChangeDetails) => void编辑态变化意图回调;受控时是唯一出口,非受控随内部转移一并通知。

状态机

状态preview · edit

事件EDIT.START · EDIT.SUBMIT · EDIT.CANCEL · EDIT.LEAVE · VALUE.SET · CONTROLLED.EDIT · CONTROLLED.PREVIEW · FORM.RESET

判据isEditControlled · canEdit · submitsOnLeave

connect API

useEditable 产出的对象。getXxxProps() 铺到对应部件的宿主元素上,其余是可读状态与操作入口。

成员类型说明
valuestring当下的值(编辑途中就是输入框里的那串)。
committedValuestring上一次提交的值,也是撤销的落点。
editingboolean正处在编辑态。
emptyboolean值为空串。
displayValuestring预览区当下该显示的文字:值为空时退回 placeholder。
disabledboolean
readOnlyboolean
invalidboolean
interactiveboolean进得了编辑态(既没禁用也不只读)。
setValue(next: string) => void直接写值,只受 disabled/readOnly 与 maxLength 约束,与编辑态无关。
edit() => void进编辑态;禁用或只读时不动。
submit() => void提交当下的值并回到预览态。
cancel() => void撤销回上一次提交的值并回到预览态。
getRootProps() => T['element']
getLabelProps() => T['label']
getAreaProps() => T['element']
getPreviewProps() => T['element']
getInputProps() => T['input']
getEditTriggerProps() => T['button']
getSubmitTriggerProps() => T['button']
getCancelTriggerProps() => T['button']
getControlProps() => T['element']

键盘

规格出处:W3C APG

按键生效条件行为
Enterfocus in input, submitMode 为 enter 或 both提交当下的值并回到预览态;其余模式不接管该键,交回给浏览器与外层表单
Escapefocus in input撤销回上一次提交的值并回到预览态
Tab / Shift+Tabfocus in input按 submitMode 收尾(blur/both 提交,enter/none 撤销);不拦默认行为,焦点照常移出

Released under The MIT License