Skip to content

Commit d176a1f

Browse files
committed
Modified src/Form.js
Modified src/FormItem.js Modified src/utils.js
1 parent 394c873 commit d176a1f

File tree

3 files changed

+84
-71
lines changed

3 files changed

+84
-71
lines changed

src/Form.js

Lines changed: 71 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import AsyncValidator from "async-validator";
55
import set from "lodash/set";
66
import get from "lodash/get";
77
import FormContext from "./FormContext";
8-
import { isEmptyValue } from "./utils";
8+
import { isEmptyValue, deferred } from "./utils";
99

1010
AsyncValidator.warning = function() {};
1111

@@ -88,10 +88,12 @@ export default class Form extends React.Component {
8888
return formValue[name];
8989
}
9090

91-
setValue(name, value, event, cb) {
91+
setValue(name, value, cb) {
9292
const { path2obj, onChange } = this.props;
9393
const formValue = this.state.formValue;
94+
const defer = deferred();
9495

96+
// TODO: 后面再考虑下特殊场景
9597
const nextFormValue = {
9698
...formValue
9799
};
@@ -109,14 +111,55 @@ export default class Form extends React.Component {
109111
}
110112

111113
if (onChange) {
112-
onChange(nextFormValue, event);
114+
onChange(nextFormValue);
113115
}
114116

115117
if (cb) {
116-
this._valiateCb.push(cb);
118+
this._valiateCb.push(formValue => {
119+
cb(formValue);
120+
defer.resolve();
121+
});
122+
}
123+
124+
return defer.promise;
125+
}
126+
127+
setValues(obj = {}, cb) {
128+
const { path2obj, onChange } = this.props;
129+
const formValue = this.state.formValue;
130+
const defer = deferred();
131+
132+
const nextFormValue = {
133+
...formValue
134+
};
135+
136+
Object.keys(obj).forEach(name => {
137+
const value = obj[name];
138+
if (path2obj) {
139+
set(nextFormValue, name, value);
140+
} else {
141+
nextFormValue[name] = value;
142+
}
143+
});
144+
145+
if (!("formValue" in this.props)) {
146+
this.setState({
147+
formValue: nextFormValue
148+
});
149+
}
150+
151+
if (onChange) {
152+
onChange(nextFormValue);
117153
}
118154

119-
return this;
155+
if (cb) {
156+
this._valiateCb.push(formValue => {
157+
cb(formValue);
158+
defer.resolve();
159+
});
160+
}
161+
162+
return defer.promise;
120163
}
121164

122165
componentDidUpdate() {
@@ -132,15 +175,19 @@ export default class Form extends React.Component {
132175
this._valiateCb = [];
133176
}
134177

178+
hasError(name) {
179+
const { formError } = this.state;
180+
181+
return formError[name] !== null;
182+
}
183+
135184
getError(name) {
136185
const { formError } = this.state;
137-
if (!arguments.length) return formError;
138186
return formError[name];
139187
}
140188

141189
cleanErrors() {
142190
this.setState({
143-
validatingFields: {},
144191
formError: {}
145192
});
146193
}
@@ -187,47 +234,6 @@ export default class Form extends React.Component {
187234
return fieldValidators.filter(v => typeof v === "function");
188235
}
189236

190-
getFieldRules(name) {
191-
const fieldRules = [];
192-
this.fields
193-
.filter(field => field.props.name === name)
194-
.forEach(field => {
195-
const fieldProps = field.props;
196-
let rules = fieldProps.rules || [];
197-
if (typeof rules === "function") {
198-
rules = [
199-
{
200-
validator: rules
201-
}
202-
];
203-
} else if (!Array.isArray(rules)) {
204-
rules = [rules];
205-
}
206-
if (fieldProps.required) {
207-
rules.unshift({
208-
required: true
209-
});
210-
}
211-
212-
fieldRules.push(...rules);
213-
});
214-
215-
let rules = this.props.rules[name] || [];
216-
if (rules) {
217-
if (typeof rules === "function") {
218-
rules = [
219-
{
220-
validator: rules
221-
}
222-
];
223-
} else if (!Array.isArray(rules)) {
224-
rules = [rules];
225-
}
226-
}
227-
228-
return rules ? fieldRules.concat(rules) : fieldRules;
229-
}
230-
231237
isValidatingField(name) {
232238
const validatingFields = this.state.validatingFields;
233239
return !!validatingFields[name];
@@ -238,7 +244,7 @@ export default class Form extends React.Component {
238244
const validators = this.getFieldValidator(name);
239245

240246
if (!validators.length) {
241-
callback();
247+
callback(null, value);
242248
return;
243249
}
244250

@@ -340,7 +346,8 @@ export default class Form extends React.Component {
340346
const validCounter = 0;
341347
const asyncMaxTime = 100; //校验时间小于100ms不算异步
342348
const validatingFields = {};
343-
const formError = [];
349+
const formError = {};
350+
const allErrors = [];
344351
let asyncTimer = setTimeout(() => {
345352
asyncTimer = null;
346353
this.setState({
@@ -352,9 +359,10 @@ export default class Form extends React.Component {
352359
validCounter--;
353360

354361
if (errors) {
355-
// formError[name] = errors[0].message;
356-
formError.push(...errors);
362+
formError[name] = errors[0].message;
363+
allErrors.push(...errors);
357364
}
365+
358366
if (validCounter <= 0) {
359367
this.setState(
360368
{
@@ -363,7 +371,7 @@ export default class Form extends React.Component {
363371
},
364372
() => {
365373
callback(
366-
formError.length ? formError : null,
374+
allErrors.length ? allErrors : null,
367375
formValue
368376
);
369377
}
@@ -399,25 +407,19 @@ export default class Form extends React.Component {
399407
}
400408
}
401409

402-
validateAndScroll(callback) {
410+
validateAndScroll(callback = () => {}) {
403411
this.validate((errors, formValue) => {
404412
if (errors) {
405-
let field;
406-
const formError = this.state.formError;
407413
const fields = this.fields;
408-
fields.forEach(f => {
409-
const name = f.props.name;
410-
if (!name) return;
411-
if (!field && name in formError) {
412-
field = f;
413-
}
414-
});
415-
416-
if (field) {
417-
const dom = field.getDOM();
418-
419-
if (dom && dom.scrollIntoView) {
420-
dom.scrollIntoView();
414+
for (let i = 0; i < fields.length; i++) {
415+
const field = fields[i];
416+
const name = field.props.name;
417+
if (this.hasError(name)) {
418+
const dom = field.getDOM();
419+
if (dom && dom.scrollIntoView) {
420+
dom.scrollIntoView();
421+
break;
422+
}
421423
}
422424
}
423425
}

src/FormItem.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,11 @@ export default class FormItem extends React.Component {
119119
return form.getValue(name);
120120
}
121121

122-
onFieldChange = (value, e) => {
122+
onFieldChange = value => {
123123
const { form } = this.context;
124124
const { name } = this.props;
125125

126-
form.setValue(name, value, e, () => {
126+
form.setValue(name, value, () => {
127127
const validateTrigger = this.getValidateTrigger();
128128
const validateDelay = this.getValidateDelay();
129129

src/utils.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,14 @@ export function isEmptyValue(value) {
1111

1212
return false;
1313
}
14+
15+
export function deferred() {
16+
const deferred = {};
17+
18+
deferred.promise = new Promise((resolve, reject) => {
19+
deferred.resolve = resolve;
20+
deferred.reject = reject;
21+
});
22+
23+
return deferred;
24+
}

0 commit comments

Comments
 (0)