@@ -498,7 +498,7 @@ describe('Form.Validate', () => {
498
498
499
499
[
500
500
{ name : 'serialization' , first : true , second : false , validateFirst : true } ,
501
- { name : 'parallel' , first : true , second : true , validateFirst : 'parallel' } ,
501
+ { name : 'parallel' , first : true , second : true , validateFirst : 'parallel' as const } ,
502
502
] . forEach ( ( { name, first, second, validateFirst } ) => {
503
503
it ( name , async ( ) => {
504
504
let ruleFirst = false ;
@@ -532,6 +532,7 @@ describe('Form.Validate', () => {
532
532
await changeValue ( wrapper , 'test' ) ;
533
533
await timeout ( ) ;
534
534
535
+ wrapper . update ( ) ;
535
536
matchError ( wrapper , 'failed first' ) ;
536
537
537
538
expect ( ruleFirst ) . toEqual ( first ) ;
@@ -610,5 +611,80 @@ describe('Form.Validate', () => {
610
611
wrapper . find ( 'button' ) . simulate ( 'click' ) ;
611
612
expect ( renderProps . mock . calls [ 0 ] [ 1 ] ) . toEqual ( expect . objectContaining ( { validating : true } ) ) ;
612
613
} ) ;
614
+
615
+ it ( 'renderProps should use latest rules' , async ( ) => {
616
+ let failedTriggerTimes = 0 ;
617
+ let passedTriggerTimes = 0 ;
618
+
619
+ interface FormStore {
620
+ username : string ;
621
+ password : string ;
622
+ }
623
+
624
+ const Demo = ( ) => (
625
+ < Form >
626
+ < InfoField name = "username" />
627
+ < Form . Field < FormStore > shouldUpdate = { ( prev , cur ) => prev . username !== cur . username } >
628
+ { ( _ , __ , { getFieldValue } ) => {
629
+ const value = getFieldValue ( 'username' ) ;
630
+
631
+ if ( value === 'removed' ) {
632
+ return null ;
633
+ }
634
+
635
+ return (
636
+ < InfoField
637
+ dependencies = { [ 'username' ] }
638
+ name = "password"
639
+ rules = {
640
+ value !== 'light'
641
+ ? [
642
+ {
643
+ validator : async ( ) => {
644
+ failedTriggerTimes += 1 ;
645
+ throw new Error ( 'Failed' ) ;
646
+ } ,
647
+ } ,
648
+ ]
649
+ : [
650
+ {
651
+ validator : async ( ) => {
652
+ passedTriggerTimes += 1 ;
653
+ } ,
654
+ } ,
655
+ ]
656
+ }
657
+ />
658
+ ) ;
659
+ } }
660
+ </ Form . Field >
661
+ </ Form >
662
+ ) ;
663
+
664
+ const wrapper = mount ( < Demo /> ) ;
665
+
666
+ expect ( failedTriggerTimes ) . toEqual ( 0 ) ;
667
+ expect ( passedTriggerTimes ) . toEqual ( 0 ) ;
668
+
669
+ // Failed of second input
670
+ await changeValue ( getField ( wrapper , 1 ) , '' ) ;
671
+ matchError ( getField ( wrapper , 2 ) , true ) ;
672
+
673
+ expect ( failedTriggerTimes ) . toEqual ( 1 ) ;
674
+ expect ( passedTriggerTimes ) . toEqual ( 0 ) ;
675
+
676
+ // Changed first to trigger update
677
+ await changeValue ( getField ( wrapper , 0 ) , 'light' ) ;
678
+ matchError ( getField ( wrapper , 2 ) , false ) ;
679
+
680
+ expect ( failedTriggerTimes ) . toEqual ( 1 ) ;
681
+ expect ( passedTriggerTimes ) . toEqual ( 1 ) ;
682
+
683
+ // Remove should not trigger validate
684
+ await changeValue ( getField ( wrapper , 0 ) , 'removed' ) ;
685
+
686
+ expect ( failedTriggerTimes ) . toEqual ( 1 ) ;
687
+ expect ( passedTriggerTimes ) . toEqual ( 1 ) ;
688
+ } ) ;
613
689
} ) ;
614
690
/* eslint-enable no-template-curly-in-string */
0 commit comments