我有following sandbox

import "./styles.css";
import { useEffect, useState } from "react";

export default function App() {
  interface filter {
    company: boolean;
    gender: boolean;
  }
  const [people, setPeople] = useState<filter>({
    company: false,
    gender: false,
  });

    useEffect(() => {
    console.log(people);
  }, [people]);


  const toggleMenu = (menuItem: keyof typeof people) => {
    setPeople({ ...people, menuItem: !people[menuItem] });
  };


  return (
    <div className="App">
                    <button
                className="flex flex-row justify-center w-full"
                onClick={() => toggleMenu("company")}
              >
Click me 
</button>
    </div>
  );
}

toggleMenu的功能似乎不能正常工作.这个 idea 是传递一个任意的键(例如"company")并让它切换值.相反,我得到了以下输出:

{company: false, gender: false, menuItem: true}

我想要:

{company: true, gender: false}

我try 了上面的代码,但没有想到看到一个新的键创建在我的 map .只需要更新现有的密钥.

推荐答案

问题是您正在向people对象添加一个新键menuItem.您需要在键周围添加括号:

const toggleMenu = (menuItem: keyof typeof people) => {
  setPeople({ ...people, [menuItem]: !people[menuItem]
  });
};

我已经将你的代码重构为一个更易读的版本,并实现了修复:

import { useEffect, useState } from "react";

interface Filter {
  company: boolean;
  gender: boolean;
}

export const App = () => {
  const [filter, setFilter] = useState<Filter>({
    company: false,
    gender: false,
  });

  useEffect(() => {
    console.log(filter);
  }, []);

  const toggleMenu = (filterKey: keyof Filter) => {
    setFilter({ ...filter, [filterKey]: !filter[filterKey] });
  };

  return (
    <div className="App">
      <button
        type="button"
        className="flex flex-row justify-center w-full"
        onClick={() => {
          toggleMenu("company");
        }}
      >
        Click me
      </button>
    </div>
  );
};

Javascript相关问答推荐

为什么在集内和集外会产生不同的promise 状态(使用Promise.race)?

React Native平面列表自动滚动

使用redux-toolet DelivercThunks刷新访问令牌

vanillajs-datepicker未设置输入值,日期单击时未触发更改事件

如何最好地从TypScript中的enum获取值

每次子路由重定向都会调用父加载器函数

fs. writeFile()vs fs.writeFile()vs fs.appendFile()

在服务器上放置了Create Reaction App Build之后的空白页面

try 使用javascript隐藏下拉 Select

如何在Angular拖放组件中同步数组?

如何使用JS创建一个明暗功能按钮?

如何在DYGRAPS中更改鼠标事件和键盘输入

OnClick更改Json数组JSX中的图像源

判断函数参数的类型

如何让SVG图标在被点击和访问后改变 colored颜色 ,并在被访问后取消点击时恢复到原来的 colored颜色 ?

在Press Reaction本机和EXPO av上播放单个文件

如何调整下拉内容,使其不与其他元素重叠?

如何在不将整个文件加载到内存的情况下,在Node.js中实现Unix粘贴命令?

递归地将JSON对象的内容上移一级

使用Java脚本筛选数组中最接近值最小的所有项