@@ -657,4 +657,96 @@ describe('useModel', () => {
657
657
expect ( setValue ) . toBeCalledTimes ( 2 )
658
658
expect ( msg . value ) . toBe ( defaultVal )
659
659
} )
660
+
661
+ // #11526
662
+ test ( 'custom getter' , ( ) => {
663
+ let changeChildMsg ! : ( val : boolean ) => void
664
+ const getter = ( value : boolean ) => ! value
665
+
666
+ const Comp = defineComponent ( {
667
+ props : [ 'msg' ] ,
668
+ emits : [ 'update:msg' ] ,
669
+ setup ( props ) {
670
+ const childMsg = useModel ( props , 'msg' , {
671
+ get : getter ,
672
+ set : value => ! value ,
673
+ } )
674
+ changeChildMsg = ( val : boolean ) => ( childMsg . value = val )
675
+ return ( ) => {
676
+ return childMsg . value
677
+ }
678
+ } ,
679
+ } )
680
+
681
+ const defaultVal = false
682
+ const msg = ref ( defaultVal )
683
+ const Parent = defineComponent ( {
684
+ setup ( ) {
685
+ return ( ) =>
686
+ h ( Comp , {
687
+ msg : msg . value ,
688
+ 'onUpdate:msg' : val => {
689
+ msg . value = val
690
+ } ,
691
+ } )
692
+ } ,
693
+ } )
694
+
695
+ const root = nodeOps . createElement ( 'div' )
696
+ render ( h ( Parent ) , root )
697
+
698
+ changeChildMsg ( ! getter ( msg . value ) )
699
+ expect ( msg . value ) . toBe ( true )
700
+
701
+ changeChildMsg ( ! getter ( msg . value ) )
702
+ expect ( msg . value ) . toBe ( false )
703
+ } )
704
+
705
+ // #11541
706
+ test ( 'custom setter' , ( ) => {
707
+ let changeChildMsg ! : ( val : boolean ) => void
708
+
709
+ const Comp = defineComponent ( {
710
+ props : [ 'msg' ] ,
711
+ emits : [ 'update:msg' ] ,
712
+ setup ( props ) {
713
+ const childMsg = useModel ( props , 'msg' , {
714
+ set : value => {
715
+ if ( value === msg . value ) {
716
+ return null
717
+ } else {
718
+ return value
719
+ }
720
+ } ,
721
+ } )
722
+ changeChildMsg = ( val : boolean ) => ( childMsg . value = val )
723
+ return ( ) => {
724
+ return childMsg . value
725
+ }
726
+ } ,
727
+ } )
728
+
729
+ const defaultVal = false
730
+ const msg = ref ( defaultVal )
731
+ const Parent = defineComponent ( {
732
+ setup ( ) {
733
+ return ( ) =>
734
+ h ( Comp , {
735
+ msg : msg . value ,
736
+ 'onUpdate:msg' : val => {
737
+ msg . value = val
738
+ } ,
739
+ } )
740
+ } ,
741
+ } )
742
+
743
+ const root = nodeOps . createElement ( 'div' )
744
+ render ( h ( Parent ) , root )
745
+
746
+ changeChildMsg ( true )
747
+ expect ( msg . value ) . toBe ( true )
748
+
749
+ changeChildMsg ( true )
750
+ expect ( msg . value ) . toBe ( null )
751
+ } )
660
752
} )
0 commit comments