You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native答题App状态未定义报错处理及优化方案咨询

问题解决与优化方案

一、先解决当前「Cannot read property 'key' of undefined」错误

错误核心:allselectedOption是数组结构,你用allselectedOption[item.Quetion_Number]直接按索引取值时,若没有对应项会得到undefined,后续访问.key就触发类型错误。

修改QuestionApi里的逻辑,先匹配对应题目选中项再处理:

const QuestionApi = async () => {
    const response = await fetch('api.php?table=demo');
    const data = await response.json();
    setAllQuestion(data);
    
    try {
        const result = data?.map((item) => {
            // 先找到当前题目对应的选中记录
            const matchedOption = allselectedOption.find(opt => opt.key === item.Quetion_Number);
            return {
                ...item,
                selectedOP: matchedOption ? 
                    // 存在则判断答案是否正确
                    matchedOption.values === item.correct_option : 
                    // 不存在则标记为未作答
                    null
            }
        })
        console.log(result)
    } catch (e) {
        console.log(e)
    }
}

二、现有代码的优化方案

1. AsyncStorage 异步逻辑重构

原回调嵌套写法可读性差,换成Promise风格更简洁,同时把数组转成对象格式,后续查找效率更高:

// evalutionmode.js 代码修改
const [selectedOption, setSelectedOption] = useState({});

useEffect(() => {
    const loadSelectedOptions = async () => {
        try {
            const keys = await AsyncStorage.getAllKeys();
            const stores = await AsyncStorage.multiGet(keys);
            // 转成键值对对象,键为题目编号,值为选中选项
            const optionObj = stores.reduce((acc, [key, value]) => {
                acc[key] = value;
                return acc;
            }, {});
            setSelectedOption(optionObj);
        } catch (err) {
            console.error('加载选中选项失败:', err);
        }
    };
    loadSelectedOptions();
}, []);

2. 结果页状态与逻辑优化

  • 接收对象格式的选中项,避免数组遍历查找的低效问题
  • 修正useEffect无效依赖(原[1]会导致重复执行,换成空依赖只执行一次)
  • 简化答案判断逻辑

修改QuizResult.js:

const QuizResult = ({ navigation, route }) => {
    // 接收对象格式的选中项数据
    const [allselectedOption, setAllselectedOption] = useState(route.params.selectedOP);
    const [allQuestion, setAllQuestion] = useState([]);

    useEffect(() => {
        QuestionApi();
    }, []);

    const QuestionApi = async () => {
        const response = await fetch('api.php?table=demo');
        const data = await response.json();
        setAllQuestion(data);
        
        const result = data?.map((item) => ({
            ...item,
            // 直接通过题目编号快速获取选中值,不存在则标记未作答
            selectedOP: allselectedOption[item.Quetion_Number] ? 
                allselectedOption[item.Quetion_Number] === item.correct_option : 
                null
        }));
        console.log(result);
    }

    // 后续渲染逻辑...
}

3. 额外注意事项

  • 统一存储键的格式:把题目编号转成字符串存储到AsyncStorage,避免数字/字符串类型不匹配导致查找失败
  • 跳转结果页前加加载状态:确保AsyncStorage数据加载完成再跳转,避免结果页拿到空数据
  • 修正拼写错误:salectedOption→selectedOption、nevigation→navigation、Quetion_Number→Question_Number,避免隐性bug

内容的提问来源于stack exchange,提问作者Sagar Gangwani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:31:35