React 路由

简介: React 路由

ReactRouter三大组件:



  • Router:所有路由组件的根组件(底层组件),包裹路由规则的最外层容器
  • Route: 路由规则匹配组件, 显示当前规则对应的组件
  • Link:路由跳转组件
  • Redirect: 路由重定向
  • replace: 前进后无法后退,常用于登录后
  • push: 页面栈+1
  • Switch:当路由中有一样的路径,就会默认只显示第一个
  • switch:


import react from 'react'
import { BrowserRouter as Router, Link, Route, Redirect, Switch } from 'react-router-dom'
class App extends react.Component {
  render() {
    return (
      <div>
        <Router>
          <Switch>
            <Route path="/" exact component={() => (<h1>首页</h1>) }></Route>
            <Route path="/form" exact component={ FormCom }></Route>
            <Route path="/login" exact component={() => (<h1>登录</h1>) }></Route>
            <Route path="/loginInfo" exact component={ LoginInfo }></Route>
            <Route path="/abc" exact component={() => (<h1>123</h1>)}></Route>
            <Route path="/abc" exact component={() => (<h1>1234</h1>)}></Route>
          </Switch>
        </Router>
      </div>
    )
  }
}
localhost:3000/abc   =>   只显示123
复制代码


注意:如果要精确匹配,那么可以在route上设置exact属性


import React from 'react'
import ReactDom from 'react-dom'
// hash模式
// import { HashRouter as Router, Link, Route } from 'react-router-dom'
// history模式 / 后端配合使用
import { BrowserRouter as Router, Link, Route } from 'react-router-dom'
function Home() {
  return (
    <div>
      <h1>首页</h1>
    </div>
  )
}
function Product() {
  return (
    <div>
      <h1>产品页面</h1>
    </div>
  )
}
function Me() {
  return (
    <div>
      <h1>我的</h1>
    </div>
  )
}
// Router:所有路由组件的根组件(底层组件),包裹路由规则的最外层容器
// Route: 路由规则匹配组件, 显示当前规则对应的组件
// Link:路由跳转组件
class App extends React.Component {
  constructor(props) {
    super(props)
    this.state = {}
  }
  render() {
    return (
      <div id="app">
        <div>所有页面普通内容</div>
        <Router basename="/">  {/* basename 就是在路径前加一个前缀 */}
          <div className="nav">
            <Link to="/">Home</Link>
            <Link to="/product">Product</Link>
            <Link to="/me">个人中心</Link>
          </div>
          <Route path="/" exact component={ Home }></Route>
          <Route path="/product" component={ Product }></Route>
          <Route path="/me" component={ Me }></Route>
        </Router>
      </div>
    )
  }
}
ReactDom.render(<App />, document.getElementById('root'))
复制代码


link组件可以设置to属性来进行页面的跳转, to属性可以直接写路径给字符串, 也可以通过一个对象, 进行路径的设置

如:


import React from 'react'
import ReactDom from 'react-dom'
// hash模式
// import { HashRouter as Router, Link, Route } from 'react-router-dom'
// history模式 / 后端配合使用
import { BrowserRouter as Router, Link, Route } from 'react-router-dom'
function Home() {
  return (
    <div>
      <h1>首页</h1>
    </div>
  )
}
function Product() {
  return (
    <div>
      <h1>产品页面</h1>
    </div>
  )
}
function Me(props) {
  console.log(props)
  return (
    <div>
      <h1>我的</h1>
    </div>
  )
}
// Router:所有路由组件的根组件(底层组件),包裹路由规则的最外层容器
// Route: 路由规则匹配组件, 显示当前规则对应的组件
// Link:路由跳转组件
class App extends React.Component {
  constructor(props) {
    super(props)
    this.state = {}
  }
  render() {
    const meObj = {
      pathname: "/me",  // 跳转的路径
      search: '?username=admin',   // get请求数据
      hash: '#abc',   // 设置的hash值
      state: { msg: 'hello world' } // 传入组件的数据
    }  // 路径拼接
    return (
      <div id="app">
        <div>所有页面普通内容</div>
        <Router basename="/">  {/* basename 就是在路径前加一个前缀 */}
          <div className="nav">
            <Link to="/">Home</Link>
            <Link to="/product">Product</Link>
            <Link to={ meObj }>个人中心</Link>
            {/* replace 删除页面栈,无法后退 */}
            <Link to={ meObj } replace>个人中心</Link>
          </div>
          <Route path="/" exact component={ Home }></Route>
          <Route path="/product" component={ Product }></Route>
          <Route path="/me" component={ Me }></Route>
        </Router>
      </div>
    )
  }
}
ReactDom.render(<App />, document.getElementById('root'))
复制代码


