feat: form
parent
fb22422d8e
commit
787d51f375
|
@ -0,0 +1,98 @@
|
||||||
|
<script>
|
||||||
|
|
||||||
|
import AdvancedSearch from './advanced-search'
|
||||||
|
// import Coordinated from './coordinated'
|
||||||
|
// import CustomizedFormControls from './customized-form-controls'
|
||||||
|
// import DynamicFormItem from './dynamic-form-item'
|
||||||
|
// import DynamicRule from './dynamic-rule'
|
||||||
|
// import FormInModal from './form-in-modal'
|
||||||
|
// import GlobalState from './global-state'
|
||||||
|
// import HorizontalLogin from './horizontal-login'
|
||||||
|
// import Layout from './layout'
|
||||||
|
// import NormalLogin from './normal-login'
|
||||||
|
// import Register from './register'
|
||||||
|
// import TimeRelatedControls from './time-related-controls'
|
||||||
|
// import ValidateOther from './validate-other'
|
||||||
|
// import ValidateStatic from './validate-static'
|
||||||
|
// import WithoutFormCreate from './without-form-create'
|
||||||
|
|
||||||
|
import CN from './../index.zh-CN'
|
||||||
|
import US from './../index.en-US'
|
||||||
|
|
||||||
|
const md = {
|
||||||
|
cn: `# Form 表单
|
||||||
|
具有数据收集、校验和提交功能的表单,包含复选框、单选框、输入框、下拉选择框等元素。
|
||||||
|
|
||||||
|
## 表单
|
||||||
|
|
||||||
|
我们为 \`form\` 提供了以下三种排列方式:
|
||||||
|
|
||||||
|
- 水平排列:标签和表单控件水平排列;(默认)
|
||||||
|
- 垂直排列:标签和表单控件上下垂直排列;
|
||||||
|
- 行内排列:表单项水平行内排列。
|
||||||
|
|
||||||
|
## 表单域
|
||||||
|
|
||||||
|
表单一定会包含表单域,表单域可以是输入控件,标准表单域,标签,下拉菜单,文本域等。
|
||||||
|
|
||||||
|
这里我们封装了表单域 \`<Form.Item />\` 。
|
||||||
|
|
||||||
|
**注意:** 如果使用 \`Form.create\` 处理表单使其具有自动收集数据并校验的功能,建议使用\`jsx\`
|
||||||
|
## 代码演示
|
||||||
|
`,
|
||||||
|
us: `# Form
|
||||||
|
Form is used to collect, validate, and submit the user input, usually contains various form items including checkbox, radio, input, select, and etc.
|
||||||
|
|
||||||
|
## Form
|
||||||
|
|
||||||
|
You can align the controls of a \`form\` using the \`layout\` prop:
|
||||||
|
|
||||||
|
- \`horizontal\`:to horizontally align the \`label\`s and controls of the fields. (Default)
|
||||||
|
- \`vertical\`:to vertically align the \`label\`s and controls of the fields.
|
||||||
|
- \`inline\`:to render form fields in one line.
|
||||||
|
|
||||||
|
## Form fields
|
||||||
|
|
||||||
|
A form consists of one or more form fields whose type includes input, textarea, checkbox, radio, select, tag, and more.
|
||||||
|
A form field is defined using \`<Form.Item />\`.
|
||||||
|
|
||||||
|
**Note:** If you use \`Form.create\` to process forms with automatic data collection and validation, we recommend using \`jsx\`
|
||||||
|
## Examples
|
||||||
|
`,
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
category: 'Components',
|
||||||
|
subtitle: '表单',
|
||||||
|
type: 'Data Entry',
|
||||||
|
cols: 1,
|
||||||
|
title: 'Form',
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<md cn={md.cn} us={md.us} />
|
||||||
|
<AdvancedSearch />
|
||||||
|
{/* <Coordinated />
|
||||||
|
<CustomizedFormControls />
|
||||||
|
<DynamicFormItem />
|
||||||
|
<DynamicRule />
|
||||||
|
<FormInModal />
|
||||||
|
<GlobalState />
|
||||||
|
<HorizontalLogin />
|
||||||
|
<Layout />
|
||||||
|
<NormalLogin />
|
||||||
|
<Register />
|
||||||
|
<TimeRelatedControls />
|
||||||
|
<ValidateStatic />
|
||||||
|
<WithoutFormCreate />
|
||||||
|
<ValidateOther />
|
||||||
|
*/}
|
||||||
|
<api>
|
||||||
|
<CN slot='cn' />
|
||||||
|
<US />
|
||||||
|
</api>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
|
@ -0,0 +1,178 @@
|
||||||
|
<cn>
|
||||||
|
#### 自定义校验
|
||||||
|
我们提供了 `validateStatus` `help` `hasFeedback` 等属性,你可以不需要使用 `Form.create` 和 `getFieldDecorator`,自己定义校验的时机和内容。
|
||||||
|
1. `validateStatus`: 校验状态,可选 'success', 'warning', 'error', 'validating'。
|
||||||
|
2. `hasFeedback`:用于给输入框添加反馈图标。
|
||||||
|
3. `help`:设置校验文案。
|
||||||
|
</cn>
|
||||||
|
|
||||||
|
<us>
|
||||||
|
#### Customized Validation
|
||||||
|
We provide properties like `validateStatus` `help` `hasFeedback` to customize your own validate status and message, without using `Form.create` and `getFieldDecorator`.
|
||||||
|
1. `validateStatus`: validate status of form components which could be 'success', 'warning', 'error', 'validating'.
|
||||||
|
2. `hasFeedback`: display feed icon of input control
|
||||||
|
3. `help`: display validate message.
|
||||||
|
</us>
|
||||||
|
|
||||||
|
```html
|
||||||
|
<template>
|
||||||
|
<a-form>
|
||||||
|
<a-form-item
|
||||||
|
:labelCol="labelCol"
|
||||||
|
:wrapperCol="wrapperCol"
|
||||||
|
label='Fail'
|
||||||
|
validateStatus='error'
|
||||||
|
help='Should be combination of numbers & alphabets'
|
||||||
|
>
|
||||||
|
<a-input placeholder='unavailable choice' id='error' />
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<a-form-item
|
||||||
|
:labelCol="labelCol"
|
||||||
|
:wrapperCol="wrapperCol"
|
||||||
|
label='Warning'
|
||||||
|
validateStatus='warning'
|
||||||
|
>
|
||||||
|
<a-input placeholder='Warning' id='warning' />
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<a-form-item
|
||||||
|
:labelCol="labelCol"
|
||||||
|
:wrapperCol="wrapperCol"
|
||||||
|
label='Validating'
|
||||||
|
hasFeedback
|
||||||
|
validateStatus='validating'
|
||||||
|
help='The information is being validated...'
|
||||||
|
>
|
||||||
|
<a-input placeholder="I'm the content is being validated" id='validating' />
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<a-form-item
|
||||||
|
:labelCol="labelCol"
|
||||||
|
:wrapperCol="wrapperCol"
|
||||||
|
label='Success'
|
||||||
|
hasFeedback
|
||||||
|
validateStatus='success'
|
||||||
|
>
|
||||||
|
<a-input placeholder="I'm the content" id='success' />
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<a-form-item
|
||||||
|
:labelCol="labelCol"
|
||||||
|
:wrapperCol="wrapperCol"
|
||||||
|
label='Warning'
|
||||||
|
hasFeedback
|
||||||
|
validateStatus='warning'
|
||||||
|
>
|
||||||
|
<a-input placeholder='Warning' id='warning' />
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<a-form-item
|
||||||
|
:labelCol="labelCol"
|
||||||
|
:wrapperCol="wrapperCol"
|
||||||
|
label='Fail'
|
||||||
|
hasFeedback
|
||||||
|
validateStatus='error'
|
||||||
|
help='Should be combination of numbers & alphabets'
|
||||||
|
>
|
||||||
|
<a-input placeholder='unavailable choice' id='error' />
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<a-form-item
|
||||||
|
:labelCol="labelCol"
|
||||||
|
:wrapperCol="wrapperCol"
|
||||||
|
label='Success'
|
||||||
|
hasFeedback
|
||||||
|
validateStatus='success'
|
||||||
|
>
|
||||||
|
<a-date-picker style="width: 100%" />
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<a-form-item
|
||||||
|
:labelCol="labelCol"
|
||||||
|
:wrapperCol="wrapperCol"
|
||||||
|
label='Warning'
|
||||||
|
hasFeedback
|
||||||
|
validateStatus='warning'
|
||||||
|
>
|
||||||
|
<a-time-picker style="width: 100%" />
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<a-form-item
|
||||||
|
:labelCol="labelCol"
|
||||||
|
:wrapperCol="wrapperCol"
|
||||||
|
label='Error'
|
||||||
|
hasFeedback
|
||||||
|
validateStatus='error'
|
||||||
|
>
|
||||||
|
<a-select defaultValue='1'>
|
||||||
|
<a-select-option value='1'>Option 1</a-select-option>
|
||||||
|
<a-select-option value='2'>Option 2</a-select-option>
|
||||||
|
<a-select-option value='3'>Option 3</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<a-form-item
|
||||||
|
:labelCol="labelCol"
|
||||||
|
:wrapperCol="wrapperCol"
|
||||||
|
label='Validating'
|
||||||
|
hasFeedback
|
||||||
|
validateStatus='validating'
|
||||||
|
help='The information is being validated...'
|
||||||
|
>
|
||||||
|
<a-cascader :defaultValue="['1']" :options="[]" />
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<a-form-item
|
||||||
|
label='inline'
|
||||||
|
:labelCol="labelCol"
|
||||||
|
:wrapperCol="wrapperCol"
|
||||||
|
>
|
||||||
|
<a-col :span="11">
|
||||||
|
<a-form-item validateStatus='error' help='Please select the correct date'>
|
||||||
|
<a-date-picker style="width: 100%"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="2">
|
||||||
|
<span :style="{ display: 'inline-block', width: '100%', textAlign: 'center' }">
|
||||||
|
-
|
||||||
|
</span>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="11">
|
||||||
|
<a-form-item>
|
||||||
|
<a-date-picker style="width: 100%"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<a-form-item
|
||||||
|
:labelCol="labelCol"
|
||||||
|
:wrapperCol="wrapperCol"
|
||||||
|
label='Success'
|
||||||
|
hasFeedback
|
||||||
|
validateStatus='success'
|
||||||
|
>
|
||||||
|
<a-input-number style="width: 100%" />
|
||||||
|
</a-form-item>
|
||||||
|
</a-form>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
labelCol: {
|
||||||
|
xs: { span: 24 },
|
||||||
|
sm: { span: 5 },
|
||||||
|
},
|
||||||
|
wrapperCol: {
|
||||||
|
xs: { span: 24 },
|
||||||
|
sm: { span: 12 },
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
<cn>
|
||||||
|
#### 自行处理表单数据
|
||||||
|
使用 `Form.create` 处理后的表单具有自动收集数据并校验的功能,但如果您不需要这个功能,或者默认的行为无法满足业务需求,可以选择不使用 `Form.create` 并自行处理数据。
|
||||||
|
</cn>
|
||||||
|
|
||||||
|
<us>
|
||||||
|
#### Handle Form Data Manually
|
||||||
|
`Form.create` will collect and validate form data automatically. But if you don't need this feature or the default behaviour cannot satisfy your business, you can drop `Form.create` and handle form data manually.
|
||||||
|
</us>
|
||||||
|
|
||||||
|
```html
|
||||||
|
<template>
|
||||||
|
<a-form>
|
||||||
|
<a-form-item
|
||||||
|
:labelCol="labelCol"
|
||||||
|
:wrapperCol="wrapperCol"
|
||||||
|
label="Prime between 8 & 12"
|
||||||
|
:validateStatus="number.validateStatus"
|
||||||
|
:help="number.errorMsg || tips"
|
||||||
|
>
|
||||||
|
<a-input-number
|
||||||
|
:min="8"
|
||||||
|
:max="12"
|
||||||
|
:value="number.value"
|
||||||
|
@change="handleNumberChange"
|
||||||
|
/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-form>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
function validatePrimeNumber (number) {
|
||||||
|
if (number === 11) {
|
||||||
|
return {
|
||||||
|
validateStatus: 'success',
|
||||||
|
errorMsg: null,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
validateStatus: 'error',
|
||||||
|
errorMsg: 'The prime between 8 and 12 is 11!',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default {
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
labelCol: { span: 7 },
|
||||||
|
wrapperCol: { span: 12 },
|
||||||
|
number: {
|
||||||
|
value: 11,
|
||||||
|
},
|
||||||
|
tips: 'A prime is a natural number greater than 1 that has no positive divisors other than 1 and itself.',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleNumberChange (value) {
|
||||||
|
this.number = {
|
||||||
|
...validatePrimeNumber(value),
|
||||||
|
value,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,24 +1,3 @@
|
||||||
---
|
|
||||||
category: Components
|
|
||||||
type: Data Entry
|
|
||||||
cols: 1
|
|
||||||
title: Form
|
|
||||||
---
|
|
||||||
|
|
||||||
Form is used to collect, validate, and submit the user input, usually contains various form items including checkbox, radio, input, select, and etc.
|
|
||||||
|
|
||||||
## Form
|
|
||||||
|
|
||||||
You can align the controls of a `form` using the `layout` prop:
|
|
||||||
|
|
||||||
- `horizontal`:to horizontally align the `label`s and controls of the fields. (Default)
|
|
||||||
- `vertical`:to vertically align the `label`s and controls of the fields.
|
|
||||||
- `inline`:to render form fields in one line.
|
|
||||||
|
|
||||||
## Form fields
|
|
||||||
|
|
||||||
A form consists of one or more form fields whose type includes input, textarea, checkbox, radio, select, tag, and more.
|
|
||||||
A form field is defined using `<Form.Item />`.
|
|
||||||
|
|
||||||
```jsx
|
```jsx
|
||||||
<Form.Item {...props}>
|
<Form.Item {...props}>
|
||||||
|
|
|
@ -1,26 +1,3 @@
|
||||||
---
|
|
||||||
category: Components
|
|
||||||
subtitle: 表单
|
|
||||||
type: Data Entry
|
|
||||||
cols: 1
|
|
||||||
title: Form
|
|
||||||
---
|
|
||||||
|
|
||||||
具有数据收集、校验和提交功能的表单,包含复选框、单选框、输入框、下拉选择框等元素。
|
|
||||||
|
|
||||||
## 表单
|
|
||||||
|
|
||||||
我们为 `form` 提供了以下三种排列方式:
|
|
||||||
|
|
||||||
- 水平排列:标签和表单控件水平排列;(默认)
|
|
||||||
- 垂直排列:标签和表单控件上下垂直排列;
|
|
||||||
- 行内排列:表单项水平行内排列。
|
|
||||||
|
|
||||||
## 表单域
|
|
||||||
|
|
||||||
表单一定会包含表单域,表单域可以是输入控件,标准表单域,标签,下拉菜单,文本域等。
|
|
||||||
|
|
||||||
这里我们封装了表单域 `<Form.Item />` 。
|
|
||||||
|
|
||||||
```jsx
|
```jsx
|
||||||
<Form.Item {...props}>
|
<Form.Item {...props}>
|
||||||
|
@ -36,7 +13,7 @@ title: Form
|
||||||
|
|
||||||
| 参数 | 说明 | 类型 | 默认值 |
|
| 参数 | 说明 | 类型 | 默认值 |
|
||||||
| --- | --- | --- | --- |
|
| --- | --- | --- | --- |
|
||||||
| form | 经 `Form.create()` 包装过的组件会自带 `this.props.form` 属性,直接传给 Form 即可。1.7.0 之后无需设置 | object | 无 |
|
| form | 经 `Form.create()` 包装过的组件会自带 `this.form` 属性,直接传给 Form 即可。无需手动设置 | object | 无 |
|
||||||
| hideRequiredMark | 隐藏所有表单项的必选标记 | Boolean | false |
|
| hideRequiredMark | 隐藏所有表单项的必选标记 | Boolean | false |
|
||||||
| layout | 表单布局(2.8 之后支持) | 'horizontal'\|'vertical'\|'inline' | 'horizontal' |
|
| layout | 表单布局(2.8 之后支持) | 'horizontal'\|'vertical'\|'inline' | 'horizontal' |
|
||||||
| onSubmit | 数据验证成功后回调事件 | Function(e:Event) | |
|
| onSubmit | 数据验证成功后回调事件 | Function(e:Event) | |
|
||||||
|
|
|
@ -7,7 +7,10 @@ export const InputNumberProps = {
|
||||||
prefixCls: PropTypes.string,
|
prefixCls: PropTypes.string,
|
||||||
min: PropTypes.number,
|
min: PropTypes.number,
|
||||||
max: PropTypes.number,
|
max: PropTypes.number,
|
||||||
value: PropTypes.number,
|
value: PropTypes.oneOfType([
|
||||||
|
PropTypes.number,
|
||||||
|
PropTypes.string,
|
||||||
|
]),
|
||||||
step: PropTypes.oneOfType([
|
step: PropTypes.oneOfType([
|
||||||
PropTypes.number,
|
PropTypes.number,
|
||||||
PropTypes.string,
|
PropTypes.string,
|
||||||
|
|
|
@ -553,7 +553,7 @@ function createBaseForm (option = {}, mixins = []) {
|
||||||
},
|
},
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { $listeners } = this
|
const { $listeners, $slots } = this
|
||||||
const formProps = {
|
const formProps = {
|
||||||
[formPropName]: this.getForm(),
|
[formPropName]: this.getForm(),
|
||||||
}
|
}
|
||||||
|
@ -566,7 +566,7 @@ function createBaseForm (option = {}, mixins = []) {
|
||||||
on: $listeners,
|
on: $listeners,
|
||||||
ref: 'WrappedComponent',
|
ref: 'WrappedComponent',
|
||||||
}
|
}
|
||||||
return <WrappedComponent {...wrappedComponentProps}/>
|
return <WrappedComponent {...wrappedComponentProps}>{$slots.default}</WrappedComponent>
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if (Array.isArray(WrappedComponent.props)) {
|
if (Array.isArray(WrappedComponent.props)) {
|
||||||
|
|
|
@ -491,8 +491,9 @@ export default {
|
||||||
const inputDisplayValueFormat = this.formatWrapper(inputDisplayValue)
|
const inputDisplayValueFormat = this.formatWrapper(inputDisplayValue)
|
||||||
const isUpDisabled = !!upDisabledClass || disabled || readOnly
|
const isUpDisabled = !!upDisabledClass || disabled || readOnly
|
||||||
const isDownDisabled = !!downDisabledClass || disabled || readOnly
|
const isDownDisabled = !!downDisabledClass || disabled || readOnly
|
||||||
|
const { mouseenter = noop, mouseleave = noop, mouseover = noop, mouseout = noop } = this.$listeners
|
||||||
const contentProps = {
|
const contentProps = {
|
||||||
on: this.$listeners,
|
on: { mouseenter, mouseleave, mouseover, mouseout },
|
||||||
class: classes,
|
class: classes,
|
||||||
}
|
}
|
||||||
const upHandlerProps = {
|
const upHandlerProps = {
|
||||||
|
@ -578,7 +579,7 @@ export default {
|
||||||
step={this.step}
|
step={this.step}
|
||||||
name={this.name}
|
name={this.name}
|
||||||
id={this.id}
|
id={this.id}
|
||||||
onChange={this.onChange}
|
onInput={this.onChange}
|
||||||
ref='inputRef'
|
ref='inputRef'
|
||||||
value={inputDisplayValueFormat}
|
value={inputDisplayValueFormat}
|
||||||
pattern={this.pattern}
|
pattern={this.pattern}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import Iframe from './components/iframe.vue'
|
||||||
const AsyncTestComp = () => {
|
const AsyncTestComp = () => {
|
||||||
const d = window.location.hash.replace('#', '')
|
const d = window.location.hash.replace('#', '')
|
||||||
return {
|
return {
|
||||||
component: import(`../components/form/demo/${d}`),
|
component: import(`../components/form/demo/test.vue`),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue