【问题标题】:handlesubmit in react native formik outside of formik在formik之外的react native formik中处理提交
【发布时间】:2021-10-09 13:01:35
【问题描述】:

我想在formik之外使用我在formik中使用的TouchableOpacity。我不知道如何在formik的功能之外使用handleSubmit'。

不使用 useFormik 怎么办

}
_handleSubmit = (values) =>{

  const user = firebase.auth().currentUser.uid;
  if(user){
    const profileData = firebase.database().ref('kullaniciBilgiler/'+`${user}`);
    profileData.update({
      age:values.age,
      cinsiyet:values.cinsiyet,
      email:values.email,
      job:values.job,
      liveCity:values.liveCity,
      name:values.name,
      school:values.school,
      schoolLevel:values.schoolLevel,
      surname:values.surname,
    }).then(()=>console.log('işlem tamam usta'))
  }
  alert('başarılı dirim!');
  

}



  render() {



    return (

      <SafeAreaView style={styles.container} >
       
        <View style={styles.profilePhoto}>
        <TouchableOpacity  onPress={this.selectFile} >
        <Image
            source={{
              
              uri:  this.state.fileUri,   
             // this.state.urlPP
            }}
            style={styles.profPhoto}
          />
           </TouchableOpacity>
          
         
        </View>
        
        <View style={styles.profileDetails}>
        <View style={{flex:1, alignSelf:'center', justifyContent:'center'}}>
       <FlatList style={{width:'100%',}}
          data={this.state.list} 
          keyExtractor={(item)=>item.key}
          renderItem={({item})=>{
             return(
            
              <Formik
              initialValues={{
               
                val : item.val
                
               
              }}
              onSubmit={this._handleSubmit}
              validationSchema={
                Yup.object().shape({
                 
                  val: Yup.string().required(<Text style={{ color: 'red' }}>basarısız {item.key}</Text>),
                  

                  
  
                })
              }
            >
              {
                ({
                  values,
                  handleSubmit,
                  isValid,
                  isSubmitting,
                  errors,
                  handleChange
                }) => (
                <View style={{flexDirection:'column',
                width:windowWidth,
                paddingHorizontal:20,
                paddingVertical:10}}>
                   <Text style={styles.ppText}>{item.key}</Text> 
                   <TextInput
                   
                   defaultValue={values=item.val}
                   style={styles.input}
                   onChangeText={handleChange(item.key)}
                   
                  
                   ></TextInput>
                   {(errors.val) && <Text>{errors.val}</Text>}
                  
              
                <TouchableOpacity //I want to get this button out of the formik
              //disabled={!isValid || isSubmitting}
              onPress={handleSubmit}
             
              >
                <Text style={{textAlign:'center'}}>GÜNCELLE</Text>
              </TouchableOpacity>
              </View>
                 )

                 
                }
                 
              </Formik>
                )
             }}/>
     </View>       
     <TouchableOpacity 
              //disabled={!isValid || isSubmitting}
              onPress={this}
              
              >
                <Text style={{textAlign:'center'}}>GÜNCELLE</Text>
              </TouchableOpacity>
   </View>
                   
      </SafeAreaView>
      
   

我想在formik之外使用我在formik中使用的TouchableOpacity。我不知道如何在formik的功能之外使用handleSubmit'。

【问题讨论】:

    标签: reactjs react-native formik yup


    【解决方案1】:

    您可以在 formik 组件上使用“useRef”。

    稍后您可以在任何函数中使用该引用并可以调用 formik 方法。

    Formik 有一个 innerRef 属性,您可以在其中传递使用 useRef 创建的变量。

    import React,{useRef} from 'react'
    import { View, Text,TextInput, Button } from 'react-native'
    import { Formik} from 'formik'
    
    export default function Example(props) {
        const formikRef = useRef(null)
        const initialValues = {
            email:''
        }
        const submitForm = () =>{
            formikRef.current.submitForm()
        }
    
        return (
            <View>
    
                <Formik
                innerRef={formikRef}
                    initialValues={initialValues}
                    onSubmit={values => console.log(values)}
                >
                    {({ handleChange, handleBlur, handleSubmit, values }) => (
                    <View>
                        <TextInput
                        onChangeText={handleChange('email')}
                        onBlur={handleBlur('email')}
                        value={values.email}
                        />
                        
                    </View>
                    )}
                </Formik>
    
    
                <Button title="submit" onPress={submitForm} />
            </View>
        )
    }
    

    【讨论】:

    • 每当我使用 useRef 或 useState 时。我遇到了这个错误。错误:无效的挂钩调用。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一: 1. 你可能有不匹配的 React 版本和渲染器(例如 React DOM) 2. 你可能违反了 Hooks 规则 3. 你可能有多个 React 副本同一个应用程序 请参阅reactjs.org/link/invalid-hook-call 以获取有关如何调试和修复此问题的提示。
    • 钩子只在功能组件中起作用。如果您使用的是类组件,那么您可以使用 React.createRef() 检查 here js this.formikRef = React.createRef() innerRef={this.formikRef} 而不是 useRef
    • 问题解决了,谢谢@nitin vardha
    猜你喜欢
    • 1970-01-01
    • 2018-09-06
    • 2019-04-02
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    相关资源
    最近更新 更多