You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ant-design-vue/components/vc-form/demo/suggest.js

104 lines
2.4 KiB

/* eslint react/no-multi-comp:0, no-console:0 */
import { createForm } from '../index'
import { Select } from 'ant-design-vue'
import { regionStyle, errorStyle } from './styles'
import { mergeProps } from '../../_util/props-util'
const emailTpl = ['@gmail.com', '@outlook.com', '@qq.com']
const { Option } = Select
const CustomInput = {
props: {
form: Object,
},
data () {
return { data: [] }
},
methods: {
onChange (v) {
if (v.indexOf('@') === -1) {
this.data = emailTpl.map(m => v + m)
} else if (this.data.length) {
this.data = []
}
},
},
render () {
const { getFieldProps, getFieldError, isFieldValidating } = this.form
const errors = getFieldError('select')
return (
<div style={regionStyle}>
<div>custom select sync validate</div>
<div>
<Select
{ ...mergeProps({ props: { placeholder: 'please select', mode: 'combobox', filterOption: false }, style: { width: '200px' }}, getFieldProps('select', { change: this.onChange, rules: [{ type: 'email' }, { required: true }] })) }>
{this
.data
.map((d) => {
return <Option key={d} value={d}>{d}</Option>
})}
</Select>
</div>
<div style={errorStyle}>
{(errors)
? errors.join(',')
: <b style={{
visibility: 'hidden',
}}>
1
</b>}
</div>
<div style={errorStyle}>
{isFieldValidating('select')
? 'validating'
: <b style={{
visibility: 'hidden',
}}>
1
</b>}
</div>
</div>
)
},
}
const Form = {
props: {
form: Object,
},
methods: {
onSubmit (e) {
e.preventDefault()
this
.form
.validateFields((error, values) => {
if (!error) {
console.log('ok', values)
} else {
console.log('error', error, values)
}
})
},
},
render () {
const { form } = this
return (
<div style={{
margin: '20px',
}}>
<h2>suggest</h2>
<form onSubmit={this.onSubmit}>
<CustomInput form={form}/>
<div style={regionStyle}>
<button>submit</button>
</div>
</form>
</div>
)
},
}
export default createForm()(Form)