1.React路由的基本使用和404not-found
安装(笔者这里使用的是v5.2.0
版本的react-router-dom
):
yarn add react-router-dom
代码示例:
//app.js
import React, {Component} from 'react';
import {BrowserRouter as Router,Route,Link,Switch} from "react-router-dom";
import Home from "./pages/Home.js";
import Course from "./pages/Course.js";
import User from "./pages/User.js";
import NotFound from "./pages/NotFound";
import List from "./pages/List";
class App extends Component {
render() {
return (
<Router>
<ul>
<li>
<Link to="/"> 首页 </Link>
</li>
<li>
<Link to="/course"> 课程 </Link>
</li>
<li>
<Link to="/user"> 用户 </Link>
</li>
<li>
<Link to="/list"> 列表页 </Link>
</li>
</ul>
{/*路由配置*/}
<Switch>
{/*?①号*/}
<Route exact path="/" component={Home} />
<Route path="/course" component={Course}/>
<Route path="/user" component={User}/>
<Route path="/list" component={List}/>
<Route component={NotFound}/>
</Switch>
</Router>
);
}
}
export default App;
-
Link
标签相当于hmtl
的a
标签 -
使用
HashRouter
标签后,url
路径会有#
-
给
Route
添加exact
属性后是精确匹配
-
Switch
相当于一个开关,不添加Switch
的话,无论访问哪个路径,NotFound组件
都会被匹配渲染出来 -
?
Route
如果用的是闭合标签
是不能有空格的
,因为如果有空格了,会弹出警告并且component
中的组件不会被渲染// ?出现的提示: Warning: You should not use <Route component> and <Route children> in the same route; <Route component> will be ignored
2.React中嵌套路由配置及例子:
http://localhost:3000/course/react
如果是这种形式的url
,那么该如何处理呢??
? App
中内容不变,所以从Course
组件入手:
//Course.js
import React, {Component} from 'react';
import {Route, Link} from "react-router-dom";
import CourseDetail from "./CourseDetail";
import CourseIndex from "./CourseIndex";
class Course extends Component {
render() {
return (
<div>
{/*? 定义二级路由*/}
<ul>
<li>
<Link to="/course/react"> React课程</Link>
</li>
<li>
<Link to="/course/vue"> Vue课程</Link>
</li>
<li>
<Link to="/course/angular"> Angular课程</Link>
</li>
</ul>
{/*? 二级路由配置*/}
<Route exact path="/course/:courseId" component={CourseDetail}/>
<Route path={this.props.match.path} component={CourseIndex}/>
</div>
);
}
}
export default Course;
- 子路由
定义
和路由配置
也必须使用BrowserRouter as Router
的Router
对他们进行包裹 - 如果
Route
使用component
属性的时候,Route
标签之间不能有空格 path="/course/:courseId"
主要说两点:course
路径前面的/
不能少:courseId
是路由要传递的参数,用于传递react、vue、angular
三个中的一个
this.props.match.path
让路由变成了动态的,值为匹配当前组件的path路径
,这里就是/course
?再来看下CourseDetail
组件中的内容
//CouresDetail.js
import React, {Component} from 'react';
class CourseDetail extends Component {
componentDidMount() {
console.log("我是课程详情",this.props.match.params.courseId)
}
render() {
const {location,match,history} = this.props;
// ? location:本地信息对象
// ? match:匹配路由信息对象
// ? history:历史对象
console.log(location,match,history);
return (
<div>
报名的课程为:{match.params.courseId}
</div>
);
}
}
export default CourseDetail;
- 被
Router标签
包裹后,props
会增加3
个对象:location
:本地信息对象match
:匹配路由信息对象history
:历史对象
- 解构上面三个对象之后,可以使用,通过
match.params.courseId
获取到了Course组件
中的couresId(react,vue,angular三个之一)
3.编程式导航的使用
直接上代码,欧哒欧哒欧哒...
// CourseDetail.js
import React, {Component} from 'react';
class CourseDetail extends Component {
componentDidMount() {
console.log("我是课程详情",this.props.history)
}
// 这一这里是箭头函数,不然需要constructor中使用bind绑定
back = ()=>{
this.props.history.goBack();
}
goIndex=()=> {
// ? 编程式路由
this.props.history.push("/");
}
goHome=()=>{
// ? 传入参数的版本
this.props.history.push({
pathname:"/",
state:{
foo:"bar"
}
})
}
render() {
const {match,location,history} = this.props;
//?location:本地信息对象
//?match:匹配路由信息对象
//?history:历史对象
console.log(location,match,history);
return (
<div key={this.props.location.key}>
报名的课程为:{match.params.courseId}
<p>
<button onClick={this.back}>返回上一级</button>
<button onClick={this.goIndex}>跳转至首页</button>
<button onClick={this.goHome}>带参数跳转</button>
</p>
</div>
);
}
}
export default CourseDetail;
然后来看下传递到Home.js中的state
//Home.js
import React, {Component} from 'react';
class Home extends Component {
componentDidMount() {
console.log("我进来了,我是location里面的state",this.props.location)
}
render() {
return (
<div>
我是HOME页面
{this.props.location.state ? this.props.location.state.foo:""};
</div>
);
}
}
export default Home;
? 结果如下:
4.重定向路由组件的使用:
常用的一般是访问"/"
和"/home"
都访问的是Home.js
;来看下修改后的代码:
// App.js
import React, {Component} from 'react';
import {BrowserRouter as Router,Route,Link,Switch,Redirect} from "react-router-dom";
import Home from "./pages/Home.js";
import Course from "./pages/Course.js";
import User from "./pages/User.js";
import NotFound from "./pages/NotFound";
import List from "./pages/List";
class App extends Component {
render() {
return (
<Router>
<ul>
<li>
<Link to="/"> 首页 </Link>
</li>
<li>
<Link to="/course"> 课程 </Link>
</li>
<li>
<Link to="/user"> 用户 </Link>
</li>
<li>
<Link to="/list"> 列表页 </Link>
</li>
</ul>
{/*路由配置*/}
<Switch>
{/*? ①号*/}
<Route exact path="/home" component={Home} />
<Route path="/course" component={Course}/>
<Route path="/user" component={User}/>
<Route path="/list" component={List}/>
{/* ? 这里要放在NotFound前面,因为Switch找到了符合条件的组件,就不往下面继续走了*/}
<Redirect to="/home"/>
<Route component={NotFound}/>
</Switch>
</Router>
);
}
}
export default App;
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!