ReactRouter4

# Hello

路由是根据不同的网址显示不同的组件,并有一系列API的封装

import React from 'react';
import { HashRouter as Router, Link, Route } from "react-router-dom"

const Home = () => 

首页

; const Prod = () =>

产品

; const User = () =>

用户

; function App() { return ( <> 首页 产品 用户 ) } export default App;

Link 的 to 属性就是要跳转的路由

Rote 中的 path 对应 to ,表示要渲染的组件

exact 表示完全匹配,如果没有,那么 / 或匹配 /* 而不是 /

# Router

组成

BrowserRouter

HashRouter

MemoryRouter

NativeRouter

StaticRouter

其中 BrowserRouter 和 HashRouter 属于浏览器路由

浏览器路由

BrowserRouter 的路由类似 http://localhost:3000/user

HashRouter 的路由类似 http://localhost:3000/#/user

属性

pathname 路由的地址其实是 pathname + path

比如 Router 加上 pathname="api"

使用前:http://localhost:3000/#/user

使用后:http://localhost:3000/#/api/user


  首页
  产品
  用户
  
  
  

forceRefresh 布尔值,是否刷新整个页面,如果为 true ,每次跳转路由都会刷新页面


  首页
  产品
  用户
  
  
  

getUserConfirmation 当导航需要确认时执行的函数,需配合 Prompt 使用

Prompt 写在需要提示的路由中,也可不写 getUserConfirmation ,如果不写,默认是window弹框

写了 getUserConfirmation 后,可以在处理跳转前的逻辑

import React from 'react';
import { HashRouter as Router, Link, Route, Prompt } from "react-router-dom"

const Home = () => 

首页

; const Prod = () =>

产品

; const User = () =>

用户

; const getConfirmation = (message, callback) => { const allowTransition = window.confirm(message) callback(allowTransition) } function App() { return ( <> 首页 产品 用户 ) } export default App;

hashType HashRouter独有,一共有三个值

slash #/api/user

noslash #api/user

hashbang #!/api/user

# Link

属性 to

路由跳转地址,可以是字符串

用户

可是是对象

用户

对象有如下属性:

pathname 跳转地址

search 参数传递

hash 跳转的锚点

state 状态,可以通过 params.location.state 获取

const User = (params) => {
  return params.location.state ? 

{params.location.state.name}

: null; }

属性 replace

布尔值,如果为 true,则访问历史替换原地址

如果为false(默认),访问历史记录添加一项


# NavLink

特殊的 Link

如果在当前路由状态,会默认的添加一个 active 样式

属性:

activeStyle 如果在当前路由状态,可以添加额外的style

activeClassName 如果在当前路由状态,可以添加额外的 class 并替换 active

exact 完全匹配 activeStyle 和 activeClassName 才会生效

# Route

三种使用方式

使用component,默认把参数传到组件中

首页

const Home = (props) => {
  console.log(props);
  return 

首页

; }

使用 render ,需自行把参数添加到组件中

const Prod = (props) => {
  console.log(props);
  return 

产品

; } } />

使用 children,每次都会执行,有一个参数 match 可以判断是否是指定路由

const User = (props) => {
  console.log(props);
  return 

用户

; } { return props.match ? : null; }} />

match

先看一下 match 的结构

{
    isExact: true,
    params: { id: "2" },
    path: "/pro/:id",
    url: "/pro/2"
}

isExact 是否全匹配

params 参数

path 匹配路径格式

url 匹配路径

作用一: 路由参数

可以使用 props.match.params 获取参数

import React from 'react';
import { HashRouter as Router, Link, Route } from "react-router-dom"

const Home = () => 

首页

; const User = () =>

用户

; const ProdDetail = (props) =>

产品:{props.match.params.id}

; const Prod = () => { return ( <> 产品1 产品2 产品3 ) } function App() { return ( <> 首页 产品1 用户 ) } export default App;

作用二:变量提取

const Prod = (props) => {
  const basePath = props.match.url;
  return (
    <>
      产品1
      产品2
      产品3
      
    
  )
}

location

可以拿到 Link:to 中的内容,如果是字符串则拿不到 state

用户

const User = ({ location }) => {
  console.log(location);
  return 

用户

; } // 得到的结果为 { hash: "#h1", pathname: "/user", search: "?name=lisi", state: { name: "张三" } }

history

操作路由的一些 API ,可以从传递的参数中解构获取

const User = ({ history }) => {
  console.log(history);
  return 

用户

; }

属性:

length 堆栈数量

action 当前动作,是跳转过来的(PUSH),还是切换过来的(REPLACE)还是移出的(POP)

方法:

push 跳转路由

replace 替换栈顶路由

go 前进或后退多少路由

goBack 后退1步,相当于 go(-1)

goForward 前进一步,相当于 go(1)

block 阻止跳转

# Redirect

重定向到新的地址

import React from 'react';
import { HashRouter as Router, Link, Route, Redirect } from "react-router-dom"

const Home = () => 

首页

; const Prod = () =>

产品

; const User = () => ; function App() { return ( <> 首页 产品 用户 ) } export default App;

此时点用户,会被重定向到产品路由

常用作配合状态使用,当状态更新时,重定向到其他路由,比如登出

import React, { useState } from 'react';
import { HashRouter as Router, Link, Route, Redirect } from "react-router-dom"

const Home = () => {
  const [isLogin, setisLogin] = useState(true);
  return (
    isLogin ?
      <>
        

恭喜xx登录成功!

setisLogin(false)}>登出

: ) }; const Login = () => { return ( <>

登录页

) }; function App() { return ( <> 首页 ) } export default App;

# Switch

未使用 Switch 前,一个地址可以匹配多个路径

比如以下代码,路径 /pro 可匹配 / 和 /pro ,除非给 Route 加上 exact

<>
  
    首页
    产品
    用户

    
    
    
  

使用 Switch 之后,只会匹配到遇到的第一个路由

比如以下代码,无论是 / 还是 /pro 还是 /user 都是匹配到了首页

<>
  
    首页
    产品
    用户
    
      
      
      
    
  

弱匹配的路由放在后面或者加上 exact 属性

<>
  
    首页
    产品
    用户
    
      
      
      
    
  

Switch 配合 404 页面

<>
  
    首页
    产品
    用户
    
      
      
      
      
    
  

# Prompt

组件确认跳转导航,在路由离开之前弹框,如果点击是,则跳转,否则不跳转

import React from 'react';
import { HashRouter as Router, Link, Route, Switch, Prompt } from "react-router-dom"

const Home = () => 

Home!

; const User = () =>

User!

; const Prod = () =>

Prod!

; function App() { return ( <> 首页 产品 用户 ) } export default App;

当首页跳转其他页时,会提示是否离开首页,如果选是,则离开,否则不离开

message 还可以是一个函数,返回结果作为提示语,函数的参数的location

const Home = () => 

Home! { return `是否离开首页,去${location.pathname}` } }>

;

Prompt 还有一个属性,when,默认为 true , 如果为false,则不提示直接跳转

const Home = () => 

Home! { return `是否离开首页,去${location.pathname}` } }>

;

可以和 getUserConfirmation 配合使用,自定义弹出提示

import React from 'react';
import { HashRouter as Router, Link, Route, Switch, Prompt } from "react-router-dom"

const Home = () => 

Home!

; const User = () =>

User!

; const Prod = () =>

Prod!

; const getUserConfirmation = (message, call) => { const flag = window.confirm(message); call(flag); } function App() { return ( <> 首页 产品 用户 ) } export default App;

你可能感兴趣的:(ReactRouter4)