LinkButton
composant: une solution pour Réagir Routeur v4
Tout d'abord, une remarque à propos de beaucoup d'autres réponses à cette question.
⚠️ De nidification <button>
et <a>
n'est pas valide html. ⚠️
Aucune réponse ici, qui suggère de nidification html button
dans une Réagir Routeur Link
composant (ou vice-versa) va afficher dans un navigateur web, mais il n'est pas sémantique, accessible, ou de la validité html:
<a stuff-here><button>label text</button></a>
<button><a stuff-here>label text</a></button>
☝Cliquez pour valider cette balise avec validator.w3.org ☝
Cela peut conduire à la mise en page/style de questions que les boutons ne sont pas généralement placés à l'intérieur des liens.
À l'aide d'un code html <button>
balise de Réagir Routeur <Link>
de la composante.
Si vous voulez seulement un html button
balise...
<button>label text</button>
...alors, voici le bon moyen de faire un bouton qui fonctionne comme Réagir Routeur Link
de la composante...
L'utilisation de Réagir Routeur withRouter HOC pour passer de ces accessoires de votre composant:
history
location
match
staticContext
LinkButton
de la composante
Voici un LinkButton
composant pour vous de copier/pâtes:
// file: /components/LinkButton.jsx
import React from 'react'
import PropTypes from 'prop-types'
import { withRouter } from 'react-router'
const LinkButton = (props) => {
const {
history,
location,
match,
staticContext,
to,
onClick,
// ⬆ filtering out props that `button` doesn't know what to do with.
...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)
Puis importer le composant:
import LinkButton from '/components/LinkButton'
Utiliser 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>