React Router v5.1 nâng cấp mới: useParams, useLocation, useHistory, useRoute (ok)
https://viblo.asia/p/react-router-v51-version-moi-voi-nhung-nang-cap-moi-useparams-uselocation-usehistory-useroutematch-maGK7O8LKj2
Last updated
Was this helpful?
https://viblo.asia/p/react-router-v51-version-moi-voi-nhung-nang-cap-moi-useparams-uselocation-usehistory-useroutematch-maGK7O8LKj2
Last updated
Was this helpful?
Đọc thêm: https://blog.logrocket.com/react-router-hooks-will-make-your-component-cleaner/
Với React router v4, nếu chúng ta muốn lấy thông tin từ các params
, chúng ta phải lấy chúng từ props
của component
thông qua các Route
hoặc thông qua phương thức render prop
trong Route
như sau:
useParams
Cách 1: Lấy :slug trên đường dẫn :)
Cách 2: Lấy :slug trên đường dẫn :)
C:\Users\Administrator\Desktop\test\src\App.js
Và nếu chúng ta muốn sử dụng nó trong các child components
, chúng ta phải pass nó xuống các props
của các child components
. Tuy nhiên, đổi với React router v5.1, chúng ta chỉ cần sử dụng useParams
:
C:\Users\Administrator\Desktop\test\src\App.js
useLocation
useLocation
sẽ trả về location
object hiện tại. Nó sẽ giúp ích trong trường hợp chúng ta muốn lấy thông tin từ URL hiện tại. Ví dụ như, bạn muốn gửi một sự kiện "page view" đến một analytics service mỗi khi URL thay đổi. Với useLocation
, bạn chỉ cần làm như sau:
C:\Users\Administrator\Desktop\test\src\App.js
Hook useHistory cung cấp cho bạn quyền truy cập vào phiên bản lịch sử mà bạn có thể sử dụng để điều hướng.
C:\Users\Administrator\Desktop\test\src\App.js
C:\Users\Administrator\Desktop\test\src\Home.js
C:\Users\Administrator\Desktop\test\src\User.js
C:\Users\Administrator\Desktop\test\src\About.js
useRouteMatch
Trường hợp chưa sử dụng useRouteMatch
Đôi khi, bạn cần sử dụng thành phần chỉ để truy cập vào một đối tượng khớp.
Trường hợp sử dụng useRouteMatch
Ví dụ trên cho thấy một cách để truy cập đối tượng khớp mà không cần sử dụng thành phần hoặc kết xuất đạo cụ. Với phiên bản mới nhất của React Router, bạn cũng có thể sử dụng hook useRouteMatch, cho phép bạn lấy đối tượng match và sử dụng nó bên trong thành phần của mình mà không cần sử dụng .
C:\Users\Administrator\Desktop\test\src\App.js
Chúng ta có thể thấy rằng React hooks đang dần trở thành một thứ không thể thiếu trong tất cả các framework, các thư viện React hiện nay. Đây quả là một ý tưởng cực kì thành công của Facebook. Và React Router cũng không ngoại lệ với những nâng cấp đáng kể trong version 5.1. Vậy React Router v5.1 có gì mới, chúng ta hãy cũng điểm qua nhé!
useParams
Với React router v4, nếu chúng ta muốn lấy thông tin từ các params
, chúng ta phải lấy chúng từ props
của component
thông qua các Route
hoặc thông qua phương thức render prop
trong Route
như sau:
Và nếu chúng ta muốn sử dụng nó trong các child components
, chúng ta phải pass nó xuống các props
của các child components
. Tuy nhiên, đổi với React router v5.1, chúng ta chỉ cần sử dụng useParams
:
useLocation
useLocation
sẽ trả về location
object hiện tại. Nó sẽ giúp ích trong trường hợp chúng ta muốn lấy thông tin từ URL hiện tại. Ví dụ như, bạn muốn gửi một sự kiện "page view" đến một analytics service mỗi khi URL thay đổi. Với useLocation
, bạn chỉ cần làm như sau:
useHistory
Nếu bạn muốn sử dụng history
object cho các tác vụ điều hướng trong trang, bạn có thể sử dụng useHistory
hook như sau:
Trong tương lai, React Router sẽ cung cấp thêm cho chúng ta useNavigate
hook, dành riêng cho các tác vụ điều hướng trong trang một cách thuận tiện hơn.
useRouteMatch
Cuối cùng là useRouteMatch
hook. Nó sẽ giúp ích khi chúng ta muốn sử dụng Route
chỉ để get match
param. Thay vì sử dụng Route
, chúng ta có thể sử dụng useRouteMatch
:
Cũng như Route
, nếu chúng ta bỏ qua path
prop, hook này sẽ trả về giá trị match
của Route
gần nhất.
Như vậy, chúng ta đã cùng điểm qua những nâng cấp mới của React Router v5.1, chủ yếu là các hooks. Các bạn có thể sử dụng nó ngay bây giờ hoặc chờ đợi một phiên bản nâng cấp hơn là React Router v6, nghe bảo là sẽ có trong đầu năm sau 2020 đấy nhé. Chúc các bạn thành công ^^
React Router is a lightweight library that allows you to manage and handle routing for your React application.
Among the most prominent features of React Router are route render methods, which enable your component to access match
, location
, and history
props. Together, these props are used to pass data from URL to component and navigate your React application programmatically.
For example, if you’d like to create a back button, you can use the goBack()
function from history
props. This abstracts away the differences in various environments or web browsers so you can go back to the previous webpage in a simple function.
Although this works fine, the route render method is widely considered hard to read and just plain weird. That’s why, starting with version 5.1, React Router will include four useful hooks you can use to write clean, neatly stacked navigation components that please the eye. I’ll show you how these new hooks work by comparing them to the old patterns in version 4.
We’ll start with the useParams
hook.
UseParams
The useParams
hook will return an object of key/value pairs from your application URL that is set to be dynamic. In a complex application, it’s common to have many navigation links that are dynamic.
For example, you may have a /post/:id
URL that also initiates a fetch process to your application’s backend. In this case, the most common React Router pattern would be to use a component prop.
By passing the Post
component into the /post/:number
Route
component, you can extract the params
object from the match
prop that is passed by React Router into the Post
component.
This method works just fine, but it’s quite cumbersome if you have a big application with lots of dynamic routes. You have to keep track of which Route
components need component props and which do not. Also, since the match
object is passed from Route
into the rendered component, you will need to pass them along to components further down the DOM tree.
This is where the useParams
hook really shines. It’s a neat helper function that gives you the parameters of the current route so you don’t have to use the component props pattern.
If a child component of Users
need access to the parameters, you can simply call useParams()
there as well.
Here’s an example if you’d like to see it in action.
UseLocation
In React Router version 4, just like fetching parameters, you had to use the component props pattern to gain access to a location
object.
With version 5.1, you can call the useLocation
hook to get the location
object from React Router.
Again, you can see the sample code on CodeSandbox.
UseHistory
That gives us one less reason to use component props. But don’t you still need to use the component or render pattern to get the history
object?
The history
object is the last reason why you need to use component or render props pattern.
By using the useHistory
hook, you can get the same history object without needing the Route
component to pass it down.
See this sample code for a comparison between useHistory
and regular history
props.
Now you can have a clean routing component without any weird component compositions that use component
or render
props. You can simply put a <Route>
component with path
props and place the rendered children
component inside it.
useRouteMatch
Sometimes, you need to use the <Route>
component just to get access to a match
object.
The example above shows one way to access a match
object without using the component
or render
props. With the latest version of React Router, you can also use the useRouteMatch
hook, which enables you to grab the match
object and use it inside your component without using <Route>
.
Now you won’t need to create a <Route>
component just to grab a match
object. Here’s another example for you to mess around with.
The React Router team harnessed the power of hooks and implemented it to share logic across components without the need to pass it down from from the top of the tree.
If you’d like to refactor your component with these new hooks, you can start by updating components that use match
, location
, or history
objects.
After that, you can update the weird-looking <Route>
components you might have in your navigation component.
What do you think about React Router hooks? Share your comments below.
LogRocket is like a DVR for web apps, recording literally everything that happens on your React app. Instead of guessing why problems happen, you can aggregate and report on what state your application was in when an issue occurred. LogRocket also monitors your app's performance, reporting with metrics like client CPU load, client memory usage, and more.
The LogRocket Redux middleware package adds an extra layer of visibility into your user sessions. LogRocket logs all actions and state from your Redux stores.
Modernize how you debug your React apps — start monitoring for free.
February 24, 2020 4 min read
Debugging React applications can be difficult, especially when users experience issues that are difficult to reproduce. If you’re interested in monitoring and tracking Redux state, automatically surfacing JavaScript errors, and tracking slow network requests and component load time, try LogRocket.