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

180
Vistas
location.search no se actualiza correctamente - React - ReactRouterDomV5

En el componente funcional de mi aplicación, defino una función que debe llamarse una vez que el usuario hace clic en el botón de búsqueda en el componente funcional de mi MainHeader .

 function App(props) { const location = useLocation(); const [movies, setMovies] = useState(DUMMY_MOVIES); const filterMovies = () => { console.log(location.search); } return ( <MainHeader onFilterMovies={filterMovies}> <Switch> <Route path="/" exact> <Redirect to="/movies" /> </Route> <Route path="/movies" exact> <Movies movies={movies} /> </Route> <Route path="/movies/:movieId"> <MovieDetails /> </Route> </Switch> </MainHeader> ); }

En el componente MainHeader hay un controlador de envío que se ejecutará una vez que el usuario haga clic en el botón de búsqueda, y allí (SubmitHandler) agrego searchTerm como clave y searchTermValue como el valor del parámetro de consulta y reemplazo la página con location.replace(`/movies?searchTerm=${searchTermValue}`) . ¡Y finalmente llamo a OnFitlerMovies que recibo de los props para informar al componente de la App que hemos terminado!

En el componente funcional de la App donde defino la función FiltrerMovies , simplemente registro el valor del parámetro de consulta en la consola.

Pero la bruja de valor que recibo es el valor anterior del parámetro de consulta. Me refiero a que cuando ingreso something en la entrada de búsqueda y luego hago clic en el botón Buscar, lo recibo en el método FilterMovies como una cadena vacía, pero la próxima vez, incluso si no ingreso nada (me refiero a una cadena vacía), el valor correcto para ¡La hora anterior se registra!

 const MainHeader = (props) => { const history = useHistory(); const searchTermInputRef = useRef(); const submitHandler = (e) => { e.preventDefault(); const searchTermValue = searchTermInputRef.current.value.trim(); history.replace(`/movies?searchTerm=${searchTermValue}`); props.onFilterMovies(); }; ...

Supongo que no podemos usar ganchos ReactRouterDomV5 dentro de un componente que no está en el componente Route .

Ahora, ¿cómo puedo resolver este problema?

about 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Tema

La devolución de llamada de filterMovies tiene un cierre obsoleto sobre el valor de location.search , por lo que verá el valor obsoleto.

Solución

Use un useEffect para registrar el valor actualizado de location.search .

Ejemplo:

 useEffect(() => { console.log(location.search); }, [location.search]);

Si desea utilizar el parámetro querySearch para filtrar el estado de las movies antes de pasarlo al componente Movies , hágalo en línea.

Ejemplo:

 function App() { const location = useLocation(); const [movies, setMovies] = useState(DUMMY_MOVIES); const searchParams = new URLSearchParams(location.search); const searchTerm = searchPararms.get("searchTerm"); useEffect(() => { console.log(location.search); }, [location.search]); return ( <MainHeader> <Switch> <Route path="/" exact> <Redirect to="/movies" /> </Route> <Route path="/movies" exact> <Movies movies={movies.filter(movie => { if (searchTerm) { return movie.name.toLowerCase().includes(searchTerm.toLowerCase()); } return true; })} /> </Route> <Route path="/movies/:movieId"> <MovieDetails /> </Route> </Switch> </MainHeader> ); }

Si desea mejorar el rendimiento, utilice el gancho useMemo para memorizar el valor de las películas filtradas.

Ejemplo:

 const location = useLocation(); const [movies, setMovies] = useState(DUMMY_MOVIES); const searchParams = new URLSearchParams(location.search); const searchTerm = searchPararms.get("searchTerm"); const filteredMovies = useMemo(() => { return movies.filter(movie => { if (searchTerm) { return movie.name.toLowerCase().includes(searchTerm.toLowerCase()); } return true; } }, [movies, searchTerm]); ... <Route path="/movies" exact> <Movies movies={filteredMovies} /> </Route>
about 4 years ago · Santiago Trujillo 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