LinkButton
component - giải pháp cho React Router v4
Đầu tiên, một lưu ý về nhiều câu trả lời khác cho câu hỏi này.
⚠️ Làm tổ <button>
và <a>
html không hợp lệ. ⚠️
Bất kỳ câu trả lời nào ở đây gợi ý lồng một html button
trong Link
thành phần Bộ định tuyến React (hoặc ngược lại) sẽ hiển thị trong trình duyệt web, nhưng nó không phải là html có ngữ nghĩa, có thể truy cập hoặc hợp lệ:
<a stuff-here><button>label text</button></a>
<button><a stuff-here>label text</a></button>
☝ Nhấp để xác thực đánh dấu này với validator.w3.org ☝
Điều này có thể dẫn đến các vấn đề về bố cục / kiểu dáng vì các nút thường không được đặt bên trong các liên kết.
Sử dụng <button>
thẻ html với <Link>
thành phần React Router .
Nếu bạn chỉ muốn một button
thẻ html …
<button>label text</button>
… Sau đó, đây là cách phù hợp để có được một nút hoạt động giống như Link
thành phần của React Router …
Sử dụng React Router's withRouter HOC để chuyển các đạo cụ này đến thành phần của bạn:
history
location
match
staticContext
LinkButton
thành phần
Đây là một LinkButton
thành phần để bạn sao chép / pasta :
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)
Sau đó nhập thành phần:
import LinkButton from '/components/LinkButton'
Sử dụng thành phần:
<LinkButton to='/path/to/page'>Push My Buttons!</LinkButton>
Nếu bạn cần một phương pháp onClick:
<LinkButton
to='/path/to/page'
onClick={(event) => {
console.log('custom event here!', event)
}}
>Push My Buttons!</LinkButton>
Cập nhật: Nếu bạn đang tìm kiếm một tùy chọn thú vị khác được cung cấp sau khi phần trên được viết, hãy xem useRouter hook này .
import { Button } from 'react-bootstrap';
.