开发者问题收集

React Native - 管理复选框状态

2021-09-20
130

我想制作一个测验应用程序。

用户按下“提交”按钮后,将检查问题。

因此,问题最终将 一次性 全部检查。

我需要 保存每个问题 的用户选择 (答案),然后在提交时检查它们。

我在考虑这个:

let [currentQuestionIndex, setCurrentQuestionIndex] = useState(0);
let [userAnswers, setUserAnswers] = useState([] as any);

  function answerClick(value: any, key: any) {
    // console.log('answer clicked');
    userAnswers[currentQuestionIndex][key] = value; 
    // TypeError: undefined is not an object (evaluating 'userAnswers[currentQuestionIndex][key] = value')
  }

我为问题中的每个可能答案选中的复选框:

<BouncyCheckbox
   key={index}
   onPress={(value) => {
      answerClick(value, index);
   }}
   text={answer.title}
/>

但是我得到

TypeError: undefined is not an object (evaluating 'userAnswers[current][key] = value')

单击答案

setUserAnswers() userAnswers[currentQuestionIndex][key] = value 等同的内容是什么?

为什么会出现未定义的错误?

如何做到这一点,请帮助我头很痛。

2个回答

您正尝试访问数组中不存在的索引。

userAnsqers = [];
currentQuestionIndex = 0;
// userAnswers[currentQuestionIndex] === undefined

您正尝试做的是将 { 延迟添加到数组中(仅在需要时)。这将起作用:

function answerClick(value: any, key: any) {
  setUserAnswers(latest => {
    const out = [...latest];
    while (out.length <= currentQuestionIndex) out.push({});
    out[currentQuestionIndex][key] = value;
    return out;
  })
}

对于 userAnswers[currentQuestionIndex][key] = value ,没有与 setUserAnswers() 等效的东西( 参见 )。您可能会发现一些自定义钩子来管理数组或构建自己的数组。

Newbie
2021-09-20

首先, userAnswers 应该包含您要更改的所有内容的键和值。您得到未定义的原因是因为您试图定位 userAnswers 数组中无法找到的对象。此外,您正在直接修改 userAnswers 状态,这确实是错误的。这就是 setUserAnswers 的用途。您可以改为这样做。

function answerClick(value: any, key: any) {
    // console.log('answer clicked');
    setUserAnswers([
        ...usersAnswers,
        {[key]: [value]}
    ]);
  }
Uchechukwu Nwafor
2021-09-20