选中复选框时,我需要创建此类对象

{
"targets": [
    {
      "kind": "foo",
      "channelId": "-897",
      "quote": "true",
      "gatewayName": "bbb"
    },{
      "kind": "bar",
      "channelId": "-1123",
      "quote": "true",
      "gatewayName": "aaa"
     }
   ]
}

我给我的朋友们准备了这个片断

{gateways ? gateways.map((g) => {

            return (
              <Tooltip
                key={g.name}
                content={`${g.name} - ${g.kind}`}
              >

                <Switch
                  key={g.name}
                  id={g.name}
                  label={g.name}
                  name={g.name}
                  value={`{"kind":"${g.kind}","channelId":"${g.channelId}","gatewayName":"${g.name}","quote":"true"}`}
                  labelProps={{
                    className: "text-sm font-normal text-blue-gray-500",
                  }}
                  onChange={handleCheckboxChange}
                />
              </Tooltip>
            )

}) : "Loading..."}

我创造了这个国家

  const [checkboxes, setCheckboxes] = useState([]);

我正在try 创建HandleCheckboxChange

 const handleCheckboxChange = (e) => {
    const { name, checked, value } = e.target;

  
    if(checked){
      setCheckboxes(prev => ({ 
        targets: [prev.targets,JSON.parse(value)]
      }))
    }else{
      setCheckboxes(prev => ({ 
        targets: prev.filter(target => target !== JSON.parse(value))
      }))
    }

    console.log(checkboxes)
  };

但当我选中第一个复选框时,数组中有两个元素,第一个元素是未定义的. 当我取消选中时,我收到以下错误

TypeError: prev.filter is not a function

推荐答案

如果选中输入,则返回到您所在的州:

{ targets: [prev.targets, JSON.parse(value)] }

这是一个对象,所以状态不再是数组,这就是为什么

TypeError:Prev.Filter不是函数

当您try 取消选中

但是,由于您的状态被初始化为[],所以第一个判断操作不会找到prev.targets,这就是它是undefined的原因

如果我理解正确的话,您希望存储一个对象数组,那么为什么您希望自己的状态是一个只有一个前置操作targets的对象,其中包含一个数组呢?您只需将其设置为数组,您就知道它表示的是目标:

if (checked) {
  setCheckboxes((prev) => [...prev, JSON.parse(value)]);
} else {
  setCheckboxes((prev) =>
    prev.filter((target) => JSON.stringify(target) !== JSON.stringify(JSON.parse(value)))
  );
}

你必须用JSON.stringify来比较两个对象,否则结果总是false.


但如果你坚持,你要做的就是以这种方式初始化你的状态:

const [checkboxes, setCheckboxes] = useState({ targets: [] }); // make the property targets exist by default

并且您的代码没有问题,您只需更改以下行:

targets: prev.filter(target => target !== JSON.parse(value)) // prev is an object while prev.target is what you need

使用

targets: prev.targets.filter((target) => JSON.stringify(target) !== JSON.stringify(JSON.parse(value)))

Reactjs相关问答推荐

如何在Pivot模式下自定义标题?

如何在useEffect中使用useParams()

为什么我的标签在Redux API中不能正常工作?

如何使用next.js以DOM为目标在映射中使用Ref

Reactjs中的chartjs和reaction-chartjs-2的问题

同一文件中前端和后端的Nginx配置

如何从Reaction-Arborist树获取排序数据

在React中映射对象数组时,如何正确呈现JSX.Element或React.ReactNode类型?

StrictMode+SetInterval=双重渲染(即使使用useEffect清理)

在 React 中,如何在指向同一组件的路由中拥有未定义数量的多个动态路径段?

React中的功能性组件克隆优化

React - 将一个充满空值的无限大小的数组存储在 ref 中是否可以,或者我应该重置数组吗?

React:如何使用条件渲染和react 挂钩来更新另一个组件的状态?

将 clerk 与 supabase 集成的最佳实践

React v6 中的公共和私有路由

使用带有搜索字符串的全局过滤器时如何在 React-Table 中进行精确匹配?

更新和删除功能不工作 Asp.net MVC React

如何使图标适合 react-bootstrap 中的行元素

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

React中`onScroll`和`onScrollCapture`之间的区别?