Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

321
Visualizações
Cómo solucionar el problema del filtro de datos en el evento onChange en react.js

Tengo una función que filtra los datos sobre los eventos de cambio. Funciona bien en lo que respecta a la filtración, pero el problema es con el evento onChange y setState

Estoy usando React Select para dar el valor onChange:

 <Select id="status" isClearable={false} options={statusOptions} defaultValue={statusOptions[0]} onChange={(choice) => handleStatusFilter(choice.value)} />

Aquí las opciones de estado son:

 const statusOptions = [ { value: '', label: 'Clear' }, { value: 'draft', label: 'Draft' }, { value: 'ready', label: 'Ready' }, { value: 'expired', label: 'Expired' }, ]

Ahora el evento onChange estoy llamando al handleStatusFilter :

 // state const [status, setStatus] = useState('') // ** handleStatusFilter // ** Function to handle status filter const handleStatusFilter = (value) => { let updatedData = [] const dataToFilter = () => { if (title.length || type.length || createdAt.length || createdBy.length || status.length) { return filteredData } else { return results } } setStatus(value) if (value.length) { updatedData = dataToFilter().filter((item) => { const startsWith = item.status.toLowerCase().startsWith(value.toLowerCase()) const includes = item.status.toLowerCase().includes(value.toLowerCase()) if (startsWith) { return startsWith } else if (!startsWith && includes) { return includes } else return null }) setFilteredData([...updatedData]) setStatus(value) } }

Por lo tanto, funciona la primera vez que el usuario selecciona cualquier opción, pero no al cambiar su selección después de eso. Por ejemplo; los datos se filtran cuando el usuario selecciona la opción draft . Pero cuando pasa directamente de draft a ready , no funciona, y si el usuario borra el estado presionando la opción Clear de statusOptions , y luego el usuario selecciona ready , entonces los datos se filtran con este valor correctamente.

Supongo que debería haber una forma de borrar el valor en Cambiar en lugar de Borrar manualmente seleccionando la cadena vacía. Entonces, cómo contrarrestar este problema, ¿hay algún mejor enfoque a seguir, en lugar del método setState?

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

El problema es más o menos con esta condición aquí:

 const dataToFilter = () => { if (title.length || type.length || createdAt.length || createdBy.length || status.length) { return filteredData } else { return results } }

Probablemente devuelve results en la primera selección porque todos los valores en la condición son falsos. Seguro que status.length es 0 y, por lo tanto, es falsy . A partir de ese momento, siempre devuelve filteredData , ya que status.length es veraz. Obviamente, los valores filtrados ya no incluyen los otros valores. Entonces, independientemente de lo que seleccione, siempre volverá a filtrar los datos filtrados.

En su lugar, debe filtrar los results del valor original en cada selección.

 updatedData = results.filter( // here use results instead of filtered values. (item) => { const startsWith = item.status.toLowerCase().startsWith(value.toLowerCase()) const includes = item.status.toLowerCase().includes(value.toLowerCase()) /** besides that, this can be simplified if (startsWith) { return startsWith } else if (!startsWith && includes) { return includes } else return null })**/ return startsWith || includes

Edit1: Lo que dije anteriormente no está mal, pero no considera los otros filtros. Entonces, en general, está restringiendo sus resultados para que no puedan filtrarse más. En su lugar, debe aplicar todos los filtros en la misma función de filtro para filtrar los valores. Aquí hay un codesandbox con un ejemplo completo.

Usé un useEffect para eso y una simple selección de html para la demostración. Pero puede aplicar eso fácilmente a su código.

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda