LinkButton
компонент - рішення для React Router v4
Спочатку примітка про багато інших відповідей на це питання.
Вкладений <button>
і <a>
не дійсний html. ⚠️
Будь-яка відповідь тут, яка пропонує вкласти html button
у Link
компонент React Router (або навпаки), буде відображатися у веб-браузері, але вона не є семантичною, доступною чи дійсним html:
<a stuff-here><button>label text</button></a>
<button><a stuff-here>label text</a></button>
☝ Клацніть, щоб перевірити цю розмітку за допомогою validator.w3.org ☝
Це може призвести до проблем із макетом / стилем, оскільки кнопки зазвичай не розміщуються всередині посилань.
Використання <button>
тегу html з <Link>
компонентом React Router .
Якщо вам потрібен лише button
тег html ...
<button>label text</button>
… Тоді ось правильний спосіб отримати кнопку, яка працює як Link
компонент React Router …
Використовуйте React Router withRouter HOC, щоб передати ці компоненти своєму компоненту:
history
location
match
staticContext
LinkButton
компонент
Ось LinkButton
компонент для копіювання / пасти :
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)
Потім імпортуйте компонент:
import LinkButton from '/components/LinkButton'
Використовуйте компонент:
<LinkButton to='/path/to/page'>Push My Buttons!</LinkButton>
Якщо вам потрібен метод onClick:
<LinkButton
to='/path/to/page'
onClick={(event) => {
console.log('custom event here!', event)
}}
>Push My Buttons!</LinkButton>
Оновлення: Якщо ви шукаєте інший варіант розваг, який стане доступним після написання вище, перевірте цей хук useRouter .
import { Button } from 'react-bootstrap';
.