包裹起来
可以从外部引入组建 Home User
新建User.js Home.js
例:
import React,{Component} from 'react';
export default class Home extends Component{
render(){
return (
Home
)
}
};
```
## 子页面还可以嵌套路由
import React,{Component} from 'react';
import {
Route, //一条路由
Link
} from "react-router-dom";
import UserList from './UserList';
import UserAdd from './UserAdd';
import UserDetail from './UserDetail';
export default class User extends Component{
render(){
return (
)
}
};
## 路由传递参数 直接在后面追加 /name
```
{user.name}
```
## 路由参数获取
```
在 this.props 是个数组在它里面 有以下参数
history 跳转路径 路径
{
history:action:"PUSH"
block:ƒ block()
createHref:ƒ createHref(location)
go:ƒ go(n)
goBack:ƒ goBack()
goForward:ƒ goForward()
length:50
listen:ƒ listen(listener)
location:{pathname: "/user/detail/1524472305217", search: "", hash: "", state: undefined, key: "xekkjj"}
push:ƒ push(path, state)
}
location 当前路径的信息
{
push:ƒ push(path, state)
replace:ƒ replace(path, state)
__proto__:Object
location:hash:""
key:"xekkjj"
pathname:"/user/detail/1524472305217" //当前路径
search:""
state:undefined
}
match 匹配结果 如果 匹配上就是 对象 匹配不上就是 null
{
isExact:true // 是否是 精确匹配
params:{id: "1524472305217"} //路径参数
path:"/user/detail/:id"
url:"/user/detail/1524472305217"
}
let id = this.props.match.params.id;
这样就可以拿到 列表页面传过来的 参数
```
## 另外一种渲染方式 匿名组件声明方式
```
新的渲染方式
} />
相当于
在 class 之外 定义一个变量
let Hello = (props) = > {
return 组建
}
```
## 精确匹配 -> exact
```
```
## Switch 路由 从上往下匹配 若匹配到一个 下面的就不回去匹配了 更不会去渲染了
```
import React from "react";
import {
// HashRouter as Router, //容器
BrowserRouter as Router, //容器
Route, //一条路由
Link,
} from "react-router-dom";
import "bootstrap/dist/css/bootstrap.css";
import User from "./User";
import Home from "./Home";
import Profile from "./Profile";
export default (
首页
}/>
{props.match.params.name}
} />
)
```
## 实现 登录 和 退出
1. 自己新建一个 组建 去写判断的规则
2. 当通过函数来定义组件的时候参数是属性对象
3. 当一个组件不需要状态的时候可以用函数来声明
###### 当用户访问个人设置的时候,先判断此用户是否登录.如果已经登录则可以直接显示个人设置页面.如果此用户未登录,那么则跳转到登录页面进行登录,如果登录成功则自动跳转回登录前的页面
* 代码如下
```
/*
* 结构赋值
* props = {path:"/profile",component:Profile}
* ...rest 其余运算符
* rest = {path:"/profile"}
*/
import React from 'react';
import {Redirect,Route} from 'react-router-dom'; //Redirect 重定向
export default function ({component:Component,...rest}) {
// ...rest 展开
return
sessionStorage.getItem('login')? :
} />
}
```
###### 跳到login页面
```
import React from 'react';
export default function (props) {
return
Hello!
你还没登录,请登录!
{
sessionStorage.setItem('login','true');
props.history.push(props.location.state.from);
}}
>登录
}
```
* 点击按钮后 跳到 之前重定向前的页面
props.history.push(props.location.state.from);
## route -> children 不管当前路径是否匹配的上,都会渲染对应的组件
```
import React from "react";
import {Route,Link} from "react-router-dom";
export default function ({to,label}) {
return (
//不管匹配不匹配都会去return 出东西
{
console.log(match)
//若匹配则 给一个选中的类名
return {label}
}}/>
)
}
```
## route -> Prompt 路径跳转的 时候进行的提示
* {
return `你确定要离开本页面`;
}}
/>
* Prompt 有两个参数 第一个 when 什么时候提示 传入bool类型
* 第二个 message 提示什么内容
```
import React,{Component} from 'react';
import {Prompt} from "react-router-dom";
export default class UserAdd extends Component{
constructor (props) {
super(props);
this.state = {
blockimg : false, //是否组织跳转 默认不阻止
}
}
//点击提交按钮时
handleSubmit = () =>{
let name = this.name.value;
console.log(name);
// 从缓存中获取用户列表的字符串 null 字符串
let userStr = localStorage.getItem('users');
let users = userStr?JSON.parse(userStr):[];
//添加字符串对象
users.push({id:Date.now(),name});
//存到缓存
localStorage.setItem('users',JSON.stringify(users));
//把离开本页面的提示关掉
this.setState({
blockimg:false
},()=>{
//跳转到用户列表
this.props.history.push('/user/list');
});
}
//input 改变的时候
handleChange = (event) => {
let value = event.target.value;
this.setState({
blockimg:value&&value.length>1?true:false
});
}
render(){
return (
{
return `你确定要离开本页面${location.pathname}`;
}}
/>
)
}
};
```
## 404 页面
```
import React from 'react';
export default (props) => {
return
抱歉!
没找到您访问的页面!
{
props.history.push('/');
}}
>点击跳回首页
}
```
* 在 app页面引用
···
···