将状态更改应用于 React 中数组的特定索引

Posted

技术标签:

【中文标题】将状态更改应用于 React 中数组的特定索引【英文标题】:Applying state change to specific index of an array in React 【发布时间】:2022-01-22 19:07:56 【问题描述】:

喂!带着一个菜鸟问题再次回到它!

所以我从 API 获取数据来呈现一个测验应用程序,我正在努力使用一个简单的(我认为)函数: 我有一个包含 4 个答案的数组。该数组呈现 4 个 div(因此我的答案每个都可以有一个单独的 div)。我想更改点击的 div 的颜色,以便稍后验证点击的 div 是否是好的答案。

问题是当我点击时,整个答案数组(4 个 div)都在改变颜色。

我怎样才能做到这一点?

我对我正在渲染的 div 做了类似的事情:

const [on, setOn] = React.useState(false);

  function toggle() 
    setOn((prevOn) => !prevOn);
  

  const styles = 
    backgroundColor: on ? "#D6DBF5" : "transparent",
  ;

我将在文章末尾提供组件的完整代码和我正在使用的 API 链接,因此如果需要,您可以查看我是如何渲染整个内容的。

可能是因为 API 缺少其对象的“on”值?我尝试为每个项目分配一个布尔值,但我似乎无法使其工作。

提前感谢您的帮助!

整个组件:

import React from "react";
import  useRef  from "react";

export default function Quizz(props) 
  const [on, setOn] = React.useState(false);

  function toggle() 
    setOn((prevOn) => !prevOn);
  

  const styles = 
    backgroundColor: on ? "#D6DBF5" : "transparent",
  ;

  function shuffleArray(array) 
    for (let i = array.length - 1; i > 0; i--) 
      let j = Math.floor(Math.random() * (i + 1));
      let temp = array[i];
      array[i] = array[j];
      array[j] = temp;
    
    return array;
  

  let answers = props.incorrect_answers;

  const ref = useRef(false);
  if (!ref.current) 
    answers.push(props.correct_answer);

    shuffleArray(answers);
    ref.current = true;
  

  const cards = answers.map((answer, key) => (
    <div key=key className="individuals" onClick=toggle style=styles>
      answer
    </div>
  ));

  console.log(answers);
  console.log(props.correct_answer);

  return (
    <div className="questions">
      <div>
        <h2>props.question</h2>
      </div>
      <div className="individuals__container">cards</div>
      <hr />
    </div>
  );


我正在使用的 API 链接:“https://opentdb.com/api.php?amount=5&category=27&type=multiple”

【问题讨论】:

【参考方案1】:

由于您的答案在每个测验中都是唯一的,因此您可以将它们用作 id,而不是将 boolean 值保留在状态中,您可以将所选答案保留在状态中,并且当您想要呈现您的JSX 您可以检查状态是否与当前答案相同,如果是,则可以像这样更改它的背景:

function Quizz(props) 
  const [activeAnswer, setActiveAnswer] = React.useState('');
  function toggle(answer) 
    setActiveAnswer(answer);
  
  ...
  const cards = answers.map((answer, key) => (
    <div key=key
         className="individuals"
         onClick=()=> toggle(answer)
         style=background: answer == activeAnswer ? "#D6DBF5" : "transparent" >
         answer
    </div>
));
  ...

【讨论】:

天哪!感谢您的快速答复人!它确实有效,它就像我想的一样简单哈哈,我知道我做了一些有点傻的事情,但我不知道是什么!再次感谢,祝您有美好的一天! 不客气。

以上是关于将状态更改应用于 React 中数组的特定索引的主要内容,如果未能解决你的问题,请参考以下文章

在 React 中访问数组索引

更改特定索引而不在 Vuejs 中重新渲染整个数组

如何从 DOM 中删除数组的选定索引并反映 React 状态的变化?

在VUE js中获取数组中数据的索引

访问数组的索引返回未定义

通过索引选择数组中的项目,同时使用 React 钩子