LinkButton
composant - une solution pour React Router v4
Tout d'abord, une note sur de nombreuses autres réponses à cette question.
⚠️ Nesting <button>
et <a>
n'est pas valide html. ⚠️
Toute réponse ici suggérant d'imbriquer un html button
dans un Link
composant React Router (ou vice-versa) sera rendue dans un navigateur Web, mais ce n'est pas un html sémantique, accessible ou valide:
<a stuff-here><button>label text</button></a>
<button><a stuff-here>label text</a></button>
☝ Cliquez pour valider ce balisage avec validator.w3.org ☝
Cela peut entraîner des problèmes de mise en page / de style, car les boutons ne sont généralement pas placés à l'intérieur des liens.
Utilisation d'une <button>
balise html avec le <Link>
composant React Router .
Si vous voulez uniquement une button
balise HTML …
<button>label text</button>
… Alors, voici la bonne façon d'obtenir un bouton qui fonctionne comme le Link
composant de React Router …
Utilisez le withRouter HOC de React Router pour transmettre ces accessoires à votre composant:
history
location
match
staticContext
LinkButton
composant
Voici un LinkButton
composant à copier / pâtes :
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)
Importez ensuite le composant:
import LinkButton from '/components/LinkButton'
Utilisez le composant:
<LinkButton to='/path/to/page'>Push My Buttons!</LinkButton>
Si vous avez besoin d'une méthode onClick:
<LinkButton
to='/path/to/page'
onClick={(event) => {
console.log('custom event here!', event)
}}
>Push My Buttons!</LinkButton>
Mise à jour: Si vous recherchez une autre option amusante disponible après l'écriture de ce qui précède , consultez ce hook useRouter .
import { Button } from 'react-bootstrap';
.