1- import { computed , inject , SetupContext , toRef , provide } from 'vue' ;
1+ import { computed , inject , SetupContext , toRef , provide , watch } from 'vue' ;
2+ import { FORM_TOKEN , FORM_ITEM_TOKEN } from '../../form' ;
23import { RadioProps , RadioGroupProps , radioGroupInjectionKey , UseRadioFn , valueTypes , UseRadioButtonFn } from './radio-types' ;
34
45export function useRadio ( props : RadioProps , ctx : SetupContext ) : UseRadioFn {
6+ const formContext = inject ( FORM_TOKEN , undefined ) ;
7+ const formItemContext = inject ( FORM_ITEM_TOKEN , undefined ) ;
58 const radioGroupConf = inject ( radioGroupInjectionKey , null ) ;
69
710 /** 是否禁用 */
811 const isDisabled = computed ( ( ) => {
9- return props . disabled || radioGroupConf ?. disabled . value ;
12+ return formContext ?. disabled || props . disabled || radioGroupConf ?. disabled . value ;
1013 } ) ;
1114 /** 判断是否勾选 */
1215 const isChecked = computed ( ( ) => {
@@ -57,8 +60,14 @@ export function useRadio(props: RadioProps, ctx: SetupContext): UseRadioFn {
5760 } ) ;
5861
5962 const size = computed ( ( ) => {
60- return radioGroupConf ?. size . value || props . size ;
63+ return formContext ?. size || radioGroupConf ?. size . value || props . size ;
6164 } ) ;
65+ watch (
66+ ( ) => props . modelValue ,
67+ ( ) => {
68+ formItemContext ?. validate ( 'change' ) . catch ( ( err ) => console . warn ( err ) ) ;
69+ }
70+ ) ;
6271 return {
6372 isChecked,
6473 radioName,
@@ -70,12 +79,20 @@ export function useRadio(props: RadioProps, ctx: SetupContext): UseRadioFn {
7079}
7180
7281export function useRadioGroup ( props : RadioGroupProps , ctx : SetupContext ) : void {
82+ const formItemContext = inject ( FORM_ITEM_TOKEN , undefined ) ;
7383 /** change 事件 */
7484 const emitChange = ( radioValue : valueTypes ) => {
7585 ctx . emit ( 'update:modelValue' , radioValue ) ;
7686 ctx . emit ( 'change' , radioValue ) ;
7787 } ;
7888
89+ watch (
90+ ( ) => props . modelValue ,
91+ ( ) => {
92+ formItemContext ?. validate ( 'change' ) . catch ( ( err ) => console . warn ( err ) ) ;
93+ }
94+ ) ;
95+
7996 // 注入给子组件
8097 provide ( radioGroupInjectionKey , {
8198 modelValue : toRef ( props , 'modelValue' ) ,
0 commit comments