-
Notifications
You must be signed in to change notification settings - Fork 548
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
react-router v4 使用 history 控制路由跳转 #3
Comments
貌似在组件中 可以直接使用 类似 |
@wagouwan. 不可以的奥。除非你自己传了history过来。 |
@wsgouwan 你在 |
使用react-router-redux也可以的吧?不过这东西,支持react router4的还在开发中.... |
|
@weishijun14 可以的,不过一般开发项目中其实用不到 |
感觉这样子做的话,react展示组件逻辑不纯了,有没有更好的根据store去跳转的方案呢? |
@regiondavid 不是很理解你的意思~~ |
好棒!!!!!!!!!!!!!! |
没有用mobx的嘛? |
@sysoft 没用过mobx,不过history的使用方式也是一样的。 |
我用第一种了 |
第一种方法里的"/some/Path"这个路由是在哪里配置的啊, 我也是使用的这种方法,但是 层级比较深,就不能跳转路由,地址栏改变,路由不跳转 |
import React from 'react'; ReactDOM.render( 我直接app组件里面,用this.props.history.push()还是能跳转,为什么啊,没有用withRouter |
@dongkeying |
页面没有报错,而且地址栏已经跳转到"/class/cart"的路由上了,但是页面没有跳转,重点就是我再刷新一下,就显示内容了... 然而直接跳转就不能,必须再刷新一下才显示 |
@dongkeying 和嵌套深度没关系。写法也没啥问题呀。。再然后为什么不跳转,这个不太清楚。没报错信息有点奇怪哦。 |
@shengjudao |
可是使用了withRouter 不就可以在层级较深的子组件访问到 history 了吗, 是不是就不需要一级一级传下去了 |
@dongkeying 是的。你的问题很可能代码写错了。既然路由变了,页面没变,肯定路由配置那边有问题。 |
你好,我想问一下,你在第三种方式hack的时候,import createHistory from 'history/createBrowserHistory'; 不需要npm install --save history 吗?可以直接用? |
@yangxiufang1994 不用的,可以直接用。因为react-router v4 帮你安装了history啦。 |
@brickspert 我只npm install react-router-dom ,我如果不安装,他就会提示我抱错,你也是安装的 react-router-dom 吗? |
@yangxiufang1994 是只安装 有错误可以贴出来。 |
@brickspert import createHistory from 'history/createHashHistory' |
@yangxiufang1994 理论上装了react-router-dom就可以直接用了。 你看看你node_modules里面有木有history |
@brickspert 嗯嗯,我在重安装一下,试试看,谢谢你。 |
我是采用您第三种方式,但是history.push之后页面路径会变化,但没有跳转。所以加了forceRefresh:true的初始化参数,强制每次路径变化刷新页面。这样页面就会有刷新,请问 可以有页面不刷新的路由跳转方式吗? |
@wangchuan113057 我觉得是你姿势不对。第三种方法一共三步。你再核对下。尤其是第二步的:
|
按照你的步伐走的.... 就是这个写法。 在二级路由也是可以成功获取到history的,但是我发现从一级路由进入二级路由,在二级路由操作 this.props.history.push('/'),history 的action属性变成了replace,而不是push....我进行了监听发现了action 由push / 转变成了 replace /home |
@brickspert 路由中有#的话 每次都会重新请求后台,怎么才能禁用# ? |
@wangchuan113057 大兄弟,我第三种方法不是写的。文件里面跳转路由,这样用吗?
你试试? 或者说,是不是路由里面配置拦截了。碰到 |
@PhotonAlpha 不是很懂你的意思呀~ 是说 按理单页面应用,不管有没有 |
@brickspert 非常感谢大佬能抽空回复我。
这个情况是正常的吗? 大神我找到原因了:
改造了component变成按需加载,这个时候 如果我URL中加入了变成了
URL里面出现 #hash的时候 只会render了。 大神可以帮我把Bundle 组件里面bug修复一下吗? |
谢谢了..经过你的提醒我发现是路由拦截的问题.... |
对于方法三,如果用的是HashRouter,那么在history.js中应引入 |
@hugeorange 这个 |
connected-react-router |
请问有没有小demo可以给参考一下,因为对redux还不是很了解 |
使用第三种方法,完美解决 |
@a12366456 将全局的方法绑定到react的配置文件中,使用脚手架创建的项目可以在你的index.js里面的顶部进行绑定。 // 在你使用React之前 ...
import { createBrowserHistory /*createHashHistory */ } from 'history'
...
...
Object.assign(React.Component.prototype, {
...
$router: createBrowserHistory()
})
... // 使用React.Component ...
componentWillMount () {
console.log(this.$router)
}
... |
如果使用的hash,这种该怎么解决呢? |
已经解决了,把import createHistory from 'history/createBrowserHistory'换为import createHistory from 'history/createHashHistory'就可以 |
这里才是重点啊,因为有时候需要在组件外的地方使用history,withRouter只能对组件使用,所以第三种方式更灵活 |
我用第三种方法实现了 但是 history.push("/login") 只改变了url 并没有刷新 |
你确定你做了这一步 |
多谢,之前的是用browserRouter包裹的,我换成了Router就可以了 |
我用第三种方法实现了 但是 history.push("/login") 只改变了url 并没有刷新 |
mark |
#22 这是什么 |
redux吧 |
mark |
完完全全按照第三步来的,跳转后还是不加载页面,是不是5.0版本的history又有改动啊。 |
老哥最后解决了么? |
Nice! |
我把hisotry5降级为4后解决了 |
react-router v4 使用 history 控制路由跳转
问题
当我们使用
react-router v3
的时候,我们想跳转路由,我们一般这样处理react-router
导出browserHistory
。browserHistory.push()
等等方法操作路由跳转。类似下面这样
but!! 问题来了,在
react-router v4
中,不提供browserHistory
等的导出~~那怎么办?我如何控制路由跳转呢???
解决方法
1. 使用 withRouter
withRouter
高阶组件,提供了history
让你使用~这是官方推荐做法哦。但是这种方法用起来有点难受,比如我们想在
redux
里面使用路由的时候,我们只能在组件把history
传递过去。。就像问题章节的代码那种场景使用,我们就必须从组件中传一个
history
参数过去。。。2. 使用 Context
react-router v4
在Router
组件中通过Contex
暴露了一个router
对象~在子组件中使用
Context
,我们可以获得router
对象,如下面例子~当然,这种方法慎用~尽量不用。因为react不推荐使用
contex
哦。在未来版本中有可能被抛弃哦。3. hack
其实分析问题所在,就是
v3
中把我们传递给Router
组件的history
又暴露出来,让我们调用了~~而
react-router v4
的组件BrowserRouter
自己创建了history
,并且不暴露出来,不让我们引用了。尴尬~
我们可以不使用推荐的
BrowserRouter
,依旧使用Router
组件。我们自己创建history
,其他地方调用自己创建的history
。看代码~history
Router
组件4. 我非要用
BrowserRouter
确实,
react-router v4
推荐使用BrowserRouter
组件,而在第三个解决方案中,我们抛弃了这个组件,又回退使用了Router
组件。怎么办。 你去看看
BrowserRouter
的源码,我觉得你就豁然开朗了。源码非常简单,没什么东西。我们完全自己写一个
BrowserRouter
组件,然后替换第三种解决方法中的Router
组件。嘿嘿。讲到这里也结束了,我自己目前在使用第三种方法,虽然官方推荐第一种,我觉得用着比较麻烦唉。~
❤️感谢大家
关注公众号「前端技术砖家」,拉你进交流群,大家一起共同交流和进步。
The text was updated successfully, but these errors were encountered: