React Native运行报找不到onClassifyPress变量的问题求助
问题定位与修正方案
核心报错根源(按触发优先级排序)
- 变量声明缺失触发严格模式报错:你在函数组件内部写
onClassifyPress = async() => {}、onDocumentPress = async() => {}这类赋值语句时,没有用const/let做变量声明,RN运行环境默认开启严格模式,直接执行未声明的变量赋值操作就会抛出「Can't find variable: onClassifyPress」的ReferenceError,代码根本无法执行到按钮渲染环节。 - 函数组件误用
this上下文:当前App是标准函数式组件,不存在类组件的实例化this对象,你在按钮的onPress属性里写this.onDocumentPress、this.onClassifyPress的引用方式完全无效,会出现方法取不到的二次报错。 - 混用Web端标签:JSX中使用的
<div>是Web专属HTML标签,RN运行时无对应内置组件解析,会触发组件识别失败。
具体修正操作
- 组件内部的事件处理方法,必须用
const关键字显式声明为作用域内的局部变量 - 移除按钮绑定事件时的
this.前缀,直接引用定义好的方法变量 - 用RN内置的
<View>组件替换<div>作为布局容器,补充基础样式避免布局挤压
修正后的可运行代码
import React from 'react'; import { StyleSheet, View, Button, } from 'react-native'; import DocumentPicker from 'react-native-document-picker'; const App = () => { // 显式声明局部事件方法,替换原类组件写法 const onDocumentPress = async () => { try { let urlOfS = 'http://10.0.2.2:5000/fileupload'; const res = await DocumentPicker.pick({ type: [DocumentPicker.types.allFiles], }) if (res.size < 50000000) { let data = new FormData(); data.append('file', res) try { const responseOfFileUpload = await fetch(urlOfS, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'multipart/form-data', }, body: data, }) if (responseOfFileUpload.status == 200) { let responseInJs = await responseOfFileUpload.json(); console.log(responseInJs.answer); alert('Upload Succesfull'); } else { alert('Upload Failed'); } } catch (err) { alert('Upload Failed - Request nu a fost trimis'); console.log(err, 'error in upload'); } } else { alert('File size should not exceed 50 MB'); } } catch (err) { if (DocumentPicker.isCancel(err)) { alert('No document selected'); } else { throw err; } } } const onClassifyPress = async () => { let urlOfS = 'http://10.0.2.2:5000/classy'; // 可在此处补充分类接口的完整请求逻辑 } return ( <View style={styles.container}> <Button title="select document" onPress={onDocumentPress} /> <View style={styles.btnGap}> <Button title="classify song" onPress={onClassifyPress} /> </View> </View> ); }; const styles = StyleSheet.create({ container: { flex: 1, padding: 24, justifyContent: 'center', }, btnGap: { marginTop: 16, } }) export default App;
注:修正后代码会直接解决原有报错,后续开发可直接在对应方法内补全业务逻辑,不需要调整组件基础结构。
内容的提问来源于stack exchange,提问作者Tiberiu Putinaru
相关产品推荐
相关产品推荐

