LinkButton komponent - rozwiązanie dla React Router v4
Najpierw uwaga na temat wielu innych odpowiedzi na to pytanie.
⚠️ Zagnieżdżanie <button>i <a>nieprawidłowy kod HTML. ⚠️
Każda odpowiedź tutaj, która sugeruje zagnieżdżenie html buttonw Linkkomponencie React Router (lub odwrotnie), zostanie wyświetlona w przeglądarce internetowej, ale nie jest semantyczna, dostępna ani poprawna w html:
<a stuff-here><button>label text</button></a>
<button><a stuff-here>label text</a></button>
☝ Kliknij, aby sprawdzić poprawność tego znacznika za pomocą validator.w3.org ☝
Może to prowadzić do problemów z układem / stylem, ponieważ przyciski zwykle nie są umieszczane w linkach.
Używanie <button>tagu html z <Link>komponentem React Router .
Jeśli chcesz tylko buttontag HTML …
<button>label text</button>
… W takim razie oto właściwy sposób na uzyskanie przycisku działającego jak Linkkomponent React Router …
Użyj React Router's withRouter HOC, aby przekazać te właściwości do swojego komponentu:
history
location
match
staticContext
LinkButton składnik
Oto LinkButtonkomponent do skopiowania / makaronu :
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)
Następnie zaimportuj komponent:
import LinkButton from '/components/LinkButton'
Użyj komponentu:
<LinkButton to='/path/to/page'>Push My Buttons!</LinkButton>
Jeśli potrzebujesz metody onClick:
<LinkButton
to='/path/to/page'
onClick={(event) => {
console.log('custom event here!', event)
}}
>Push My Buttons!</LinkButton>
Aktualizacja: Jeśli szukasz innej fajnej opcji dostępnej po napisaniu powyższego, sprawdź ten hook useRouter .
import { Button } from 'react-bootstrap';.