#javascript #react-native
Вопрос:
Недавно я столкнулся с проблемой, связанной со сборкой собственного производства react с Android и ios. У меня есть formik
форма, и onsubmit
из нее я вызвал API с функцией стрелки и обработал этот ответ. Он отлично работал в симуляторе и отладке с реальным устройством, но когда мы создавали apk
или ipa
использовали его, функция не работала, через 1 день отладки, когда я изменил ее на обычную функцию javascript, она работала нормально.
почему это происходит?
Код Функции Стрелки (Не Работал)
const forget = values =gt; { Alert.alert('third') const url = 'forgetpassword'; post(url, values).then(data =gt; handleForgetResponse(data)); };
Обычный код функции (Рабочий)
function forget (values){ Alert.alert('third') const url = 'forgetpassword'; post(url, values).then(data =gt; handleForgetResponse(data)); }
Код компонента
lt;Formik initialValues={{ email: '', }} innerRef={formRef} onSubmit={(values, {setSubmitting}) =gt; { Alert.alert('first') forget(values); Alert.alert('second') }} validate={validateForget}gt; {props =gt; ( lt;View style={{flex: 1}}gt; lt;View style={styles.forgetpassword}gt; lt;Text style={{ fontSize: an(20), fontWeight: '700', marginVertical: hp(1), }}gt; {'Forgot Password'} lt;/Textgt; lt;Text style={{fontWeight: '200'}}gt; {'Please enter your email address or mobile'} lt;/Textgt; lt;Text style={{fontWeight: '200'}}gt; {'number to receive a verification code.'} lt;/Textgt; lt;/Viewgt; lt;RenderTextInput text={'Registered Email OR Mobile Number'} style={{width: '90%', marginHorizontal: hp(2)}} value={props.values.email} autoCapitalize={'none'} autoCapitalize={'words'} onChangeText={props.handleChange('email')} error={props.touched.email amp;amp; props.errors.email} blur={() =gt; props.setFieldTouched('email', true)} returnKeyType="next" onSubmitEditing={() =gt; passwordRef?.current?.focus() }gt;lt;/RenderTextInputgt; lt;RenderButton text={'Submit'} textStyle={{color: 'white'}} style={{ marginVertical: hp(2), marginHorizontal: hp(2), height: hp(7), width: '90%', }} onPress={props.handleSubmit}gt;lt;/RenderButtongt; lt;/Viewgt; )} lt;/Formikgt;
Функция
// const forget = values =gt; { // Alert.alert('third') // const url = 'forgetpassword'; // post(url, values).then(data =gt; handleForgetResponse(data)); // }; function forget (values){ Alert.alert('third') const url = 'forgetpassword'; post(url, values).then(data =gt; handleForgetResponse(data)); } const handleForgetResponse = data =gt; { Alert.alert('fourth') ShowToast(data.message, data.status); if (data.status == 1) { navigation.navigate('Verification', { email: data.email, }); } };
Комментарии:
1. использовали ли вы эти функции обработчика для компонента на основе классов?
2. НЕТ, по функциональному компоненту
3. пожалуйста, поделитесь полным фрагментом кода, который вы определяете и используете в
4. пожалуйста, поделитесь кодом, была ли вызвана функция, добавьте журнал консоли в функцию.
5. Проблема не в определении функции с помощью функции со стрелкой, просто вы можете проверить это, вы используете другую функцию со стрелкой в
then
методе. таким образом, проблема не в функции стрелки. но ваша реализация может вызвать проблему.
Ответ №1:
Проблема заключается в вашей реализации с двумя типами функций и игнорировании hoisting
концепции в Javascript.
Быстрое решение:
function forget (values){ Alert.alert('third') const url = 'forgetpassword'; post(url, values).then(data =gt; handleForgetResponse(data)); } function handleForgetResponse (data) { Alert.alert('fourth') ShowToast(data.message, data.status); if (data.status == 1) { navigation.navigate('Verification', { email: data.email, }); } };
Объяснение:
Вы можете вызвать обычную функцию перед ее определением, но вы не можете сделать то же самое с функцией стрелки. давайте рассмотрим этот пример:
regularFn() // work fine! arrowFn() // ---gt; Cannot access 'arrowFn' before initialization function regularFn () { console.log("regular funciton called") } const arrowFn = () =gt; { console.log("arrow funciton called") }
это regularFn()
сработает, но arrowFn()
вызовет ошибку.
Возвращаясь к вашему случаю, вы используете функцию со стрелкой в forget
функции перед ее определением. таким образом, вы можете определить его перед forget
функцией или использовать обычную функцию для решения проблемы.
Комментарии:
1. Ваша точка зрения о подъеме правильна. Но в моем случае это не проблема. Тот же код с функцией стрелки работает и в другом компоненте. например, при входе в систему у меня тот же код. с одним дополнительным вводом он отлично работает в компоненте входа в систему
2. вы пытались изменить реализацию? каков же результат? какая часть вашего фрагмента кода не работала? вызываются ли оповещения? @swapnilgautam
3. предупреждение работало с обычной функцией, но не с функцией стрелки, но тот же код работал с компонентом входа в систему с функцией стрелки
4. итак, вы изменили конструкцию и рассмотрели возможность подъема? @swapnilgautam