react-router v4如何使用history控制路由跳轉(zhuǎn)詳解
前言
距離React Router v4 正式發(fā)布也已經(jīng)挺久了,這周把一個React的架子做了升級,之前的路由用的還是v2.7.0版的,所以決定把路由也升級下,正好“嘗嘗鮮”...
江湖傳言,目前官方同時維護 2.x 和 4.x 兩個版本。(ヾ(。ꏿ﹏ꏿ)ノ゙咦,此刻相信機智如我的你也會發(fā)現(xiàn),ReactRouter v3 去哪兒了?整丟了??巴拉出鍋了???敢不敢給我個完美的解釋???)事實上 3.x 版本相比于 2.x 并沒有引入任何新的特性,只是將 2.x 版本中部分廢棄 API 的 warning 移除掉而已。按照規(guī)劃,沒有歷史包袱的新項目想要使用穩(wěn)定版的 ReactRouter 時,應(yīng)該使用 ReactRouter 3.x。目前 3.x 版本也還處于 beta 階段,不過會先于 4.x 版本正式發(fā)布。如果你已經(jīng)在使用 2.x 的版本,那么升級 3.x 將不會有任何額外的代碼變動。
問題
當(dāng)我們使用react-router v3的時候,我們想跳轉(zhuǎn)路徑,我們一般這樣處理
- 我們從react-router導(dǎo)出browserHistory。
- 我們使用
browserHistory.push()
等等方法操作路由跳轉(zhuǎn)。
類似下面這樣
import browserHistory from 'react-router'; export function addProduct(props) { return dispatch => axios.post(`xxx`, props, config) .then(response => { browserHistory.push('/cart'); //這里 }); }
but!! 問題來了,在react-router v4中,不提供browserHistory等的導(dǎo)出~~
那怎么辦?我如何控制路由跳轉(zhuǎn)呢???
解決方法
1. 使用 withRouter
withRouter高階組件,提供了history讓你使用~
import React from "react"; import {withRouter} from "react-router-dom"; class MyComponent extends React.Component { ... myFunction() { this.props.history.push("/some/Path"); } ... } export default withRouter(MyComponent);
這是官方推薦做法哦。但是這種方法用起來有點難受,比如我們想在redux里面使用路由的時候,我們只能在組件把history傳遞過去。。
就像問題章節(jié)的代碼那種場景使用,我們就必須從組件中傳一個history參數(shù)過去。。。
2. 使用 Context
react-router v4 在 Router 組件中通過Contex暴露了一個router對象~
在子組件中使用Context,我們可以獲得router對象,如下面例子~
import React from "react"; import PropTypes from "prop-types"; class MyComponent extends React.Component { static contextTypes = { router: PropTypes.object } constructor(props, context) { super(props, context); } ... myFunction() { this.context.router.history.push("/some/Path"); } ... }
當(dāng)然,這種方法慎用~盡量不用。因為react不推薦使用contex哦。在未來版本中有可能被拋棄哦。
3. hack
其實分析問題所在,就是v3中把我們傳遞給Router組件的history又暴露出來,讓我們調(diào)用了~~
而react-router v4 的組件BrowserRouter自己創(chuàng)建了history,并且不暴露出來,不讓我們引用了。尷尬~
我們可以不使用推薦的BrowserRouter,依舊使用Router組件。我們自己創(chuàng)建history,其他地方調(diào)用自己創(chuàng)建的history??创a~
我們自己創(chuàng)建一個history
// src/history.js import createHistory from 'history/createBrowserHistory'; export default createHistory();
我們使用Router組件
// src/index.js import { Router, Link, Route } from 'react-router-dom'; import history from './history'; ReactDOM.render( <Provider store={store}> <Router history={history}> ... </Router> </Provider>, document.getElementById('root'), );
其他地方我們就可以這樣用了
import history from './history'; export function addProduct(props) { return dispatch => axios.post(`xxx`, props, config) .then(response => { history.push('/cart'); //這里 }); }
4. 我非要用BrowserRouter
確實,react-router v4推薦使用BrowserRouter組件,而在第三個解決方案中,我們拋棄了這個組件,又回退使用了Router組件。
怎么辦。 你去看看BrowserRouter的源碼,我覺得你就豁然開朗了。
源碼非常簡單,沒什么東西。我們完全自己寫一個BrowserRouter組件,然后替換第三種解決方法中的Router組件。嘿嘿。
講到這里也結(jié)束了,我自己目前在使用第三種方法,雖然官方推薦第一種,我覺得用著比較麻煩唉。~
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
- React進(jìn)行路由跳轉(zhuǎn)的方法匯總
- React路由跳轉(zhuǎn)的實現(xiàn)示例
- React 中常用的幾種路由跳轉(zhuǎn)方式小結(jié)
- react路由跳轉(zhuǎn)傳參刷新頁面后參數(shù)丟失的解決
- react中路由跳轉(zhuǎn)及傳參的實現(xiàn)
- React中的Hooks路由跳轉(zhuǎn)問題
- React中的路由嵌套和手動實現(xiàn)路由跳轉(zhuǎn)的方式詳解
- React-RouterV6+AntdV4實現(xiàn)Menu菜單路由跳轉(zhuǎn)的方法
- 基于React路由跳轉(zhuǎn)的幾種方式
- react 路由跳轉(zhuǎn)的7種方式實現(xiàn)
相關(guān)文章
react 跳轉(zhuǎn)后路由變了頁面沒刷新的解決方案
最近在學(xué)習(xí)React的過程中遇到了路由跳轉(zhuǎn)后頁面不刷新的問題,本文就詳細(xì)的介紹一下解決方法,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06詳解Webpack+Babel+React開發(fā)環(huán)境的搭建的方法步驟
本篇文章主要介紹了詳解Webpack+Babel+React開發(fā)環(huán)境的搭建的方法步驟,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01React router cache route實現(xiàn)緩存頁面流程介紹
react-router自身沒有路由緩存的特性,在5.x版本之前,我們可以基于react-router-cache-route來實現(xiàn)路由緩存功能。但是react-router 6.x在實現(xiàn)上做了比較大的變化,react-router-cache-route沒有提供相應(yīng)的支持2023-01-01