124 lines
2.7 KiB
JavaScript
124 lines
2.7 KiB
JavaScript
/* 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);
|