解决React Native中useState报错:setSelectedImage不是函数
问题解决:useState报错setSelectedImage不是函数
错误根源
你在App.js中错误使用对象解构获取useState的返回值:
const { selectedImage, setSelectedImage } = useState(null);
useState返回的是有序数组,而非对象。对象解构会导致setSelectedImage未被正确赋值为状态更新函数,调用时自然触发“不是函数”的错误。
修复方案
将useState的解构语法改为数组解构:
const [selectedImage, setSelectedImage] = useState(null);
修复后的完整App.js代码
import { StatusBar } from 'expo-status-bar'; import { useState } from 'react'; import { StyleSheet, View } from 'react-native'; import Button from './components/Button'; import ImageViewer from './components/ImageViewer'; import * as ImagePicker from 'expo-image-picker'; const PlaceholderImage = require('./assets/images/background-image.png'); export default function App() { // 改为数组解构,正确获取状态和更新函数 const [selectedImage, setSelectedImage] = useState(null); const pickImageAsync = async () => { let result = await ImagePicker.launchImageLibraryAsync({ allowsEditing: true, quality: 1, }); if (!result.canceled) { setSelectedImage(result.assets[0].uri); } else { alert('You did not select any image.'); } }; return ( <View style={styles.container}> <View style={styles.imageContainer}> <ImageViewer placeholderImageSource={PlaceholderImage} selectedImage={selectedImage} /> </View> <View style={styles.footerContainer}> <Button theme="primary" label="Choose a photo" onPress={pickImageAsync} /> <Button label="Use this photo" /> </View> <StatusBar style="auto" /> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#25292e', alignItems: 'center', }, imageContainer: { flex: 1, paddingTop: 58, }, footerContainer: { flex: 1 / 3, alignItems: 'center', }, });
补充说明
React内置Hook(如useState、useEffect)的返回值都是有序数组,数组元素顺序固定:第一个是状态值,第二个是状态更新函数。必须通过数组解构按顺序获取,不能用对象解构——因为数组元素没有对应的键名,对象解构无法匹配到正确的值。
内容的提问来源于stack exchange,提问作者user23555515
相关产品推荐
相关产品推荐

