我有三个按钮,当单击它们时,我想要向动态添加的选定字段添加值:

const [Fields, setFields] = useState([
 { value: [], current: true }, 
 { value: [], current: false }
]);

value-是单击按钮时要向其添加值的键

current-这些键存储当字段被点击时所选字段的状态

const [Fields, setFields] = useState([
 { value: [], current: true }, 
 { value: [], current: false }
]);

<button onClick={() => {}} data-value="A">A</button>
<button onClick={() => {}} data-value="B">B</button>
<button onClick={() => {}} data-value="C">C</button>

{Fields.map((field, i) => {
    return (
      <div key={i}>
        <div
          onClick={() => {
            setFields((oldArr) => {
              let newArr = oldArr.map((item, index) => {
                return {
                  ...item,
                  current: index === i ? true : false,
                };
              });
              return newArr;
            });
          }}
        >
          field.value <=== here need to add here the value from the buttons `data-value` on click
        </div>
      </div>
)})}

我只想在相邻键current为真的情况下将点击按钮(data-value)中的符号添加到键value.例如,如果交替单击AB,则应将AB添加到键value.

如果我们按不同的顺序点击BA,就会得到BA.

推荐答案

首先,稍微更改一下Fields的数据 struct 可能会更好.目前的 struct 增加了复杂性,但没有真正的好处.具体地说,每个对象有一个current键,但在任何给定时间,似乎只允许您拥有一个当前条目.

然而,从理论上讲,数据 struct 可能会以一种糟糕的状态结束,其中多个条目是当前的.通常,最好避免这种情况,并使用更简洁的数据 struct ,该 struct 只包含绝对最少的信息量来实现目标.这将降低复杂性,更具可读性,并减少错误的表面积.当然,旧的 struct 是完全可能的,但我们不妨边走边清理.

在本例中,您需要的最小规范数据位是值,"Current"条目的值也是index pointer.为此,我们可以使用两个状态项(请注意,存储内容的总体准确性更简洁).这将一些"不可能"状态从"可能"状态中移除.

const [currentIndex, setCurrentIndex] = useState(0);
const [Fields, setFields] = useState([
 { value: [] }, 
 { value: [] }
]);

const handleButtonClick = (e) => {
  setFields((prev) =>
    Object.assign([], prev, {
      [currentIndex]: {
        value: [...prev[currentIndex].value, e.target.dataset.value],
      },
    }),
  );
};

<button onClick={handleButtonClick} data-value="A">A</button>
<button onClick={handleButtonClick} data-value="B">B</button>
<button onClick={handleButtonClick} data-value="C">C</button>

{Fields.map((field, i) => {
    return (
      <div key={i}>
        <div
          onClick={() => setCurrentIndex(i)}
        >
          {field.value.join('')}
        </div>
      </div>
)})}

另外,请注意,在Reaction中,更常见的做法是只使用JS作用域传递"按钮值"之类的内容,而不是传递data-个属性.除非您有一个很好的理由来expose 这一点(可能会使用它来针对他们进行测试).它应该是这样的:

const [currentIndex, setCurrentIndex] = useState(0);
const [Fields, setFields] = useState([
 { value: [] }, 
 { value: [] }
]);

const appendToCurrent = (buttonValue) => {
  setFields((prev) =>
    Object.assign([], prev, {
      [currentIndex]: {
        value: [...prev[currentIndex].value, buttonValue],
      },
    }),
  );
};

<button onClick={() => appendToCurrent('A')}>A</button>
<button onClick={() => appendToCurrent('B')}>B</button>
<button onClick={() => appendToCurrent('C')}>C</button>

{Fields.map((field, i) => {
    return (
      <div key={i}>
        <div
          onClick={() => setCurrentIndex(i)}
        >
          {field.value.join('')}
        </div>
      </div>
)})}

Reactjs相关问答推荐

InfiniteScroll持续获取数据,直到超过最大更新深度

如何使用json将购物车数组传递到后台API

如何使用React防止并发注册并处理Firestore数据库中的插槽可用性

有没有方法覆盖NextJS 14中的布局?

关于同一位置的不同组件实例的react S规则被视为相同组件

使用REACT-RUTER-DOM链接仅更新一个搜索参数

useState导致对函数的无休止调用

如何在我的 React 应用程序中仅显示我的 Register 组件

我从 S3 存储桶下载图像时收到错误

ReactJS 共享上下文

如何在react 中过滤数组的数组?

useEffect内部的RETURN语句在首次按钮点击事件中似乎无效的原因是什么?

无法读取未定义的属性(阅读 'editQuoteModalShown')reactredux

如何通过 React JS 中的映射将新元素添加到对象数据数组中

如何在 MUI 数据网格中的 renderCell 组件之间传递状态

React Router v6 - 访问嵌套路由和处理手写 url 的正确方法

如何使用 cypress 获取 MUI TextField 的输入值?

如何在 Reactjs 中判断受保护路由上的用户角色?

如何在 React 中制作动画?

如何在 NavBar 中设置动态标题