Trên thực tế nó phụ thuộc vào trường hợp sử dụng của bạn.
1) Bạn muốn bảo vệ tuyến đường của mình khỏi những người dùng trái phép
Nếu trường hợp đó xảy ra, bạn có thể sử dụng thành phần được gọi <Redirect />
và có thể triển khai logic sau:
import React from 'react'
import { Redirect } from 'react-router-dom'
const ProtectedComponent = () => {
if (authFails)
return <Redirect to='/login' />
}
return <div> My Protected Component </div>
}
Hãy nhớ rằng nếu bạn muốn <Redirect />
hoạt động theo cách bạn mong đợi, bạn nên đặt nó bên trong phương thức kết xuất của thành phần để cuối cùng nó sẽ được coi là một phần tử DOM, nếu không nó sẽ không hoạt động.
2) Bạn muốn chuyển hướng sau một hành động nhất định (giả sử sau khi tạo một mục)
Trong trường hợp đó, bạn có thể sử dụng lịch sử:
myFunction() {
addSomeStuff(data).then(() => {
this.props.history.push('/path')
}).catch((error) => {
console.log(error)
})
hoặc là
myFunction() {
addSomeStuff()
this.props.history.push('/path')
}
Để có quyền truy cập vào lịch sử, bạn có thể bọc thành phần của mình bằng một HOC được gọi withRouter
. Khi bạn bọc thành phần của mình bằng nó, nó sẽ trôi qua match
location
vàhistory
đạo cụ. Để biết thêm chi tiết, vui lòng xem tài liệu chính thức cho withRouter .
Nếu thành phần của bạn là một đứa trẻ của một <Route />
thành phần, tức là nếu nó là một cái gì đó giống như <Route path='/path' component={myComponent} />
, bạn không cần phải quấn thành phần của bạn với withRouter
, vì <Route />
đèo match
, location
vàhistory
cho con của mình.
3) Chuyển hướng sau khi nhấp vào một số phần tử
Có hai lựa chọn ở đây. Bạn có thể sử dụng history.push()
bằng cách chuyển nó vào một onClick
sự kiện:
<div onClick={this.props.history.push('/path')}> some stuff </div>
hoặc bạn có thể sử dụng một <Link />
thành phần:
<Link to='/path' > some stuff </Link>
Tôi nghĩ rằng quy tắc ngón tay cái với trường hợp này là cố gắng sử dụng <Link />
trước, tôi cho rằng đặc biệt là vì hiệu suất.