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 button
w Link
komponencie 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 button
tag HTML …
<button>label text</button>
… W takim razie oto właściwy sposób na uzyskanie przycisku działającego jak Link
komponent 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 LinkButton
komponent 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';
.