React-router的使用:标签跳转和编程式跳转
目录:
3、编程式跳转
参考文档
1)https://reacttraining.com/react-router/web/guides/quick-start
2)http://react-guide.github.io/react-router-cn/index.html
1、demo:NavLink 标签跳转 <-- 返回

index.jsx
import React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter as Router } from 'react-router-dom' import App from './components/App.jsx' ReactDOM.render(
<Router><App /></Router>,
document.getElementById('root'))
App.jsx
import React from 'react'
import { NavLink, Switch, Route, Redirect } from 'react-router-dom' import About from '../views/about.jsx'
import Home from '../views/home.jsx'
import User from '../views/user.jsx' export default class App extends React.Component {
state = {
user: {
id: 1,
name: 'zs'
}
}
render() {
const {user} = this.state
return (
<div>
<h3>tab切换</h3>
{/* 导航链接 */}
<NavLink to='/about'>About</NavLink><br/>
<NavLink to='/home'>Home</NavLink><br/>
<NavLink to='/user/1'>User</NavLink> <h3>组件</h3>
<Switch>
{/* <Route path='/about' component={About} />
<Route path='/home' component={Home} /> */}
<Route path='/about'><About /></Route>
<Route path='/home'><Home /></Route>
<Route path='/user/:id'><User user={user}/></Route>
<Redirect strict from='' to='/about' />
</Switch>
</div>
)
}
}
User.jsx
import React from 'react'
export default class User extends React.Component {
render() {
return (
<div>
user组件
{this.props.user.id + "--" + this.props.user.name}
</div>
)
}
}
about.jsx
import React from 'react'
export default class About extends React.Component {
render() {
return (
<div>
about组件
</div>
)
}
}
2、标签渲染路由组件时,获取url参数 <-- 返回
2.1、使用this.props.match
<Route path='/user/:id' component={User}></Route>
使用这种标签渲染路由组件时,获取url参数:this.props.match.params.占位变量
const {id} = this.props.match.params
console.log(this.props)
console.log(`id=${id}`)
打印结果:

2.2、使用React Hook: useRouteMatch, useParams
<Route path='/user/:id'><User user={user}/></Route>
当这样使用时,不能够通过this.props.match.params.占位变量的方式来获取url参数;此时可以使用useRouteMatch, useParams(配合function组件使用)
import React from 'react'
import { useRouteMatch, useParams } from 'react-router-dom' export default function User(props) {
let match = useRouteMatch()
console.log(match) let { id } = useParams()
console.log(`path parameter id = ${id}`) return (
<div>
user组件
{props.user.id + "--" + props.user.name}
</div>
)
}

