11import React , { FC , useContext } from 'react' ;
22import { KeyType , FormItemsProps } from './types' ;
3+ import { isObjectEmpty } from './utils/is' ;
34import { Context } from './hooks/context' ;
45import Radio from '../Radio' ;
56import CheckBox from '../CheckBox' ;
@@ -15,23 +16,22 @@ import { View, Text, SafeAreaView, StyleSheet, TextInput } from 'react-native';
1516
1617const FormItems : FC < any > = ( { formDatas = [ ] } ) => {
1718 const {
18- innerMethods : { store = { } , updateStore, validator, innerValidate } ,
19+ innerMethods : { store = { } , updateStore, validator, innerValidate, watch , customComponentList } ,
1920 } = useContext ( Context ) ;
2021
21- const change = ( field : KeyType , value : any ) => updateStore ?.( { store : { ...store , [ field ] : value } } ) ;
22+ const change = ( field : KeyType , value : unknown ) => {
23+ updateStore ?.( { store : { ...store , [ field ] : value } } ) ;
24+ watch [ field ] ?.( value ) ;
25+ } ;
2226
2327 const _renderComponent = ( v : FormItemsProps ) => {
2428 const options = v . options || [ ] ;
25- if ( v . type === 'render' ) {
26- return v . render ;
27- }
2829 if ( v . type === 'input' ) {
2930 return (
3031 < TextInput
3132 value = { store [ v . field ] }
3233 onChangeText = { ( value ) => {
3334 change ( v . field , value ) ;
34- v ?. attr ?. onChangeText ?.( value ) ;
3535 innerValidate ( ) ;
3636 } }
3737 { ...v . attr }
@@ -43,7 +43,6 @@ const FormItems: FC<any> = ({ formDatas = [] }) => {
4343 < TextArea
4444 onChange = { ( value : string ) => {
4545 change ( v . field , value ) ;
46- v ?. attr ?. onChange ?.( value ) ;
4746 innerValidate ( ) ;
4847 } }
4948 value = { store [ v . field ] }
@@ -58,7 +57,6 @@ const FormItems: FC<any> = ({ formDatas = [] }) => {
5857 checked = { item . value === store [ v . field ] }
5958 onPress = { ( ) => {
6059 change ( v . field , item . value ) ;
61- v ?. attr ?. onPress ?.( item . value ) ;
6260 innerValidate ( ) ;
6361 } }
6462 { ...v . attr }
@@ -83,7 +81,6 @@ const FormItems: FC<any> = ({ formDatas = [] }) => {
8381 data . splice ( idx , 1 ) ;
8482 }
8583 change ( v . field , data ) ;
86- v ?. attr ?. onChange ?.( data ) ;
8784 innerValidate ( ) ;
8885 } }
8986 { ...v . attr }
@@ -98,7 +95,6 @@ const FormItems: FC<any> = ({ formDatas = [] }) => {
9895 < Rating
9996 onPress = { ( number ) => {
10097 change ( v . field , number ) ;
101- v ?. attr ?. onPress ?.( number ) ;
10298 innerValidate ( ) ;
10399 } }
104100 { ...v . attr }
@@ -111,7 +107,6 @@ const FormItems: FC<any> = ({ formDatas = [] }) => {
111107 checked = { store [ v . field ] }
112108 onValueChange = { ( value ) => {
113109 change ( v . field , ! store [ v . field ] ) ;
114- v ?. attr ?. onValueChange ?.( value ) ;
115110 innerValidate ( ) ;
116111 } }
117112 { ...v . attr }
@@ -124,7 +119,6 @@ const FormItems: FC<any> = ({ formDatas = [] }) => {
124119 options = { options }
125120 onChange = { ( value ) => {
126121 change ( v . field , value ) ;
127- v ?. attr ?. onChange ?.( value ) ;
128122 innerValidate ( ) ;
129123 } }
130124 contentStyle = { { paddingHorizontal : 0 } }
@@ -141,7 +135,6 @@ const FormItems: FC<any> = ({ formDatas = [] }) => {
141135 value = { store [ v . field ] }
142136 onChange = { ( value ) => {
143137 change ( v . field , value ) ;
144- v ?. attr ?. onChange ?.( value ) ;
145138 innerValidate ( ) ;
146139 } }
147140 { ...v . attr }
@@ -154,13 +147,24 @@ const FormItems: FC<any> = ({ formDatas = [] }) => {
154147 value = { store [ v . field ] }
155148 onChange = { ( value ) => {
156149 change ( v . field , value ) ;
157- v ?. attr ?. onChange ?.( value ) ;
158150 innerValidate ( ) ;
159151 } }
160152 { ...v . attr }
161153 />
162154 ) ;
163155 }
156+ // 自定义组件
157+ if ( ! isObjectEmpty ( customComponentList ) && Object . keys ( customComponentList ) . includes ( v . type ) ) {
158+ return React . isValidElement ( customComponentList [ v . type ] )
159+ ? React . cloneElement ( customComponentList [ v . type ] , {
160+ ...v . attr ,
161+ onChange : ( value : unknown ) => {
162+ change ( v . field , value ) ;
163+ innerValidate ( ) ;
164+ } ,
165+ } )
166+ : null ;
167+ }
164168 return null ;
165169 } ;
166170
0 commit comments