My click handler is firing twice with different values in React

Viewed 364

I can't for the life of me figure out why my onClick handler is being called twice...

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

export const AllModels = ({
  label,
  name,
  checked,
  handleSelectAll
}: {
  label: string;
  name: string;
  checked: boolean;
  handleSelectAll: () => void;
}) => {
  return (
    <div>
      <div className="checkbox" onClick={handleSelectAll}>
        <input
          className="checkbox-input"
          id="all-models"
          type="checkbox"
          name={name}
          value={`${checked}`}
        />
        <label className="label label--checkbox" htmlFor="all-models">
          <span className="label-title">{label}</span>
        </label>
      </div>
    </div>
  );
};

export const App = (): React.ReactElement => {
  const [allModelsChecked, setAllModelsChecked] = useState<boolean>(false);

  const handleSelectAll = (): void => {
    console.log({ allModelsChecked });
    if (allModelsChecked) {
      setAllModelsChecked(false);
    } else {
      setAllModelsChecked(true);
    }
  };

  return (
    <AllModels
      label="All Models"
      name="allModels"
      checked={allModelsChecked}
      handleSelectAll={handleSelectAll}
    />
  );
};

The console log is showing

{allModelsChecked: false}
{allModelsChecked: true}

I am running React.StrictMode, but I don't believe I am mutating state as far as I can tell.

Working example: https://codesandbox.io/s/quizzical-tree-gzofx?file=/src/App.tsx

1 Answers

Input type=checkbox accept checked prop for input tag. Change the value to checked and that will fix the problem

<input
 className="checkbox-input"
 id="all-models"
 type="checkbox"
 name={name}
 // value={`${checked}`}
 checked={checked}
/>

you can see the chain of event logs in this codesandbox

Related