在非函数组件里使用React Hook,报错:
Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app
See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.
3、编程式跳转 <-- 返回
3.1、对下面这样注册路由的方式,可以直接在路由组件中使用this.props.history.push('/路由')
<Route path='/user/:id' component={User}></Route>
3.2、<Route path='/home'><Home /></Route>这样注册路由的方式,父组件传递history给子组件使用
App.jsx
import React from 'react'
import { NavLink, Switch, Route, Redirect } from 'react-router-dom' import { useHistory } from "react-router-dom"; import About from '../views/about.jsx'
import Home from '../views/home.jsx'
import User from '../views/user.jsx' export default function App() {
let history = useHistory(); return (
<div>
<h3>tab切换</h3>
{/* 导航链接 */}
<NavLink to='/about'>About</NavLink><br />
<NavLink to='/home'>Home</NavLink><br />
<NavLink to='/user/1'>User</NavLink> <h3>组件</h3>
<Switch>
<Route path='/about'><About history={history} /></Route>
<Route path='/home'><Home history={history} /></Route>
<Route path='/user/:id'><User history={history} /></Route>
<Redirect strict from='' to='/about' />
</Switch>
</div>
) }
user.jsx
import React from 'react'
import { NavLink, Switch, Route, Redirect } from 'react-router-dom' import UserAdd from './UserAdd.jsx'
import UserList from './UserList.jsx'
import UserEdit from './UserEdit.jsx' export default class User extends React.Component {
render() { return (
<div>
user组件<br />
{console.log(this.props)} {/* 导航链接 */} F
<NavLink to='/user/list'>UserList</NavLink> <button onClick={this.listClickHandler}>to list</button><br />
<NavLink to='/user/add'>UserAdd</NavLink> <button onClick={this.addClickHandler}>to add</button><br />
<NavLink to='/user/edit/110'>UserEdit</NavLink> <button onClick={this.editClickHandler}>to edit</button> <h3>组件</h3>
<Switch>
<Route path='/user/list'><UserList /></Route>
<Route path='/user/add'><UserAdd /></Route>
<Route path='/user/edit/:id'><UserEdit /></Route> {/* <Route path='/user/list' component={UserList}></Route>
<Route path='/user/add' component={UserAdd}></Route>
<Route path='/user/edit/:id' component={UserEdit}></Route> */}
{/* <Redirect strict from='' to='/about' /> */}
</Switch> </div>
)
} listClickHandler = () => {
this.props.history.push('/user/list')
}
addClickHandler = () => {
this.props.history.push('/user/add')
}
editClickHandler = () => {
this.props.history.push('/user/edit/110')
}
}
----
React-router的使用:标签跳转和编程式跳转的更多相关文章
- Vue编程式跳转
编程式跳转 <template> <ul class = "prolist"> <!-- //产品 --> <!-- :to = &quo ...
- vue-router编程式跳转
除了使用 <router-link> 创建 a 标签来定义导航链接,我们还可以借助 router 的实例方法,通过编写代码来实现. [语法] .
- React Router 4.0中文快速入门
import React from 'react' import { BrowserRouter as Router, Route, Link } from 'react-router-dom' co ...
- VueJs(10)---vue-router(动态路由,嵌套式路由,编程式路由)
vue-router(动态路由,嵌套式路由,编程式路由) 本文是基于官网学习,官网具体学习目录:vue-router 一.安装 基于vue-cli脚手架安装还是蛮简单的:在文件当前目录下运行: npm ...
- python 全栈开发,Day92(编程式的导航,vue页面布局,marked包的使用)
昨日内容回顾 1. 组件间的传值 1. bus --> 空Vue对象 通过向bus对象抛出自定义事件的方式在组件间传递信息 2. 注意事项: 1. bus.$on()应该在组件mounted(挂 ...
- vue路由-编程式导航
除了使用 <router-link> 创建 a 标签来定义导航链接,我们还可以借助 router 的实例方法,通过编写代码来实现. router.push(location, onComp ...
- [Vue 牛刀小试]:第十四章 - 编程式导航与实现组件与 Vue Router 之间的解耦
一.前言 在上一章的学习中,通过举例说明,我们了解了 Vue Router 中命名路由.命名视图的使用方法,以及如何通过 query 查询参数传参,或者是采用 param 传参的方式实现路由间的参数传 ...
- 在React中使用 react-router-dom 编程式路由导航的正确姿势【含V5.x、V6.x】
## react-router-dom 编程式路由导航 (v5) ###### 1.push跳转+携带params参数 ```jsx props.history.push(`/b/child1/${i ...
- React Router 用法
React Router 用法 一.DEMO import React from "react"; import { HashRouter as Router, Route, Li ...
随机推荐
- Oracle的查询-自连接概念和联系
查询出员工姓名,员工领导姓名 select e1.ename,e2.ename from emp e1,emp e2 where e1.mgr = e2.empno; 结果 自连接:站在不同角度把一张 ...
- ubuntu18上传代码到github
其实在github上建仓库时候就提示你步骤了: 1.注册个github账号并登录 创建一个仓库 https://github.com/ 2.创建SSH Key ssh-keygen -t rsa -C ...
- 基于NIO写的阻塞式和非阻塞式的客户端服务端
由于功能太过简单,就不过多阐述了,直接上阻塞式代码: package com.lql.nio; import org.junit.Test; import java.io.IOException; i ...
- (八)springMvc 的参数绑定
参数绑定 将客户端传来的 key/value 数据,绑定到 Controller 参数的过程 : 这一过程发生在调用 处理器适配器 的时候,spring 会去调用 参数绑定 组件,我使用的版本(4.5 ...
- k-近邻(KNN) 算法预测签到位置
分类算法-k近邻算法(KNN): 定义: 如果一个样本在特征空间中的k个最相似 (即特征空间中最邻近) 的样本中的大多数属于某一个类别,则该样本也属于这个类别 来源: KNN算法最早是由Cover和H ...
- centos8自定义目录安装php7.3
1.目录结构 源码目录:/home/werben/pkgsrc/php-7.3.11 安装目录:/home/werben/application/php7.3.11 2.下载php源码 # 官网地址: ...
- 采样方法(二)MCMC相关算法介绍及代码实现
采样方法(二)MCMC相关算法介绍及代码实现 2017-12-30 15:32:14 Dark_Scope 阅读数 10509更多 分类专栏: 机器学习 版权声明:本文为博主原创文章,遵循CC 4 ...
- Java写学生管理系统
package Homework08;/*调试了一上午,收获:学会了昨天的debug的使用吸取教训:Student stus[]=new Student[2]; for (int i=0;i<s ...
- element随笔
时间选择框el-date-picker和select框数据选不上: [解决]用v-model="searchData.searchDate",不能用:model="sea ...
- 14.MySQL主从复制
1.复制的基本原理 三步骤 + 原理图 1.1 master将改变记录到二进制文件(binary log),这些记录过程叫做二进制日志事件, binary log events 1.2 slave 将 ...