Cómo pasar datos de una página a otra usando el enrutador de reacción
Por favor, necesito ayuda con reaccionar-router-dom, soy nuevo en la biblioteca y parece que puedo encontrar alguna solución desde entonces. Obtengo tres resultados de una llamada a la API, en la que asigno los datos para representarlos en la interfaz de usuario, ahora lo que necesito es que si hago clic en una fila en una de esta lista, quiero que me lleve a una pantalla que muestra los detalles de solo esa cosa en la que hice clic.
import React, { Component } from "react";
export default class User extends Component {
state = { userDetails: "" };
componentDidMount() {
axios.get(`https://urlforapi.com`)
.then(({ data }) => {
this.setState({
userDetails: data
});
});
}
render() {
const { userDetails } = this.state;
return (
<div>
{userDetails
? userDetails.map(info => {
return (
<Link to="/home/userDetails">
<div key={info.id}>
<p>{info.name}</p>
</div>
<div>
<p>{info.age}</p>
</div>
<div>
<p>{info.description}</p>
</div>
</Link>
);
})
: null}
</div>
);
}
}
Opción 1: Estado de la ruta del pase
Envía el estado en la transición de ruta.
Usando
react-router-dom
v6Navegación declarativa: vincular o navegar componentes
La API de enlace cambió un poco en la versión 6,
state
ahora es un accesorio.<Link to='/home/userDetails' state={{ infoId: info.id }} >
o utilizando el
Navigate
componente, el sucesor espiritual/reemplazo delRedirect
componente v5<Navigate to="/home/userDetails" state={{ infoId: info.id }} />
Navegación imperativa: use el gancho de navegación
const navigate = useNavigate(); ... navigate('/home/userDetails', { state: { infoId: info.id } });
Luego puede descomprimir el estado del
location
objeto en el componente que devuelve esa ruta. Utilice protecciones en caso de que un usuario haya navegado'/home/userDetails'
desde otro lugar, ya questate
puede no estar definido.const { state: { infoId } = {} } = useLocation();
Usando
react-router-dom
v5Navegación declarativa: enlace a
Puede pasar algún estado exclusivo de la entrada asignada, como
info.id
junto con el envío de ruta que ocurre cuando se hace clic en el enlace. Esto confunde los datos del usuario, ya que no se filtra información a la interfaz de usuario (es decir, al navegador).<Link to={{ pathname: '/home/userDetails', state: { infoId: info.id }, }} >
Navegación imperativa: gancho useHistory
const history = useHistory(); ... history.push({ pathname: '/home/userDetails', state: { infoId: info.id }, });
Luego puede descomprimir el estado de la
location
propiedad/objeto en el componente que devuelve esa ruta. Utilice protecciones en caso de que un usuario haya navegado'/home/userDetails'
desde otro lugar, ya questate
puede no estar definido.Si se pasan los accesorios de ruta:
props.location && props.location.state && props.location.state.infoId
o
props.location?.state?.infoId
Si usa componentes de función, también puede usar el
useLocation
gancho React:const { state: { infoId } = {} } = useLocation();
Opción 2: pasar algo en la ruta URL
<Link to={`/home/userDetails/${info.id}`>
o (RRDv6)
const navigate = useNavigate();
...
navigate(`/home/userDetails/${info.id}`);
o (RRDv5)
const history = useHistory();
...
history.push(`/home/userDetails/${info.id}`);
Y recupere el parámetro de la match
propiedad en el componente de ruta devuelto. Por ejemplo, si la ruta se ve así:
Usando
react-router-dom
v6<Route path="/home/userDetails/:infoId" element={<Detail />} />
Solo existe el
useParams
gancho en v6, no hay accesorios de ruta.const { infoId } = useParams();
El usuario puede ver esto, pero no es necesario usar el patrón de protección para acceder, ya que, según las definiciones, estará definido por la ruta (aunque infoID
aún se puede definir si el usuario ingresa una identificación no válida).
Usando
react-router-dom
v5<Route path="/home/userDetails/:infoId" component={Detail} />
Luego, en el componente, obtenga la identificación de la
match
propiedad de ruta:props.match.params.infoId
Y en el caso de los componentes de funciones, el
useParams
gancho de React:const { infoId } = useParams();
Opción 3: pasar algo en la cadena de consulta URL
Usando
react-router-dom
v6Navegación declarativa: vincular o navegar componentes
La API de enlace cambió un poco en la versión 6,
state
ahora es un accesorio.<Link to={{ pathname: '/home/userDetails', search: `?infoId=${info.id}`, }} >
o utilizando el
Navigate
componente, el sucesor espiritual/reemplazo delRedirect
componente v5<Navigate to={{ pathname: '/home/userDetails', search: `?infoId=${info.id}`, }} />
Navegación imperativa: use el gancho de navegación
const navigate = useNavigate(); ... navigate({ pathname: '/home/userDetails', search: `?infoId=${info.id}`, });
Luego puede descomprimir el
infoId
parámetro de consulta deluseSearchParams
gancho.const [searchParams] = useSearchParams(); const infoId = searchParams.get("infoId");
Lo nuevo en v6.4.0 es la función de utilidad createSearchParams .
<Link to={{ pathname: '/home/userDetails', search: createSearchParams({ infoId: info.id}), }} >
o
navigate({ pathname: '/home/userDetails', search: createSearchParams({ infoId: info.id}), });
Usando
react-router-dom
v5Navegación declarativa: enlace a
<Link to={{ pathname: '/home/userDetails', search: `?infoId=${info.id}`, }} >
Navegación imperativa: use el gancho de navegación
const history = useHistory(); ... history.push({ pathname: '/home/userDetails', search: `?infoId=${info.id}`, });
Luego puede descomprimir el
infoId
parámetro de consulta dellocation
accesorio/objeto en el componente que devuelve esa ruta.Si se pasan los accesorios de ruta:
props.location && props.location.search
o
props.location?.search
Si usa componentes de función, también puede usar el
useLocation
gancho React:const { search } = useLocation();
Luego cree un objeto URLSearchParams y acceda al
infoId
parámetro.const searchParams = new URLSearchParams(search); const infoId = searchParams.get("infoId");
Pero estoy usando un componente de clase React.
En react-router-dom@6
la ruta withRouter
se eliminaron los accesorios y HOC. Para acceder a los antiguos "accesorios de ruta" en RRDv6, necesitará crear su propio withRouter
reemplazo de HOC que pueda usar los ganchos de React e inyectar accesorios que se pueden usar en los componentes de la clase React.
import { useLocation, useParams, /* other hooks */ } from 'react-router-dom';
const withRouter = WrappedComponent => props => {
const location = useLocation();
const params = useParams();
// other hooks
return (
<WrappedComponent
{...props}
{...{ location, params, /* other hooks */ }}
/>
);
};
Decora el componente y accede a los accesorios:
class MyComponent extends React.Component {
...
this.props.location.state;
this.props.params;
...etc...
...
};
export default withRouter(MyComponent);
Referencias
- ubicación
- fósforo
- usarUbicación v5
- usarUbicación v6
- utilizarParams v5
- utilizarParams v6
- utilizarSearchParams v6.4.0