react&vue路由使用总结(一)

简介: react&vue路由使用总结

1.单页面(spa)应用的特点


顾名思义,整个应用中只有一个页面,Vue和React都是典型的SPA

优点只有在第一次加载时会完整的加载整个页面(由此也就有了spa首次加载慢的性能问题),其他时候都是仅仅更新必要的数据。故用户体验更好,运行更流畅

缺点不利于SEO优化,简单理解SEO优化:因为爬虫只爬取HTML页面中的文本内容,不会执行Js代码。对于这个问题我们的解决方式一般是:通过SSR(服务端渲染),即先在服务端把内容渲染出来,然后返回给浏览器的就是纯HTML内容。

2.react/vue路由核心原理


前端路由是一套映射规则URL路径组件 的对应关系

使用 React 路由简单来说就是:配置路径和组件(配对)

image.png

核心:监听hashChange事件


hash值: localhost:3000/#/page1

#之后的部分就是hash值,它有两个特点:

  1. hash值的变化(地址栏中改了hash值再回车)不会重新发请求。它不是请求路径的一部分。
  2. hash值的变化会触发hashChange事件。

举例:


维护一个状态curHash。

  1. 当hash变化(hashchange事件)时修改它;
  2. 根据curHash的值来决定显示哪个组件

举例代码


目录结构

pages/Comment.jsx
pages/Home.jsx
pages/Search.jsx
index.js

index.js

import React, { useEffect, useState } from 'react'
import Home from './pages/Home.jsx'
import Search from './pages/Search.jsx'
import Comment from './pages/Comment.jsx'
import ReactDom from 'react-dom'
export default function App () {
  const [curHash, setCurHash] = useState('')
  useEffect(() => {
    const onChange = () => {
      // console.log(window.location.hash)
      setCurHash(window.location.hash.slice(1))
    }
    onChange()
    window.addEventListener('hashchange', onChange)
    return () => {
      window.removeEventListener('hashchange', onChange)
    }
  }, [])
  return (
    <div>
      <ul>
        <li>
          <a href="#/home">首页</a>
        </li>
        <li>
          <a href="#/comment">评论</a>
        </li>
        <li>
          <a href="#/search">搜索</a>
        </li>
      </ul>
      <hr />
      {curHash === '/home' && <Home />}
      {curHash === '/search' && <Search />}
      {curHash === '/comment' && <Comment />}
    </div>
  )
}
ReactDom.render(<App />, document.getElementById('root'))

3.React路由使用的基本


步骤

安装包。npm i react-router-dom@5.3.

这个包提供了三个核心的组件:HashRouter, Route, Link

导入包,并使用。import { HashRouter, Route, Link } from 'react-router-dom'

使用HashRouter包裹整个应用,一个项目中只会有一个Router

使用Link指定导航链接

使用Route指定路由规则(哪个路径展示哪个组件)

代码举例:

import React from 'react'
import ReactDom from 'react-dom'
import { HashRouter, Route, Link } from 'react-router-dom'
import Search from './pages/Search.jsx'
import Comment from './pages/Comment.jsx'
export default function App () {
  return (
    <div>
      <h1>react路由基本使用</h1>
      <HashRouter>
        <Link to="/comment">评论</Link>
        <Link to="/search">搜索</Link>
        <Route path="/comment" component={Comment} />
        <Route path="/search" component={Search} />
      </HashRouter>
    </div>
  )
}
ReactDom.render(<App />, document.getElementById('root'))

4.路由三大对象之-Router


目标


了解两种路由

HashRouter :hash模式

BrowserRouter: history模式

内容


Router 组件:包裹整个应用,一个 React 应用只需要使用一次

两种常用 Router:HashRouterBrowserRouter

