博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
react-router v4 使用 history 控制路由跳转
阅读量:6701 次
发布时间:2019-06-25

本文共 2288 字,大约阅读时间需要 7 分钟。

原文地址: (如果你觉得对你有帮助,可以去github上点个star哦。)

github上会更新,这里不更新

问题

当我们使用react-router v3的时候,我们想跳转路径,我们一般这样处理

  1. 我们从react-router导出browserHistory

  2. 我们使用browserHistory.push()等等方法操作路由跳转。

类似下面这样

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等的导出~~

那怎么办?我如何控制路由跳转呢???

解决方法

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传递过去。。

就像问题章节的代码那种场景使用,我们就必须从组件中传一个history参数过去。。。

2. 使用 Context

react-router v4Router 组件中通过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");  }  ...}

当然,这种方法慎用~尽量不用。因为react不推荐使用contex哦。在未来版本中有可能被抛弃哦。

3. hack

其实分析问题所在,就是v3中把我们传递给Router组件的history又暴露出来,让我们调用了~~

react-router v4 的组件BrowserRouter自己创建了history

并且不暴露出来,不让我们引用了。尴尬~

我们可以不使用推荐的BrowserRouter,依旧使用Router组件。我们自己创建history,其他地方调用自己创建的history。看代码~

  1. 我们自己创建一个history

// src/history.jsimport createHistory from 'history/createBrowserHistory';export default createHistory();
  1. 我们使用Router组件

// src/index.jsimport { Router, Link, Route } from 'react-router-dom';import history from './history';ReactDOM.render(  
...
, document.getElementById('root'),);
  1. 其他地方我们就可以这样用了

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组件。嘿嘿。

讲到这里也结束了,我自己目前在使用第三种方法,虽然官方推荐第一种,我觉得用着比较麻烦唉。~

转载地址:http://spwlo.baihongyu.com/

你可能感兴趣的文章
Eclipse安装SVN插件
查看>>
gradle3.1初步了解
查看>>
网易招聘笔试题+答案解析
查看>>
atoi和itoa函数的实现
查看>>
Puppet 2.7 SSH安装配置-3
查看>>
linux普通用户利用authbind绑定特权端口
查看>>
Python 建立与DB2的连接
查看>>
loadrunner http协议psot脚本
查看>>
荣新学习linux的这些天练习草稿
查看>>
CentOs安装php环境异常处理
查看>>
网络营销的精准之道专业网络营销
查看>>
推荐Linux书籍
查看>>
jquery中的replaceAll
查看>>
统一沟通_内部访问测试与OUTLOOK之十六
查看>>
【iOS-Cocos2d游戏开发之二】Cocos2D 游戏开发资源贴(教程以及源码)
查看>>
写代码离不开清晰的逻辑
查看>>
SpringMVC视图解析器
查看>>
对你同样重要的非技术贴,一封有效的求职信的具体写法
查看>>
Android Studio快捷键
查看>>
shell脚本报错:"[: =: unary operator expected"
查看>>