# react-route4 **Repository Path**: xzqyun/react-route4 ## Basic Information - **Project Name**: react-route4 - **Description**: 学习route - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2018-04-26 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 新建项目 ``` create-react-app react20180413 ``` ## 安装路由 ``` npm install react-router-dom -S ``` ## 跑通路由 ``` 删除全部文件后 重新新建index.js 代码如下 import React from 'react'; import ReactDOM from 'react-dom'; import { // HashRouter as Router, //容器 带# BrowserRouter as Router, //容器 推荐用这个 Route //一条路由 } from 'react-router-dom'; function Home () { return

Home

} function User () { return

User

} ReactDOM.render(
,document.querySelector('#root') ); ** 有时候 会报错 A may have only one child element ** 这个是 说 一个Router 下面只 允许 一个 子组件 所以 下面得有一个
包裹起来 可以从外部引入组建 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 ``` ``` ## 路由参数获取 ``` 在 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!

你还没登录,请登录!

} ``` * 点击按钮后 跳到 之前重定向前的页面 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}`; }} />
    this.name=ref} />
    ) } }; ``` ## 404 页面 ``` import React from 'react'; export default (props) => { return

    抱歉!

    没找到您访问的页面!

    } ``` * 在 app页面引用 ··· ···