HashRouter:使用 URL 的哈希值实现(http://localhost:3000/#/first)

原理:监听 window 的 hashchange 事件来实现的

(推荐)BrowserRouter:使用 H5 的 history.pushState() API 实现(http://localhost:3000/first)

原理:监听 window 的 popstate 事件来实现的

举例:


使用es6的导入重命名来统一名字: 无论导入的是哪个路由对象,都叫Router

import { BrowserRouter as Router, Route, Link } from 'react-router-dom'
import { HashRouter as Router, Route, Link } from 'react-router-dom'
<Router>

5.路由三大对象之-Link


目标


掌握Link和NavLink的区别;

能使用NavLink设置高亮效果;

import { Link, NavLink } from 'react-router-dom'

Link


Link组件最终会渲染成a标签,用于指定路由导航

  • to属性,将来会渲染成a标签的href属性
  • Link组件无法展示哪个link处于选中的效果

NavLink


NavLink组件,一个更特殊的Link组件,可以用用于指定当前导航高亮

格式:

<NavLink to="/xxx" activeClassName="active">链接</NavLink>

说明:

  • to属性,用于指定地址,会渲染成a标签的href属性
  • activeClassName: 用于指定高亮的类名,默认active。一般不去修改。
  • exact: 精确匹配,表示必须地址栏和to的属性值 精确匹配类名才生效

测试代码


import React from 'react'
import ReactDom from 'react-dom'
import { BrowserRouter as Router, Route, Link, NavLink } from 'react-router-dom'
import Search from './pages/Search.jsx'
import Comment from './pages/Comment.jsx'
export default function App () {
  return (
    <div>
      <h1>react路由基本使用-Link</h1>
      <Router>
        <div>
          Link:
          <Link to="/search">搜索</Link>
          <Link to="/comment">评论</Link>
        </div>
        <div>
          NavLink: 自带高亮类
          <NavLink to="/" exact>主页</NavLink>
          <NavLink to="/search">搜索</NavLink>
          <NavLink to="/comment">评论</NavLink>
        </div>
        <Route path="/comment" component={Comment} />
        <Route path="/search" component={Search} />
      </Router>
    </div>
  )
}
ReactDom.render(<App />, document.getElementById('root'))

小结


  1. link和NavLink都用来做路由跳转。它们都用属性来指定跳转地址
  2. link和NavLink的区别是,NavLink指向的路径会自带一个名为____的css类名

6.路由三大对象之-Route


目标


掌握配置路由规则

浏览器的路径和path的匹配成功,就会显示组件

route的作用和格式


  1. 作用: 决定路由匹配规则
  2. 格式:<Route path="/xx/xx" component={组件}></Route>

匹配规则


名词约定:

  1. path: Route组件中path属性的值
  2. pathname: 指的如下格式
  1. link组件中to的属性值
  2. 地址栏中的地址

模糊匹配规则

  1. 只要pathname以path开头就算匹配成功
  2. 匹配成功就加载对应组件;
  1. 整个匹配过程是逐一匹配,一个匹配成功了,并不会停止匹配

模糊匹配和精确匹配

  1. 默认是模糊匹配的
  2. 补充exact可以设置成精确匹配

示例


import React from 'react'
import ReactDom from 'react-dom'
import { BrowserRouter as Router, Route, NavLink } from 'react-router-dom'
const Home = () => <div>主页</div>
const Article = () => <div>文章列表页</div>
const ArticleDetail = () => <div>文章详情页</div>
export default function App () {
  return (
    <div>
      <h1>react路由基本使用</h1>
      <Router>
        <NavLink to="/">主页</NavLink>&nbsp;
        <NavLink to="/article">文章列表页</NavLink>&nbsp;
        <NavLink to="/article/123">文章详情页-123</NavLink>&nbsp;
        <hr />
        <Route path="/" component={Home} />
        <Route path="/article" component={Article} />
        <Route path="/article/123" component={ArticleDetail} />
      </Router>
    </div>
  )
}
ReactDom.render(<App />, document.getElementById('root'))

exact


<Route path="/" exact component={Home} />

小结


  • path 的说明
  • 默认情况下,/能够匹配任意/开始的路径
  • 如果 path 的路径匹配上了,那么就可以对应的组件就会被 render
  • exact , exact 表示精确匹配某个路径
  • 一般来说,如果路径配置了 /, 都需要配置 exact 属性
相关文章
|
1月前
|
前端开发 API UED
React 路由守卫 Guarded Routes
【10月更文挑战第26天】本文介绍了 React 中的路由守卫(Guarded Routes),使用 `react-router-dom` 实现权限验证、登录验证和数据预加载等场景。通过创建 `AuthContext` 管理认证状态,实现 `PrivateRoute` 组件进行路由保护,并在 `App.js` 中使用。文章还讨论了常见问题和易错点,提供了处理异步操作的示例,帮助开发者提升应用的安全性和用户体验。
53 1
|
29天前
|
存储 缓存 JavaScript
如何优化React或Vue应用的性能
需要注意的是,性能优化是一个持续的过程,需要根据具体的应用场景和性能问题进行针对性的优化。同时,不同的项目和团队可能有不同的优化重点和方法,要结合实际情况灵活运用这些优化策略,以达到最佳的性能效果。
108 51
|
1月前
|
前端开发 安全 网络安全
React——路由Route
React——路由Route
35 2
React——路由Route
|
29天前
|
监控 JavaScript 前端开发
如何在实际应用中测试和比较React和Vue的性能?
总之,通过多种方法的综合运用,可以相对客观地比较 React 和 Vue 在实际应用中的性能表现,为项目的选择和优化提供有力的依据。
34 1
|
1月前
|
JavaScript 前端开发 开发者
React和Vue有什么区别?
React 和 Vue 都有各自的优势和特点,开发者可以根据项目的需求、团队的技术背景以及个人的喜好来选择使用。无论是 React 还是 Vue,它们都在不断发展和完善,为前端开发提供了强大的支持。
77 2
|
1月前
|
JavaScript 前端开发 测试技术
React和Vue的性能对比如何?
需要注意的是,性能不仅仅取决于框架本身,还与开发者的代码质量、架构设计以及项目的优化程度等密切相关。因此,在评估性能时,应该综合考虑多个因素,而不是仅仅局限于框架之间的比较。
119 1
|
1月前
|
JavaScript 前端开发 算法
React 框架和 Vue 框架的区别是什么?
React框架和Vue框架都是目前非常流行的前端JavaScript框架,它们在很多方面存在区别
|
1月前
|
前端开发 JavaScript 开发者
React与Vue:前端框架的巅峰对决与选择策略
【10月更文挑战第23天】React与Vue:前端框架的巅峰对决与选择策略
|
1月前
|
前端开发 JavaScript 数据管理
React与Vue:两大前端框架的较量与选择策略
【10月更文挑战第23天】React与Vue:两大前端框架的较量与选择策略
|
1月前
|
JavaScript 前端开发 算法
在性能上,React和Vue有什么区别
【10月更文挑战第23天】在性能上,React和Vue有什么区别
21 1