如何在 Map 函数中使用 React Toggle

Posted

技术标签:

【中文标题】如何在 Map 函数中使用 React Toggle【英文标题】:How to Use React Toggle Inside Map Function 【发布时间】:2021-12-30 17:26:27 【问题描述】:

我正在尝试在地图功能中使用切换。我以为我明白了,但我的逻辑显然有问题。当我点击地图中的一些切换项目时,我必须点击它们两次才能看到变化。当我将一项切换为真,然后立即将另一项切换为真时,似乎会发生这种情况。提前感谢您的帮助。

这里是 CodeSandbox:https://codesandbox.io/s/nice-hertz-srgew

还有代码:

import React,  useState, useEffect  from "react";
import axios from "axios";
import "./styles.css";

export default function App() 
  const [people, setPeople] = useState([]);
  const [prodToggle, setProdToggle] = useState(false);
  const [partToggle, setPartToggle] = useState(false);

  useEffect(() => 
    axios.get("./data.json").then((res) => 
      setPeople(res.data.people);
    );
  , []);

  const onAddProdSelect = () => 
    const updatedProdToggle = !prodToggle;
    setProdToggle(updatedProdToggle);
  ;

  const onAddPartSelect = (i) => 
    const updatedToggle = !partToggle;
    setPartToggle(updatedToggle);
    const updatedData = people.map((item, idx) => 
      if (idx === i) 
        return 
          ...item,
          itemPartToggle: updatedToggle
        ;
      
      return item;
    );
    setPeople(updatedData);
  ;

  return (
    <main>
      <div onClick=() => onAddProdSelect()>
        <p>prodToggle ? "Red" : "Blue"</p>
      </div>
      people.map((person, i) => (
        <div onClick=() => onAddPartSelect(i) key=i>
          <p>person.itemPartToggle ? person.name : person.age</p>
        </div>
      ))
    </main>
  );

【问题讨论】:

【参考方案1】:

您的问题是您通过拥有partToggle 状态与您的所有人员对象共享一个切换状态。相反,保持每个对象的切换状态(就像您当前对 itemPartToggle 所做的那样),并使用它来确定您单击的特定对象的切换值应该更改为什么:

const onAddPartSelect = (i) => 
    const updatedData = people.map((item, idx) => 
      if (idx === i) 
        return 
          ...item,
          itemPartToggle: !item.itemPartToggle // use the flipped version of the current toggle state for the current item
        ;
      
      return item;
    );
    setPeople(updatedData);
;

请看下面的例子:

const  useState, useEffect  = React;

function App() 
  const [people, setPeople] = useState(["id":"1","name":"Bob","age":"21","id":"2","name":"Ed","age":"45","id":"3","name":"Mary","age":"32","id":"4","name":"Tom","age":"76"]); // hardcoding data for example
  const [prodToggle, setProdToggle] = useState(false);

  const onAddProdSelect = () => 
    const updatedProdToggle = !prodToggle;
    setProdToggle(updatedProdToggle);
  ;

  const onAddPartSelect = (i) => 
    const updatedData = people.map((item, idx) => 
      if (idx === i) 
        return 
          ...item,
          itemPartToggle: !item.itemPartToggle
        ;
      
      return item;
    );
    setPeople(updatedData);
  ;

  return (
    <main>
      <div onClick=() => onAddProdSelect()>
        <p>prodToggle ? "Red" : "Blue"</p>
      </div>
      people.map((person, i) => (
        <div onClick=() => onAddPartSelect(i) key=i>
          <p>person.itemPartToggle ? person.name : person.age</p>
        </div>
      ))
    </main>
  );


ReactDOM.render(<App />, document.body);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js"></script>

【讨论】:

以上是关于如何在 Map 函数中使用 React Toggle的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Map 函数中使用 React Toggle

如何只修改 react .map 函数中的一个元素?

使用 map 函数在 React 中传递道具

如何通过 map 函数有条件地使用 React 和 Firebase 渲染元素?

如何在 React 中修复“TypeError:results.map 不是函数”

如何使用 Power Query 从 Toggl API 中提取数据?