Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

201
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda