@@ -5,7 +5,7 @@ import AsyncValidator from "async-validator";
55import set from "lodash/set" ;
66import get from "lodash/get" ;
77import FormContext from "./FormContext" ;
8- import { isEmptyValue } from "./utils" ;
8+ import { isEmptyValue , deferred } from "./utils" ;
99
1010AsyncValidator . 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 }
0 commit comments