I decided to try using an object/array in place of a set. It should be noted that with objects insertion order is not always preserved. But if you have a number of dynamically generated checkboxes and you receive a change event:
// set
function handleChange(e, name) {
setSet(prv => e.target.checked
? new Set([...prv, name])
: new Set([...prv].filter(v => v != name)));
}
// object
function handleChange(e, name) {
setSet(prv => ({...prv, [name]: e.target.checked}));
}
// array
function handleChange(e, name) {
setSet(prv => e.target.checked
? (prv.includes(text) ? prv : [...prv, text])
: prv.filter(v2 => v2 != v));
}
Initialize:
const [set, setSet] = useState(new Set);
const [set, setSet] = useState({});
const [set, setSet] = useState([]);
Add:
setSet(prv => new Set([...prv, text]));
setSet(prv => ({...prv, [text]: true}));
setSet(prv => prv.includes(text) ? prv : [...prv, text]);
Remove:
setSet(prv => new Set([...prv].filter(v2 => v2 != v)));
setSet(prv => ({...prv, [v]: false}));
setSet(prv => prv.filter(v2 => v2 != v));
Iterate:
[...set].map(v => ...);
Object.keys(set).filter(v => set[v]).map(v => ...);
set.map(...);
The code sandbox.