表单
AutoForm
并不是传统意义上的HTML
表单,并没有<form>
标签包裹,auto-form
只是一个普通的WebComponent
组件,用于收集数据到AutoStore
中而已。
快速入门
创建一个AutoForm
的基本方式如下:
第 1 步: 创建AutoStore
实例
创建一个AutoStore
实例,用于存储表单数据。AutoStore
实例内部维护了一个经过Proxy
代理的JSON
对象,用于存储表单数据。
const store = new AutoStore({
user: {
username: 'NAME',
password: 'PASSWORD',
},
order: {
price: 100,
count: 1,
total: (order) => order.price * order.count,
},
});
提示
可以创建任意复杂的AutoStore
。
第 2 步: 声明字段
接下来,我们使用configurable
函数来声明,AutoStore
的状态树中的哪些字段中是可配置的。
import { AutoStore, configurable } from 'autostore';
const store = new AutoStore({
user: {
username: configurable('NAME'),
password: configurable('PASSWORD'),
},
order: {
price: configurable(100),
count: configurable(1),
total: (order) => order.price * order.count,
},
});
在一个嵌套的对象树中,我们可以使用configurable
函数来声明哪些字段是可配置的。
在上面的例子中,我们声明了user.username
、user.password
、order.price
、order.count
四个字段是可配置的。
提示
configurable
函数用于告诉AutoStore
状态树中的哪些字段是可配置的,AutoStore
会自动收集这些字段。
configurable
函数还有一个别名schema
。
第 3 步: 引入表单组件
接下来引入表单组件auto-form
组件。
auto-form
组件是一个标准的Web Component
,所以你可以像使用其他Web Component
一样使用它,包括在Vue/React
等其他场景可。
在html
中,你可以直接从CDN
中引入:
<!-- 引入 AutoForm 样式: 黑暗模式 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@autostorejs/form/dist/themes/dark.css" />
<!-- 引入 AutoForm 样式: 默认亮模式 -->
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@autostorejs/form/dist/themes/light.css"
/>
<!-- 引入 AutoForm 代码 -->
<script src="https://cdn.jsdelivr.net/npm/@autostorejs/form/dist/index.global.js"></script>
<!-- 引入 AutoStore 代码 -->
<script src="https://cdn.jsdelivr.net/npm/autostore/dist/index.global.js"></script>
也可以像普通代码一样,在你的ts/js
文件中引入
import { AutoStore } from 'autostore';
import '@autostorejs/form/dist/themes/light.css';
// 只需要导入即可
import '@autostorejs/form';
import '@autostorejs/form'
后就会自动注册auto-form
组件以及所有内置的表单字段组件。
提示
auto-form
组件是一个标准的Web Component
,只需要import
即可使用。
第 4 步: 创建表单
接下来,我们就可以使用auto-form
组件来创建表单了。
在你的代码中创建auto-form
组件,然后绑定store
实例,就可以创建一个表单了。
在html
中,可以直接使用auto-form
组件来创建表单:
<script>
const { AutoStore, configurable } = AutoStoreSpaces;
const store = new AutoStore({
// 表单状态数据
});
const form = document.querySelector('#login');
form.bind(store);
</script>
<auto-form id="login"></auto-form>
提示
在React/Vue
中应用,可以将auto-form
组件像普通的div
标签一样使用。
第 5 步: 渲染效果
至此,一个简单的表单就渲染完成了,表单中包括了user.username
、user.password
、order.price
、order.count
四个字段。
渲染效果如下:
提示
修改表单数据后,store.state
数据会同步更新,两者双向绑定关系,即修改store.state
也会同步到表单中。
小结
可以看到,AutoForm
完全不同于普通的表单解决方案,核心本质就是将数据收集到AutoStore
中,然后通过auto-form
组件来渲染表单。
注意
在上例中,我们可以看到渲染出的表单的外观、样式、label 等并不理想。
实际场景中,一般需要进行更精细的控制,这就需要为configurable
提供更多的控制参数,详见表单字段章节。
指南
绑定数据
auto-form
组件提供了bind
方法,用于绑定AutoStore
实例。
AutoStore
实例本质上是一个经过proxy
封装的JSON
对象,会在读写对象进触发事件,为表单提供响应式支持。
<script>
const { AutoStore, configurable } = AutoStoreSpaces;
const store = new AutoStore({...});
const form = document.querySelector('#login');
form.bind(store);
</script>
<auto-form id="login"></auto-form> // [!code ++]
当执行bind
方法后,就在AutoStore
和AutoForm
之间创建起双向同步关系,
- 当
AutoStore
中的数据发生变化时,AutoForm
会自动更新表单数据。 - 当
AutoForm
中的数据发生变化时,AutoStore
会自动更新AutoStore
中的数据。
主题
AutoForm
使用ThemePro用为主题方案,可以提供灵活实时的动态主题
<link href="https://cdn.jsdelivr.net/npm/@autostorejs/form/index.css" />
<link href="https://cdn.jsdelivr.net/npm/@autostorejs/form/themes/dark.css" />
<link href="https://cdn.jsdelivr.net/npm/@autostorejs/form/themes/red.css" />
<link href="https://cdn.jsdelivr.net/npm/@autostorejs/form/themes/blue.css" />
<auto-form></auto-frm>
提示
除了预设的light
、dark
、blue
、red
共四种颜色的主题外,还可以动态生成主题。
详见ThemePro介绍。
尺寸
AutoForm
默认支持small
、medium
、large
三种尺寸。可以控制表单的字体、间距等尺寸。
标题位置
AutoForm
的字段标题支持
- 默认支持
top
、left
两种标题位置,可以控制字段标题的显示位置。 - 当标题位置为
left
时,可以控制标题的宽度。
网格线
默认AutoForm
会显示字段网格分割线,也可以控制不显示。
浏览模式
允许切换到数据浏览模式,只查看表单数据。
紧凑模式
紧凑模式,可以控制表单字段的间距。
CSS::Part
auto-form
是一个WebComponent
组件,内部组件被渲染在一个shodow DOM
中,无法在外部进行样式控制。
auto-form
暴露了一些CSS::Part
,允许通过进行样式控制。
例如,我们要控制字段label
样式,可以通过::part(field-label)
来进行样式控制。
auto-form::part(field-label) { color: red; }
AutoForm
目前提供了以下CSS::Part
:
名称 | 描述 |
---|---|
field | 字段 |
field-value | 字段值 |
field-label | 字段标题 |
field-help | 字段帮助信息 |
field-error | 字段错误信息 |
分组
AutoForm
支持分组,可以只显示指定组的字段。
group
参数可仅仅指定一个组,也可以指定多个组,多个组之间用,
分隔。group='' || group='*'
表示显示所有组。
const store = new AutoStore({
user: {
username: configurable('NAME', {
label: '用户名',
group: 'user',
}),
password: configurable('PASSWORD', {
label: '密码',
group: 'user',
}),
},
order: {
price: configurable(100, {
label: '价格',
group: 'price',
}),
count: configurable(1, {
label: '数量',
group: 'price',
}),
total: (order) => order.price * order.count,
},
});
const form = document.querySelector('#login');
form.bind(store);
以上我们为配置字段指定了一个组名称,然后在渲染表单时,可以指定要渲染的组。
状态路径
可以通过path
参数指定要显示某个路径下的字段。
const store = new AutoStore({
user: {
username: configurable('NAME', {
label: '用户名'
}),
password: configurable('PASSWORD', {
label: '密码'
}),
},
order: {
price: configurable(100, {
label: '价格'
}),
count: configurable(1, {
label: '数量'
}),
total: (order) => order.price * order.count,
},
});
<auto-form path="user"></auto-form>
<auto-form path="order"></auto-form>
<auto-form path="user,order"></auto-form>
字段排序
AutoForm
可以通过order
参数对字段进行排序,可以指定字段的顺序。按order
参数值从小到大排列。
const store = new AutoStore({
user: {
username: configurable('NAME', {
label: '用户名',
order: 2,
}),
password: configurable('PASSWORD', {
label: '密码',
order: 1,
}),
},
});
布局类型
默认情况下,表单对内部的字段采用inline-block
布局,可以控制表单的布局类型。
layout
参数支持以下值:
auto
: 采用默认inline-block
布局row
: 采用flex: row
布局col
: 采用flex: column
布局
高级字段
advanced
参数用于标识这是一个高级选项字段,当advanced
时才会显示字段。
const store = new AutoStore({
user: {
username: configurable('NAME', {
label: '用户名',
advanced: true
}),
password: configurable('PASSWORD', {
label: '密码'
}),
}
});
// 默认显示所有字段,包括advanced字段
<auto-form ></auto-form>
// 显示所有字段,但不显示advanced字段
<auto-form advanced></auto-form>
提示
advanced
参数用于当创建配置表单时,有时需要指定一些配置项是高级选项,仅在高级选项打开时才显示。
表单是否修改
当表单数据进行了更新后,会为表单增加一个dirty
类,用于标识表单是否被修改过。
<auto-form class="dirty"></auto-form>
也可以通过读取form.dirty
值来查看表单是否被修改过。
重置表单
可以通过reset
方法重置表单。