LinkButton
bileşen - React Router v4 için bir çözüm
İlk olarak, bu soruya verilen diğer birçok cevap hakkında bir not.
⚠️ Nesting <button>
ve <a>
geçerli html değil. ⚠️
Buradaki herhangi bir yanıt button
, bir React Router Link
bileşenine (veya tersi) bir html yerleştirmeyi öneren herhangi bir yanıt , bir web tarayıcısında işlenecektir, ancak bu anlamsal, erişilebilir veya geçerli html değildir:
<a stuff-here><button>label text</button></a>
<button><a stuff-here>label text</a></button>
☝ Bu işaretlemeyi validator.w3.org ile doğrulamak için tıklayın ☝
Düğmeler tipik olarak bağlantıların içine yerleştirilmediğinden bu, düzen / stil sorunlarına yol açabilir.
<button>
React Router <Link>
bileşeni ile bir html etiketi kullanmak .
Yalnızca bir html button
etiketi istiyorsanız …
<button>label text</button>
… O zaman, işte React Router'ın Link
bileşeni gibi çalışan bir düğme edinmenin doğru yolu …
Kullanım Yönlendirici Tepki withRouter HOC sizin bileşene bu sahne geçmek:
history
location
match
staticContext
LinkButton
bileşen
İşte LinkButton
kopyalamanız / makarna için bir bileşen :
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)
Ardından bileşeni içe aktarın:
import LinkButton from '/components/LinkButton'
Bileşeni kullanın:
<LinkButton to='/path/to/page'>Push My Buttons!</LinkButton>
Bir onClick yöntemine ihtiyacınız varsa:
<LinkButton
to='/path/to/page'
onClick={(event) => {
console.log('custom event here!', event)
}}
>Push My Buttons!</LinkButton>
Güncelleme: Yukarıdakiler yazıldıktan sonra sunulan başka bir eğlenceli seçenek arıyorsanız, bu useRouter kancasına göz atın .
import { Button } from 'react-bootstrap';
.