javascript - React hur man använder setState med Map-värde


Jag står helt på bar backe här. Här är den relevanta koden jag har:

const TraitModal = (props) => {
const [abiltiesChecked, setAbiltiesChecked] = React.useState(new Map());
const handleAbilitiesCheck = (e) => {
        var newabilitiesCH=abiltiesChecked.set(e.target.id, e.target.checked);
        setAbiltiesChecked(newabilitiesCH);
    };
return(
<Form>
GetAbilities().map((a) => (
                                        <div key={`custom-${a}-2`}>
                                            <Form.Check
                                                custom
                                                checked={!!abiltiesChecked.get(`abilities-${a}`)}
                                                type="checkbox"
                                                id={`abilities-${a}`}
                                                label={`${a}`}
                                                onChange={handleAbilitiesCheck.bind(this)}
                                            />
                                        </div>
                                    ))}
</Form>
    );
    }


Enligt min förståelse ersätter setAbiltiesChecked(newabilitiesCH) de gamla abiltiesChecked och skulle därför få React-komponenten att renderas om, men det är inte alls vad som händer. Tillståndet uppdateras som jag märkte med några konsolloggar, men det uppdateras inte från handleAbilitiesCheck-funktionen.

Jag har en annan funktion som i princip renderar om vid en inmatning i en textruta och det triggar en omrendering av kryssrutorna, men jag behöver att de ska visa att kryssrutan faktiskt klickades på, vad är felet med min kod?

Svar #1

Ditt problem är att du muterar ditt tillståndsobjekt (ditt anrop till state ändrar det aktuella map-objektet), och sedan tilldelar det. React gör en diff på objektet, ser ingen förändring och renderar därför inte om.

I detta specifika fall, ersätt:

    var newabilitiesCH=abiltiesChecked.set(e.target.id, e.target.checked);

med

    var newabilitiesCH= new Map(abiltiesChecked).set(e.target.id, e.target.checked);

Den nya kopian ska erkännas av React som ett nytt tillstånd.