react link hashrouter example browserrouter javascript reactjs react-router react-router-v4

javascript - link - redirect react router v4



¿Cómo puedo diseñar el enlace activo en react-router v4? (6)

Si tiene un problema en el que su menú de navegación funciona, excepto que no se actualiza correctamente al hacer clic en los enlaces y la ruta cambia, pero funciona bien si presiona F5, puede hacer esto:

Probablemente esto ocurra porque está utilizando Redux, que tiene un método shouldComponentUpdate Lifecycle en su función de connect . Probablemente tienes tu componente Nav envuelto en connect . Todo esto está bien. shouldComponentUpdate es lo que está arruinando tu vida.

Para solucionarlo, simplemente lleve el enrutador a su función mapStateToProps :

// This lets shouldComponentUpdate know that the route changed, // which allows the Nav to re-render properly when the route changes, woot! const mapStateToProps = (state) => { return { router: state.router, } } // or, if you prefer pro style destructure shorthand: const mapStateToProps = ({ router }) => ({ router })

Si no está del todo seguro de dónde proviene state.router , proviene del archivo en el que combina sus reductores y verá algo como esto:

import { combineReducers } from ''redux'' import { routerReducer } from ''react-router-redux'' import authReducer from ''./components/auth/auth_reducer'' export default combineReducers({ router: routerReducer, auth: authReducer, })

Aquí hay algunos HTML y CSS para un bonito Baller Nav Link:

HTML

<ul id="Nav_menu"> <li> <NavLink to="/home" className="Nav_link" activeClassName="activeRoute" activeStyle={{ color: ''teal'' }} > HOME </NavLink> </li> <li> <NavLink to="/products" className="Nav_link" activeClassName="activeRoute" activeStyle={{ color: ''teal'' }} > PRODUCTS </NavLink> </li> </ul>

NOTA: Si está vinculando a "/" , coloque el apoyo exact en NavLink.

CSS

#Nav_menu { display: flex; flex-direction: row; width: 100%; height: 100%; list-style-type: none; margin: 0; padding: 0; } .Nav_link:link { color: #fff; font-size: 1.6rem; line-height: 1.6rem; text-decoration: none; } .Nav_link:visited { color: #fff; } .Nav_link:hover { color: yellow; } .Nav_link:active { color: teal; } .activeRoute { background-color: yellow; border-bottom: 0.4rem solid teal; cursor: not-allowed; }

Observe activeStyle en el marcado HTML. Esta era la única forma en que podía cambiar el color del texto en la ruta / enlace activo. No funcionó cuando puse color: teal; en la activeRoute CSS activeRoute . Abra esto en otra pestaña: https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/docs/api/NavLink.md

Si no sabes por qué usé rem lugar de px . Esta es una gran oportunidad para que usted investigue la accesibilidad web y font-size: 10px; base font-size: 10px; .

Mantente en forma y diviértete.

En react-router v3 teníamos activeStyle y activeClassName para diseñar el enlace activo

podríamos hacer algo como esto

<div id="tags-container"> {tags.map(t => <Link className="tags" activeStyle={{ color: ''red'' }} to={t.path} > {t.title} </Link> )} </div>

Quiero saber cómo puedo hacer lo mismo en v4?


Ampliando la respuesta de @agm1984 : la solución de NavLinks no es actualizar los estilos correctamente, que estaba usando routerReducer de react-router-redux , no me ha funcionado. En lugar de eso, descubrí que el problema era que el contenedor de connect usa shouldComponentUpdate e impedía que se volviera a enviar el componente que contenía NavLinks.

La solución correcta en mi situación fue pasar el objeto de opciones para connect como 4to parámetro como se muestra a continuación:

export default connect(mapStateToProps, null, null, { pure: false })(NavItems);


Este ejemplo de la documentación del enlace personalizado de react-router v4 lo ayudará a lograrlo:

const OldSchoolMenuLink = ({ label, to, activeOnlyWhenExact }) => ( <Route path={to} exact={activeOnlyWhenExact} children={({ match }) => ( <div className={match ? ''active'' : ''''}> {match ? ''> '' : ''''}<Link to={to}>{label}</Link> </div> )}/> );

Así que en tu caso podrías crear el siguiente componente:

const CustomLink = ({ activeStyle, children, className, to, activeOnlyWhenExact }) => ( <Route path={to} exact={activeOnlyWhenExact} children={({ match }) => ( <Link to={to} className={className} style={match && activeStyle}>{children}</Link> )}/> );

Y luego usarlo como:

<div id="tags-container"> {tags.map(t => <CustomLink className="tags" activeStyle={{ color: ''red'' }} to={t.path} > {t.title} </Link> )} </div>


Puedes hacerlo con NavLink en react-router v4

<div id="tags-container"> {tags.map(t => <NavLink className="tags" activeStyle={{ color: ''red'' }} to={t.path} > {t.title} </NavLink> )} </div>


Todo sigue funcionando igual. Sin embargo, reaccion-router-dom v4 reemplaza el Link con NavLink

import { NavLink as Link } from ''react-router-dom''; tambien esta bien Nota: Los enlaces de navegación por defecto están activos, por lo que puede activeStyle={{color: ''red''}} a:active estilo a:active o activeStyle={{color: ''red''}}