LinkButton
componente - una solución para React Router v4
Primero, una nota sobre muchas otras respuestas a esta pregunta.
⚠️ Anidado <button>
y <a>
no es HTML válido. ⚠️
Cualquier respuesta aquí que sugiera anidar un html button
en un Link
componente React Router (o viceversa) se representará en un navegador web, pero no es un HTML semántico, accesible o válido:
<a stuff-here><button>label text</button></a>
<button><a stuff-here>label text</a></button>
☝ Haga clic para validar este marcado con validator.w3.org ☝
Esto puede provocar problemas de diseño / estilo, ya que los botones no suelen colocarse dentro de los enlaces.
Usando una <button>
etiqueta html con el <Link>
componente React Router .
Si solo desea una button
etiqueta html ...
<button>label text</button>
... entonces, esta es la forma correcta de obtener un botón que funcione como el Link
componente React Router ...
Use React Router's withRouter HOC para pasar estos accesorios a su componente:
history
location
match
staticContext
LinkButton
componente
Aquí hay un LinkButton
componente para que lo copie / pasta :
import React from 'react'
import PropTypes from 'prop-types'
import { withRouter } from 'react-router'
const LinkButton = (props) => {
const {
history,
location,
match,
staticContext,
to,
onClick,
...rest
} = props
return (
<button
{...rest} // `children` is just another prop!
onClick={(event) => {
onClick && onClick(event)
history.push(to)
}}
/>
)
}
LinkButton.propTypes = {
to: PropTypes.string.isRequired,
children: PropTypes.node.isRequired
}
export default withRouter(LinkButton)
Luego importe el componente:
import LinkButton from '/components/LinkButton'
Utilice el componente:
<LinkButton to='/path/to/page'>Push My Buttons!</LinkButton>
Si necesita un método onClick:
<LinkButton
to='/path/to/page'
onClick={(event) => {
console.log('custom event here!', event)
}}
>Push My Buttons!</LinkButton>
Actualización: si está buscando otra opción divertida disponible después de que se escribió lo anterior, consulte este enlace useRouter .
import { Button } from 'react-bootstrap';
.