React Native无法识别useState hook 报useState不是函数渲染错误
问题根因
- 直接触发
(0,_reactNative.useState) is not a function报错的核心原因是Hook导入路径错误:useState、useEffect属于React核心Hook,由react包导出,不属于react-native包的导出API。你当前代码从react-native中解构这两个Hook,实际拿到的是undefined,调用时自然会抛出不是函数的错误。 - 代码中存在多处Hook违规用法,会在修复导入问题后继续触发运行报错:
- 违反Hook调用规则:
useEffect只能在组件顶层作用域调用,不能嵌入到onSubmitEditing这类事件回调函数中使用。 useEffect本身不返回Promise,你在调用后直接链式调用.then()会直接抛出类型错误。- 两处数据库写入逻辑都引用了未定义的
newNum变量,会触发引用错误:顶层作用域不存在newNum变量,只有onChangeText的回调参数里才有这个变量。
- 违反Hook调用规则:
- 存在React Native不支持的组件标签:代码中使用了Web端的
<form>标签,React Native运行环境没有对应原生组件,渲染时会抛出组件找不到的错误。 - 数据库写入逻辑冗余重复:相同的Firestore写入逻辑写了两次,会导致非预期的重复写入。
修复后代码
// 修正Hook导入路径,从react包导入useState、useEffect import React, { useState, useEffect } from 'react'; import { View, StyleSheet, TextInput } from 'react-native'; import db from 'D:/App development/PRLog/PrLogBeta/database/firestore' const EnteryModal = props => { const [numReps,setNumReps] = useState(''); // 仅在需要组件挂载/依赖更新触发副作用时使用useEffect,不要链式调.then useEffect(() => { console.log('组件已挂载'); // 如果需要挂载时写库,直接在这里写async逻辑即可 // 注意不要引用不存在的变量,取输入值要使用状态里的numReps },[]); // 提交事件单独封装为普通回调函数,不要在事件里调用Hook const handleSubmit = async () => { try { await db.collection('Bench').add({reps: numReps}) console.log('Number Added!'); } catch (error) { console.error('数据写入失败:', error); } } return( <View style={styles.inputStyle}> {/* 删除RN不支持的form标签 */} <TextInput style = {styles.inputStyle} keyboardType='number-pad' placeholder={props.RepsOrWeight} placeholderTextColor = 'white' textAlign='center' onChangeText={newNum => setNumReps(newNum)} defaultValue={numReps} onSubmitEditing={handleSubmit} /> </View> ); }; // 补全之前缺失的样式定义,可根据自身UI需求调整 const styles = StyleSheet.create({ inputStyle: { // 原有样式规则 } }) export default EnteryModal;
修复注意点:如果修改导入路径后还是报错,先清理缓存重启项目:执行
npx react-native start --reset-cache命令重启Metro打包服务,再重新运行项目即可。
内容的提问来源于stack exchange,提问作者Rcardona
相关产品推荐
相关产品推荐

