@@ -140,8 +140,8 @@ class FormStore {
140140 // ===== dispatch =====
141141 private baseDispatch = ( a : Action ) => {
142142 switch ( a . type ) {
143- case 'updateValue ' :
144- this . updateValue ( a . name , a . value , { validate : a . validate } ) ;
143+ case 'setFieldValue ' :
144+ this . setFieldValue ( a . name , a . value , a . validate ) ;
145145 break ;
146146 case 'setFieldsValue' :
147147 this . setFieldsValue ( a . values , a . validate ) ;
@@ -433,7 +433,7 @@ class FormStore {
433433 const nextVal = def . compute ( getKey , this . _store ) ;
434434 const prevVal = getKey ( k ) ;
435435 if ( ! isEqual ( prevVal , nextVal ) ) {
436- this . updateValue ( keyOfName ( k ) , nextVal , { markTouched : false } ) ; // 不标记 touched
436+ this . setFieldValue ( keyOfName ( k ) , nextVal ) ;
437437 }
438438 }
439439 } ) ;
@@ -504,54 +504,64 @@ class FormStore {
504504 } ;
505505
506506 private setFieldValue = ( name : NamePath , value : StoreValue , validate = false ) => {
507- this . dispatch ( { name, type : 'updateValue' , validate, value } ) ;
508- } ;
509-
510- private updateValue = (
511- name : NamePath ,
512- value : StoreValue ,
513- { markTouched = true , validate = false } : { markTouched ?: boolean ; validate ?: boolean } = { }
514- ) => {
515507 const key = keyOfName ( name ) ;
516-
517508 const before = get ( this . _store , key ) ;
518509
519- if ( isEqual ( before , value ) ) return ; // value not changed, do not trigger
520-
521- this . updateStore ( set ( this . _store , name , value ) ) ;
522-
523- this . _validated . delete ( key ) ;
510+ if ( isEqual ( before , value ) ) return ; // no change
524511
525- // touched
526- let mask = ChangeTag . Value ;
527-
528- if ( markTouched && ! this . _touched . has ( key ) ) {
529- this . _touched . add ( key ) ;
530- mask |= ChangeTag . Touched ;
531- }
532- // dirty: compare with initial
533512 const initV = this . getInitialValue ( key ) ;
534513
535- isEqual ( value , initV ) ? this . _dirty . delete ( key ) : this . _dirty . add ( key ) ;
514+ // 1. 更新 store
515+ this . updateStore ( set ( this . _store , name , value ) ) ;
536516
537- mask |= ChangeTag . Dirty ;
517+ // 2. 更新元状态(dirty/touched/validated)
518+ const mask = this . updateMetaState ( key , value , initV ) ;
538519
520+ // 3. 通知订阅者
539521 this . enqueueNotify ( [ name ] , mask ) ;
540522
541- // callback
523+ // 4. 执行回调
542524 this . _callbacks . onValuesChange ?.( set ( { } , key , value ) , this . _store ) ;
543-
544525 this . triggerOnFieldsChange ( [ key ] ) ;
545526
527+ // 5. 触发依赖计算
546528 const affected = this . collectDependents ( [ key ] ) ;
547-
548529 this . recomputeTargets ( affected ) ;
549530
531+ // 6. 是否立即校验
550532 if ( validate ) {
551533 this . dispatch ( { name, type : 'validateField' } ) ;
552534 }
553535 } ;
554536
537+ private updateMetaState = ( key : string , value : StoreValue , initV : StoreValue ) : ChangeMask => {
538+ let mask = ChangeTag . Value ;
539+
540+ // touched
541+ if ( ! this . _touched . has ( key ) ) {
542+ this . _touched . add ( key ) ;
543+ mask |= ChangeTag . Touched ;
544+ }
545+
546+ // dirty
547+ const wasDirty = this . _dirty . has ( key ) ;
548+ const isDirty = ! isEqual ( value , initV ) ;
549+ if ( isDirty && ! wasDirty ) {
550+ this . _dirty . add ( key ) ;
551+ mask |= ChangeTag . Dirty ;
552+ } else if ( ! isDirty && wasDirty ) {
553+ this . _dirty . delete ( key ) ;
554+ mask |= ChangeTag . Dirty ;
555+ }
556+
557+ // validated 一旦值变了 → 作废
558+ if ( this . _validated . has ( key ) ) {
559+ this . _validated . delete ( key ) ;
560+ }
561+
562+ return mask ;
563+ } ;
564+
555565 // ------------------------------------------------
556566 // Fields State (errors/touched/validating/warnings, selectors)
557567 // ------------------------------------------------
@@ -1121,7 +1131,8 @@ class FormStore {
11211131 isFieldValidating : this . isFieldValidating ,
11221132 resetFields : ( names : NonNullable < NamePath > [ ] = [ ] ) => this . dispatch ( { names, type : 'reset' } ) ,
11231133 setFieldsValue : ( values : Store , validate = false ) => this . dispatch ( { type : 'setFieldsValue' , validate, values } ) ,
1124- setFieldValue : this . setFieldValue ,
1134+ setFieldValue : ( name : NamePath , value : StoreValue , validate = false ) =>
1135+ this . dispatch ( { name, type : 'setFieldValue' , validate, value } ) ,
11251136 submit : this . submit ,
11261137 use : this . use ,
11271138 validateField : ( name : NamePath , opts ?: ValidateOptions ) => this . dispatch ( { name, opts, type : 'validateField' } ) ,
0 commit comments