LinkButton
คอมโพเนนต์ - โซลูชันสำหรับ React Router v4.2
อันดับแรกหมายเหตุเกี่ยวกับคำตอบอื่น ๆ สำหรับคำถามนี้
⚠️ทำรัง<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 …
การใช้งานตอบสนองของ 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 hookนี้
import { Button } from 'react-bootstrap';
.