icodingicoding
主页
JavaScript
Vue
React
TypeScript
Node
bug
笔记
时间线
主页
JavaScript
Vue
React
TypeScript
Node
bug
笔记
时间线
  • 基础

    • React 概述
    • react 组件
  • 进阶

    • 学习目标
    • 组件的生命周期
    • setState
    • 单页应用程序

单页应用程序

  • SPA: Single Page Application 单页面应用程序,整个应用中只有一个页面(index.html)
  • MPA : Multiple Page Application多页面应用程序,整个应用中有很多个页面(*.html)

SPA网易云音乐

优势

  1. 加快页面响应速度,降低了对服务器的压力
    • 传统的多页面应用程序,每次请求服务器返回的都是一整个完整的页面
    • 单页面应用程序只有第一次会加载完整的页面,以后每次请求仅仅获取必要的数据
  2. 更好的用户体验,运行更加流畅

单页vs多页

缺点

不利于 SEO 搜索引擎优化

  • 因为 爬虫 只爬取 HTML 页面中的文本内容,不会执行 JS 代码
  • 可以通过 SSR(服务端渲染 Server Side Rendering)来解决 SEO 问题
    • 解释:先在服务器端把内容渲染出来,然后,返回给浏览器的就是纯 HTML 内容了
  • 页面静态化,比如,对于一个电商应用可以为每一个商品生产一个静态的 HTML 页面,静态 HTML 页面中是带有文字内容的,所以,有利于 SEO 的

React 路由

  • React 路由介绍
  • 路由的基本使用
  • 路由的执行过程
  • 路由的常用操作

React 路由介绍

现代的前端应用大多都是 SPA(单页应用程序),也就是只有一个 HTML 页面的应用程序。因为它的用户体验更好、对服务器的压力更小,所以更受欢迎。为了有效的使用单个页面来管理原来多页面的功能,前端路由应运而生。前端路由的功能:让用户从一个视图(页面)导航到另一个视图(页面)

  • 前端路由是一套映射规则,在 React 中,是 URL 路径 与 组件 的对应关系
  • 使用 React 路由简单来说就是:配置路径和组件(配对)

路由是一套规则1路由是一套规则2

模拟路由的实现

import React, { PureComponent } from "react";
import ReactDOM from "react-dom";
import Home from "./pages/Home";
import My from "./pages/My";
import Friend from "./pages/Friend";
class App extends PureComponent {
  state = {
    currentHash: "",
  };
  // hashchange: 锚点值(hash)改变就会触发
  componentDidMount() {
    // 注册事件
    window.addEventListener("hashchange", () => {
      console.log("hash值变了", window.location.hash);
      this.setState({
        currentHash: window.location.hash.slice(1),
      });
    });
  }
  render() {
    const { currentHash } = this.state;
    return (
      <div>
        <h1>app组件</h1>
        <ul>
          <li>
            <a href="#/home">首页</a>
          </li>
          <li>
            <a href="#/my">我的音乐</a>
          </li>
          <li>
            <a href="#/friend">我的朋友</a>
          </li>
        </ul>
        {currentHash === "/home" && <Home></Home>}
        {currentHash === "/my" && <My></My>}
        {currentHash === "/friend" && <Friend></Friend>}
      </div>
    );
  }
}

// 渲染组件
ReactDOM.render(<App />, document.getElementById("root"));

路由基本使用

官网

基本步骤

  • 安装
yarn add react-router-dom
  • react-router-dom这个包提供了三个核心的组件
import { HashRouter, Route, Link } from "react-router-dom";
  • 使用HashRouter包裹整个应用,一个项目中只会有一个 Router
<Router>
  <div className="App">// … 省略页面内容</div>
</Router>
  • 使用 Link 指定导航链接
<Link to="/first">页面一</Link>
<Link to="/two">页面二</Link>
  • 使用Route指定路由规则
// 在哪里写的Route,最终匹配到的组件就会渲染到这
<Route path="/first" component={First}></Route>

Router 详细说明

  • Router 组件:包裹整个应用,一个 React 应用只需要使用一次
  • 两种常用 Router:HashRouter 和 BrowserRouter
  • HashRouter:使用 URL 的哈希值实现(http://localhost:3000/#/first)
    • 原理:监听 window 的 hashchange 事件来实现的
  • (推荐)BrowserRouter:使用 H5 的 history API 实现(http://localhost:3000/first)
    • 原理:监听 window 的 popstate 事件来实现的

最佳实践

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

路由的执行过程

  1. 点击 Link 组件(a 标签),修改了浏览器地址栏中的 url
  2. React 路由监听到地址栏 url 的变化 hashChange popState
  3. React 路由内部遍历所有 Route 组件,使用路由规则(path)与 pathname(hash)进行匹配
  4. 当路由规则(path)能够匹配地址栏中的 pathname(hash) 时,就展示该 Route 组件的内容

Link 与 NavLink

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

  • to 属性,将来会渲染成 a 标签的 href 属性
  • Link组件无法实现导航的高亮效果

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

  • to 属性,用于指定地址,会渲染成 a 标签的 href 属性
  • activeClass: 用于指定高亮的类名,默认active
  • exact: 精确匹配,表示必须精确匹配类名才生效

Route

  • path 的说明
    • 默认情况下,/能够匹配任意/开始的路径
    • 如果 path 的路径匹配上了,那么就可以对应的组件就会被 render
    • 如果 path 没有匹配上,那么会 render null
    • 如果没有指定 path,那么一定会被渲染
  • exact 的说明, exact 表示精确匹配某个路径
    • 一般来说,如果路径配置了 /, 都需要配置 exact 属性

Switch 与 404

  • 通常,我们会把Route包裹在一个Switch组件中

  • 在Switch组件中,不管有多少个路由规则匹配到了,都只会渲染第一个匹配的组件

  • 通过Switch组件非常容易的就能实现 404 错误页面的提示

<Switch>
  <Route exact path="/" component={Home} />
  <Route path="/about" component={About} />
  <Route path="/user" component={User} />
  <Route component={NoMatch} />
</Switch>

嵌套路由的配置

  • 在 React 中,配置嵌套路由非常的简单,因为Route就是一个组件,可以在任意想配置的地方进行配置

  • 但是配置嵌套路由的时候,需要对路径进行处理,必须要先匹配到父级路由,才能匹配到子路由

// 通过/home可以匹配Home父组件  再通过/list匹配子组件
<Route path="/home/list" component={List} />

编程式导航

  • 场景:点击登录按钮,登录成功后,通过代码跳转到后台首页,如何实现?
  • 编程式导航:通过 JS 代码来实现页面跳转
  • history 是 React 路由提供的,用于获取浏览器历史记录的相关信息
  • push(path):跳转到某个页面,参数 path 表示要跳转的路径
  • go(n): 前进或后退到某个页面,参数 n 表示前进或后退页面数量(比如:-1 表示后退到上一页)
class Login extends Component {
    handleLogin = () => {
        // ...
        this.props.history.push('/home')
    }
    render() {...省略其他代码}
}

动态路由与路由参数获取

  • 可以使用:id的方式来配置动态的路由参数
// 可以匹配 /users/1  /users/2  /users/xxx
<Route path="/users/:id" component={Users} />
  • 在组件中,通过props可以接收到路由的参数
render(){
    console.log(this.props.match.params)
}
最后编辑:
上一页
setState