对于想了解react-router@4用法整理的读者,本文将提供新的信息,我们将详细介绍react_router,并且为您提供关于''react-router-redux''到''connected-
对于想了解react-router @4用法整理的读者,本文将提供新的信息,我们将详细介绍react_router,并且为您提供关于''react-router-redux''到''connected-react-router''、./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”、connected-react-router: react-router-dom 必须总是最后安装、javascript – React Router this.context.router.push不会重新安装组件的有价值信息。
本文目录一览:- react-router @4用法整理(react_router)
- ''react-router-redux''到''connected-react-router''
- ./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”
- connected-react-router: react-router-dom 必须总是最后安装
- javascript – React Router this.context.router.push不会重新安装组件
react-router @4用法整理(react_router)
router@4
react-router@4官方文档
github源码
这篇文章主要介绍了react-router@4的基本用法,包括动态路由,编程式导航等
- 安装
- switch用法
- 动态路由的基本用法
- 编程式导航(withRouter)
- 总结
-
安装
npm i react-router-dom -S
- switch用法
示例代码:
import { Switch,browserRouter as Router,Route,Redirect} from 'react-router-dom'; class SwitchCom extends Component { render() { return ( <Router> <Switch> <Route path="/cart" component={Cart}></Route> <Route path="/search" component={Search} /> <Route path="/home" component={Main} /> <Redirect from="/" to="/home"></Redirect> <Route path="/mine" component={mine}></Route> <Route path="/class" component={Class}></Route> <Route component={NoMatch}></Route> </Switch> </Router> ) } }
关于路由重定向: 使用
Redirect..from..to
的格式,注意位置需要在定义to路由的后面,比如to="/home"
,重定向就需要写在Route path="/home"
后面
关于404路由匹配,默认写在路由末尾,前面的路由都不匹配时,自动匹配404
关于Route
,必须写在Router
标签里面,否则会报错
3.动态路由的基本用法:
import { browserRouter as Router,NavLink} from 'react-router-dom'; <div className="tab-bar"> <Route path="/index" exact component={Index}></Route> <Route path="/index/news" component={News}></Route> <Route path="/index/course" component={Course}></Route> <Route path="/index/mine" component={mine}></Route> <ul className="footer"> <li><NavLink exact to="/index" activeStyle={{ color: '#4dc060' }}>首页列表项目 </NavLink></li> <li><NavLink to="/index/news" activeStyle={{ color: '#4dc060' }}>资讯</NavLink></li> <li><NavLink to="/index/course" activeStyle={{ color: '#4dc060' }}>课程</NavLink></li> <li><NavLink to="/index/mine" activeClassName="selected">我的</NavLink></li> </ul> </div>
上面的
exact
表示绝对匹配/index,如果不注明exact
,则/index还会匹配/index/new等等
上面代码实现了一个类似tabbar
切换的效果
关于NavLink 和 Link:
如果仅仅需要匹配路由,使用Link
就可以了,而NavLink
的不同在于可以给当前选中的路由添加样式,比如上面写到的activeStyle
和activeClassName
4.编程式导航(withRouter用法)
import {withRouter} from 'react-router-dom'; goBack(){ this.props.history.goBack(); } goDetail(){ this.props.history.push('/detail'); } goDetailWithParam(item){ this.props.history.push({pathname : '/cart',state:{item}}); } <span className="ico" onClick={this.goBack.bind(this)}> <i className="iconfont"></i> </span> //这里的item来自for循环的每一项 <li onClick={this.goDetailWithParam.bind(this,item)} key={encodeURI(item.imgurl)}> export default withRouter(Header);
引入
withRouter
之后,就可以使用编程式导航进行点击跳转,需要注意的是export default
的暴露如上面所写,如果结合redux使用,则暴露方式为:withRouter(connect(...)(MyComponent))
调用history
的goBack
方法会返回上一历史记录
调用history
的push
方法会跳转到目标页,如上面goDetail
方法
跳转传参:push()
可以接收一个对象参数,跳转之后,通过this.props.location.state
接收
5 总结:
刚做过一个React
的项目,搭配路由选择了react-router @4
,收获挺多的,打算写文章记录一下收获(也算是遇到的一些坑). 感觉@4
比之前的router
版本更加灵活一些,用法也更加简洁.还是挺好用的.官方文档也只是用到哪些就看一看,并没有从头看到尾,所以理解还不是很深刻,如果上面理解有偏差,还望指出,共同进步.
''react-router-redux''到''connected-react-router''
背景:
redux和react-router两者协同工作会出现,路由变化而store无法感知到,的问题。
react-router-redux :
一. 作用:
react-router-redux 是 redux 的一个中间件,加强了React Router库中history这个实例,以允许将history中接受到的变化反应到state中去。
使用方法1:
使用syncHistoryWithStore包裹browserHistory,当url改变时,会自动触发 LOCATION_CHANGE action,更改store中维护的 locationBeforeTransitions 状态对象,实现store状态的更新。
// 只需要传入react-router中的history以及redux中的store,就可以获得一个增强后的history对象。
// 将这个history对象传给react-router中的Router组件作为props,就给应用提供了观察路由变化并改变store的能力。
import { syncHistoryWithStore, routerReducer } from ''react-router-redux''
const store = createStore(
combineReducers({
...reducers,
routing: routerReducer
})
)
const history = syncHistoryWithStore(browserHistory, store)
ReactDOM.render(
<Provider store={store}>
<Router history={history}>
<Route path="/" component={App} />
</Router>
</Provider>,
document.getElementById(‘app'')
)
// 对应的reducer.js
export const LOCATION_CHANGE = ''@@router/LOCATION_CHANGE''
const initialState = {
locationBeforeTransitions: null
}
使用方法2:
手动触发路由的跳转,同时需要。
直接store.dispatch(push(''/foo'')),会触发 CALL_HISTORY_METHOD 这个action,调用中间件,等同于调用 browserHistory上相应的push方法。
// 触发路由跳转(使用redux action的方式来触发)
import { createStore, combineReducers, applyMiddleware } from ''redux'';
import { routerMiddleware, push } from ''react-router-redux''
// Apply the middleware to the store
const middleware = routerMiddleware(browserHistory)
const store = createStore(
reducers,
applyMiddleware(middleware)
)
// 使用dispatch手动触发 push 等操作
store.dispatch(push(''/foo''))
源码的具体实现:
// import 的 push, replace, go, goBack, goForward之类的方法出自: action.js
export const push = updateLocation(''push'')
function updateLocation(method) {
return (...args) => ({
type: CALL_HISTORY_METHOD,
payload: { method, args }
})
}
//中间件代码
export default function routerMiddleware(history) {
return () => next => action => {
if (action.type !== CALL_HISTORY_METHOD) {
return next(action)
}
const { payload: { method, args } } = action
history[method](...args) //这里直接改变browserHistory
}
}
二. react-router-redux原理图
CALL_HISTORY_METHOD,这类 action 一般会在组件内派发,它不负责 state 的修改,通过 routerMiddleware 后,会被转去调用 history。
面临的问题:
react-router-redux 只兼容 react-router 2.x and 3.x,所以要改成使用 connected-react-router 来兼容 react-router 4.x。
解决:
把之前 react-router-redux 中 store.dispatch(push(''/foo'')) 这么使用的,直接改成 history.push(''/foo'') 之类的。
参考文章:
https://blog.csdn.net/weixin_... React 的路由状态管理
./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”
如何解决./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”
./node_modules/react-router-dom/react-router-dom.js Attempted import error: ''Navigate'' is not exported from ''react-router''.
react-router-dom的版本是6.0.0-alpha.2,而react-router是5.2.0。 两者均已正确安装。我不确定如何解决此错误。有人可以给我任何可能的解决方法吗?
我的代码中甚至没有<Navigate to=?>
行。
解决方法
为什么只安装两个都需要,这可以工作
- 执行npm删除react-router
- 删除node_modules
- 纱线安装或npm安装和
- 启动纱线或启动npm
connected-react-router: react-router-dom 必须总是最后安装
如何解决connected-react-router: react-router-dom 必须总是最后安装
我从我的开发文件夹中排除了我的 node_modules 文件夹,并且只有一个指向它的软链接(因此它不会同步到云)。我使用 connected-react-router 并且一切正常,直到我之后安装任何其他 npm 包。然后我在浏览器中收到错误:Uncaught Error: Invariant Failed: You should not use <Switch> outside a <Router>
当我再做 npm install react-router-dom
时,一切都会恢复正常。出于某种原因,react-router-dom 必须始终是最新安装的软件包。
即使我直接包含 node_modules 文件夹,而不是作为软链接,也会出现此问题。有没有人知道这是怎么发生的以及如何解决这个问题?
javascript – React Router this.context.router.push不会重新安装组件
selectRelatedJob(slug) { JobActionCreators.fetchJobPage(slug); JobsActionCreators.getRelatedJobs({'sl': slug}); this.context.router.push({pathname: '/job',query: {sl: slug}}); }
我们的目标是基于“sl”查询字符串获取新数据,但我们的componentwillMount()方法没有被调用,因为我们正在将url更新为相同的路径—只是一个不同的查询字符串.而是调用更新生命周期方法.我们当前的方法是调用操作创建器直接在单击处理程序中获取数据.但是,这似乎是多余的和hacky,因为我们已经更新了url.理想情况下,组件将被卸载并重新安装.
以下是嵌套路线:
<Route component={App}> <Route path="/" component={HomePage}/> <Route path="job" component={JobPage}/> <Route path="job/" component={JobPage}/> </Route> </Route>
使用不同的查询字符串导航到当前URL的最佳案例实践是什么?
解决方法
<Route path="job/:id" component={JobDetailPage} />
关于react-router @4用法整理和react_router的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于''react-router-redux''到''connected-react-router''、./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”、connected-react-router: react-router-dom 必须总是最后安装、javascript – React Router this.context.router.push不会重新安装组件的相关信息,请在本站寻找。
本文标签: