javascript - React Native:生产构建上的箭头功能不起作用
问题描述
我最近遇到了一个使用 android 和 ios 反应原生生产构建的问题。我有一个formik
表单onsubmit
,其中我调用了一个带有箭头函数的 API 并处理该响应。它在模拟器中工作正常并使用真实设备进行调试,但是当我们创建apk
或ipa
使用它时,该功能无法正常工作,经过 1 天的调试后,当我将其更改为普通的 javascript 函数时,它工作正常。
为什么会这样?
箭头功能代码(不工作)
const forget = values => {
Alert.alert('third')
const url = 'forgetpassword';
post(url, values).then(data => handleForgetResponse(data));
};
正常功能代码(工作)
function forget (values){
Alert.alert('third')
const url = 'forgetpassword';
post(url, values).then(data => handleForgetResponse(data));
}
组件代码
<Formik
initialValues={{
email: '',
}}
innerRef={formRef}
onSubmit={(values, {setSubmitting}) => {
Alert.alert('first')
forget(values);
Alert.alert('second')
}}
validate={validateForget}>
{props => (
<View style={{flex: 1}}>
<View style={styles.forgetpassword}>
<Text
style={{
fontSize: an(20),
fontWeight: '700',
marginVertical: hp(1),
}}>
{'Forgot Password'}
</Text>
<Text style={{fontWeight: '200'}}>
{'Please enter your email address or mobile'}
</Text>
<Text style={{fontWeight: '200'}}>
{'number to receive a verification code.'}
</Text>
</View>
<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 && props.errors.email}
blur={() => props.setFieldTouched('email', true)}
returnKeyType="next"
onSubmitEditing={() =>
passwordRef?.current?.focus()
}></RenderTextInput>
<RenderButton
text={'Submit'}
textStyle={{color: 'white'}}
style={{
marginVertical: hp(2),
marginHorizontal: hp(2),
height: hp(7),
width: '90%',
}}
onPress={props.handleSubmit}></RenderButton>
</View>
)}
</Formik>
功能
// const forget = values => {
// Alert.alert('third')
// const url = 'forgetpassword';
// post(url, values).then(data => handleForgetResponse(data));
// };
function forget (values){
Alert.alert('third')
const url = 'forgetpassword';
post(url, values).then(data => handleForgetResponse(data));
}
const handleForgetResponse = data => {
Alert.alert('fourth')
ShowToast(data.message, data.status);
if (data.status == 1) {
navigation.navigate('Verification', {
email: data.email,
});
}
};
解决方案
问题在于您使用两种类型的函数实现并忽略了hoisting
Javascript 中的概念。
快速修复:
function forget (values){
Alert.alert('third')
const url = 'forgetpassword';
post(url, values).then(data => 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() // ---> Cannot access 'arrowFn' before initialization
function regularFn () {
console.log("regular funciton called")
}
const arrowFn = () => {
console.log("arrow funciton called")
}
将regularFn()
起作用,但arrowFn()
会导致错误。
回到您的情况,您forget
在定义之前在函数中使用箭头函数。因此您可以在forget
函数之前定义它或使用常规函数来解决问题。
推荐阅读
- asp.net - target="_blank" 不打开新标签
- javascript - CSS - 水平滚动上的粘性 div?
- android - 分页库,重置 PageKeyedDataSource
- jenkins - 有没有办法使用 jenkinsfile 链接两个不同的管道?
- flutter - Flutter中如何根据json响应动态更新Listview
- c# - 将已经实例化的属性传递给 using 语句是一种好习惯吗?
- java - 优化:while (true)
- java - Java - 从方法返回不同的类并使用类的特定功能
- java - 多线程:我们如何使用 Java 进行时间切片?
- node.js - 如何在 MEAN 堆栈应用程序中从后端到前端通信?