link的replace属性:点击链接后, 将新地址替换成历史访问记录的原地址


动态路由实现



网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


重定向组件: 如果访问某个组件时, 如果有重定向组件, 那么就会修改页面路径,使得页面显示为所定向路径的内容


import React from 'react'
import { BrowserRouter as Router, Route, Link, Redirect } from 'react-router-dom'
function LoginInfo(props) {
  console.log(props)
  if(props.location.state.loginState === 'success') return <Redirect to="/admin"></Redirect>
  else return <Redirect to="login"></Redirect>
}
const FormCom = () => {
  const pathObj = {
    pathname: '/loginInfo',
    state: {
      loginState: 'success'
    }
  }
  return (
    <div>
      <h1>表单验证</h1>
      <Link to={ pathObj }>登录验证后页面</Link>
    </div>
  )
}
class App extends React.Component {
  constructor(props) {
    super(props)
    this.state = {}
  }
  render() {
    return (
      <div>
        <Router>
          <Route path="/" exact component={ () => (<h1>首页</h1>) }></Route>
          <Route path="/form" exact component={ FormCom }></Route>
          <Route path="/login" exact component={ () => (<h1>登录页</h1>) }></Route>
          <Route path="/loginInfo" exact component={ LoginInfo }></Route>
        </Router>
      </div>
    )
  }
}
export default App


相关文章
|
4月前
|
前端开发 JavaScript
React和Vue实现路由懒加载
React和Vue实现路由懒加载
69 2
|
1月前
|
移动开发 资源调度 前端开发
介绍React路由模式
【8月更文挑战第10天】介绍React路由模式
44 12
|
18天前
|
前端开发 Python
React技术栈-React路由插件之自定义组件标签
关于React技术栈中React路由插件自定义组件标签的教程。
37 4
React技术栈-React路由插件之自定义组件标签
|
7天前
|
移动开发 前端开发 应用服务中间件
React两种路由模式的实现原理
React两种路由模式的实现原理
23 3
|
18天前
|
前端开发 程序员 API
React技术栈-React路由插件之react-router的基本使用
这篇博客介绍了React路由插件react-router的基本使用,包括其概念、API、以及如何通过实战案例在React应用中实现SPA(单页Web应用)的路由管理。
36 9
|
23天前
|
资源调度 前端开发 数据安全/隐私保护
react动态路由权限
【8月更文挑战第29天】 react动态路由权限
18 4
|
1月前
|
前端开发 JavaScript 算法
React Server Component 使用问题之想在路由切换时保持客户端状态,如何实现
React Server Component 使用问题之想在路由切换时保持客户端状态,如何实现
|
1月前
|
前端开发 JavaScript PHP
React Server Component 使用问题之路由的能力,如何实现
React Server Component 使用问题之路由的能力,如何实现
|
1月前
|
移动开发 前端开发 API
React路由和HTML5 History API有什么区别
【8月更文挑战第11天】React路由和HTML5 History API有什么区别
30 1
|
1月前
|
移动开发 前端开发 JavaScript
react路由实现原理
【8月更文挑战第11天】react路由实现原理
31 1

热门文章

最新文章