LinkButton
Komponente - eine Lösung für React Router v4
Zunächst ein Hinweis zu vielen anderen Antworten auf diese Frage.
⚠️ Verschachtelung <button>
und <a>
ist kein gültiges HTML. ⚠️
Jede Antwort hier, die vorschlägt, ein HTML button
in eine React Router- Link
Komponente zu verschachteln (oder umgekehrt), wird in einem Webbrowser gerendert, ist jedoch kein semantisches, zugängliches oder gültiges HTML:
<a stuff-here><button>label text</button></a>
<button><a stuff-here>label text</a></button>
☝ Klicken Sie hier, um dieses Markup mit validator.w3.org zu validieren. ☝
Dies kann zu Layout- / Stilproblemen führen, da Schaltflächen normalerweise nicht in Links platziert werden.
Verwenden eines HTML- <button>
Tags mit der React Router- <Link>
Komponente.
Wenn Sie nur ein HTML- button
Tag möchten ...
<button>label text</button>
… Dann ist hier der richtige Weg, um eine Schaltfläche zu erhalten, die wie die Link
Komponente von React Router funktioniert …
Verwenden Sie den WithRouter HOC von React Router , um diese Requisiten an Ihre Komponente zu übergeben:
history
location
match
staticContext
LinkButton
Komponente
Hier ist eine LinkButton
Komponente zum Kopieren / Pasta :
// 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)
Importieren Sie dann die Komponente:
import LinkButton from '/components/LinkButton'
Verwenden Sie die Komponente:
<LinkButton to='/path/to/page'>Push My Buttons!</LinkButton>
Wenn Sie eine onClick-Methode benötigen:
<LinkButton
to='/path/to/page'
onClick={(event) => {
console.log('custom event here!', event)
}}
>Push My Buttons!</LinkButton>
Update: Wenn Sie nach einer anderen unterhaltsamen Option suchen, die nach dem Schreiben des oben genannten verfügbar gemacht wurde, sehen Sie sich diesen useRouter-Hook an .
import { Button } from 'react-bootstrap';
.