I have a data and want to create checkboxes.
By default all fields should be checked and when I will uncheck one of the filed I should know which one is uncheked and update the filter data (remove unchecked field).
I'm using the ordinary checkbox but here I cant know which checkbox is checked or not.
I tried with checkboxgroup too but in the checkboxgroup you should define Here is the Code example.
https://codesandbox.io/s/check-all-antd-5-0-7-forked-8bm54o?file=/demo.tsx
CodePudding user response:
This is a basic example, which can give you more control
const data = [
{
id: 0,
title: "User ID",
key: "userId",
checked: true
},
{
id: 1,
title: "Description",
key: "description",
checked: true
},
{
id: 2,
title: "Surname",
key: "surname",
checked: true
},
{
id: 3,
title: "Name",
key: "name",
checked: true
}
];
const App: React.FC = () => {
const [items, setItems] = useState(data);
const onChange = (item: any, e: CheckboxChangeEvent) => {
console.log(`checked = ${e.target.checked}`, item);
const checked = e.target.checked;
setItems((checks) => {
return checks?.map((e) => (e.id === item.id ? { ...e, checked } : e));
});
};
return (
<>
{items.map((item, i) => {
return (
<div key={i}>
<Checkbox
checked={item.checked}
onChange={(e) => onChange(item, e)}
>
{item.title}
</Checkbox>
</div>
);
})}
</>
);
};
Hope it helps
CodePudding user response:
The easiest way is to add a checked property to your data object, and use it instead of Checkbox's one, so simply import useState() from React and do as following:
import React, { useState } from "react";
import "./index.css";
import { Checkbox } from "antd";
const App: React.FC = () => {
const [data, setData] = useState<any[]>([
{
id: 0,
title: "User ID",
key: "userId",
checked: true
},
{
id: 1,
title: "Description",
key: "description",
checked: true
},
{
id: 2,
title: "Surname",
key: "surname",
checked: true
},
{
id: 3,
title: "Name",
key: "name",
checked: true
}
]);
const onChange = (item) =>
setData([...data.filter(e => e.id !== item.id), { ...item, checked: !item.checked }]);
return (
<>
{data.map((item) => (
<Checkbox
key={item.id}
checked={item.checked}
onChange={() => onChange(item)}
>
{item.title}
</Checkbox>
))}
</>
);
};
export default App;
Note that it's better to use your data's id as key in map() instead of map()'s index if you need to sort or modify your checkboxes' order, see more here
