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


相关文章
|
3月前
|
前端开发 JavaScript
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
本文介绍了在React项目中实现路由懒加载的方法,使用React提供的`lazy`和`Suspense`来优化项目首次加载的速度。通过将路由组件改为懒加载的方式,可以显著减少初始包的大小,从而加快首次加载速度。文章还展示了如何使用`Suspense`组件包裹`Switch`来实现懒加载过程中的fallback效果,并提供了使用前后的加载时间对比,说明了懒加载对性能的提升作用。
263 2
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
|
1月前
|
前端开发 API UED
React 路由守卫 Guarded Routes
【10月更文挑战第26天】本文介绍了 React 中的路由守卫(Guarded Routes),使用 `react-router-dom` 实现权限验证、登录验证和数据预加载等场景。通过创建 `AuthContext` 管理认证状态,实现 `PrivateRoute` 组件进行路由保护,并在 `App.js` 中使用。文章还讨论了常见问题和易错点,提供了处理异步操作的示例,帮助开发者提升应用的安全性和用户体验。
56 1
|
4月前
|
移动开发 资源调度 前端开发
介绍React路由模式
【8月更文挑战第10天】介绍React路由模式
65 12
|
1月前
|
前端开发 安全 网络安全
React——路由Route
React——路由Route
36 2
React——路由Route
|
2月前
|
资源调度 前端开发 测试技术
React Router 路由管理
【10月更文挑战第10天】本文介绍了 React Router,一个在 React 应用中管理路由的强大工具。内容涵盖基本概念、安装与使用方法、常见问题及解决方案,如路由嵌套、动态路由和路由守卫等,并提供代码示例。通过学习本文,开发者可以更高效地使用 React Router,提升应用的导航体验和安全性。
334 19
|
2月前
|
前端开发 网络架构
React 路由
10月更文挑战第11天
38 2
|
2月前
|
前端开发 JavaScript 网络架构
实现动态路由与状态管理的SPA——使用React Router与Redux
【10月更文挑战第1天】实现动态路由与状态管理的SPA——使用React Router与Redux
49 1
|
3月前
|
前端开发 Python
React技术栈-React路由插件之自定义组件标签
关于React技术栈中React路由插件自定义组件标签的教程。
66 4
React技术栈-React路由插件之自定义组件标签
|
3月前
|
移动开发 前端开发 应用服务中间件
React两种路由模式的实现原理
React两种路由模式的实现原理
118 3
|
3月前
|
前端开发 程序员 API
React技术栈-React路由插件之react-router的基本使用
这篇博客介绍了React路由插件react-router的基本使用,包括其概念、API、以及如何通过实战案例在React应用中实现SPA(单页Web应用)的路由管理。
92 9