Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

199
Views
Trying to filter an array using checkboxes and useState, checkbox doesn't stay checked

i have an array, called reportsData, then i need to filter it, generating some checkboxes with each of them having a label based on each name that comes from another array (emittersData), so basically i set it like this:

const [searchUser, setSearchUser] = useState<string[]>([])

const mappedAndFiltered = reportsData
  .filter((value: any) =>
    searchUser.length > 0 ? searchUser.includes(value.user.name) : true
  )

Then i render my checkboxes like this:

function EmittersCheckboxes () {
    const [checkedState, setCheckedState] = useState(
      new Array(emittersData.length).fill(false)
    )

    const handleOnChange = (position: any, label: any) => {
      const updatedCheckedState = checkedState.map((item, index) =>
        index === position ? !item : item
      )

      setSearchUser((prev) =>
        prev.some((item) => item === label)
        ? prev.filter((item) => item !== label)
        : [...prev, label]
      ) 
      setCheckedState(updatedCheckedState)
    };

    return (
      <div className="App">
        {emittersData.map((value: any, index: any) => {
          return (
            <li key={index}>
              <div className="toppings-list-item">
                <div className="left-section">
                  <input
                    className="h-4 w-4 focus:bg-indigo border-2 border-gray-300 rounded"
                    type="checkbox"
                    id={`custom-checkbox-${index}`}
                    name={value.Attributes[2].Value}
                    value={value.Attributes[2].Value}
                    checked={checkedState[index]}
                    onChange={() => handleOnChange(index, value.Attributes[2].Value)}
                    />
                  <label className="ml-3 font-medium text-sm text-gray-700 dark:text-primary" htmlFor={`custom-checkbox-${index}`}>{value.Attributes[2].Value}</label>
                </div>
              </div>
            </li>
          );
        })}
      </div> 
    )
  }

And on the react component i am rendering each checkbox, that is a li, like:

<ul><EmittersCheckboxes /></ul>

And i render the mappedAndFiltered on the end.

Then it is fine, when i click each generated checkbox, it filters the array setting the state in setSearch user and the array is filtered.

You can check it here: streamable. com /v6bpk6 See that the filter is working, the total number of items in the array is changing based on the checkbox selected (one or more).

But the thing is that each checkbox does not become 'checked', it remains blank (untoggled).

What am i doing wrong, why doesnt it check itself?

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

You've defined your EmittersCheckboxes component inside another component. and every time that the parent component renders (by state change) your internal component is redefined, again and again causing it to lose it's internal state that React holds for you.

Here's a simplified example:

import React, { useState } from "react";

function CheckboxeComponent() {
  const [checkedState, setCheckedState] = useState(false);

  return (
    <div>
      <span>CheckboxeComponent</span>
      <input
        type="checkbox"
        checked={checkedState}
        onChange={() => setCheckedState((x) => !x)}
      />
    </div>
  );
}

export default function App() {
  const [counter, setCounter] = useState(1);

  function InternalCheckboxeComponent() {
    const [checkedState, setCheckedState] = useState(false);

    return (
      <div>
        <span>InternalCheckboxeComponent</span>
        <input
          type="checkbox"
          checked={checkedState}
          onChange={() => setCheckedState((x) => !x)}
        />
      </div>
    );
  }

  return (
    <>
      <InternalCheckboxeComponent />
      <CheckboxeComponent />
      <button onClick={() => setCounter((c) => c + 1)}>{counter}</button>
    </>
  );
}

There's the App (parent component) with its own state (counter), with a button to change this state, clicking this button will increase the counter, causing a re-render of App. This re-render redefines a new Component named InternalCheckboxeComponent every render.

The InternalCheckboxeComponent also has an internal state (checkedState).

And there's an externally defined functional component named CheckboxeComponent, with this component React is able to hold its own state, because it's not redefined (It's the same function)

If you set the state of each to be "checked" and click the button, this will cause a re-render of App, this will redefine the InternalCheckboxeComponent function, causing React to lose its state. and the CheckboxeComponent state remains in React as it's the same function.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!