React路由 | 青训营笔记

92 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第11天

SPA的理解

SAP(single page web application)的意思是单页Web应用,正如前言所说,一般来说功能较为复杂都会涉及到页面跳转的功能,而传统的前端页面跳转往往是利用<a/>标签进行跳转,这种方式虽然可以实现功能,但是每次跳转到新的页面都会重新对页面的元素进行加载,这样其实对于用户来说是不太友好的。而单页Web应用则较好的解决了这个问题,因为SAP整个应用都是在一个页面上进行的,每次的页面跳转只涉及到页面中对应组件(模块)的更新操作,这样就在一定程度上让页面不需要加载重复的页面元素。

  1. 单页Web应用(single page web application,SPA)。
  1. 整个应用只有一个完整的页面
  1. 点击页面中的链接不会刷新页面,只会做页面的局部更新。
  1. 数据都需要通过ajax请求获取, 并在前端异步展现。

路由的理解

1. 什么是路由?

  1. 一个路由就是一个映射关系(key:value)
  1. key为路径, value可能是function或component

2. 路由分类

  1. 后端路由:
  1. 理解: value是function, 用来处理客户端提交的请求。

  2. 注册路由: router.get(path, function(req, res))

  3. 工作过程:当node接收到一个请求时, 根据请求路径找到匹配的路由, 调用路由中的函数来处理请求, 返回响应数据

  1. 前端路由:
  1. 浏览器端路由,value是component,用于展示页面内容。

  2. 注册路由:

  3. 工作过程:当浏览器的path变为/test时, 当前路由组件就会变为Test组件

import React, { Component } from 'react'
import {NavLink,Route} from 'react-router-dom'
import Home from './pages/Home' //Home是路由组件
import About from './pages/About' //About是路由组件
import Header from './components/Header' //Header是一般组件export default class App extends Component {
    render() {
        return (
            <div>
                <div className="row">
                    <div className="col-xs-offset-2 col-xs-8">
                        <Header/>
                    </div>
                </div>
                <div className="row">
                    <div className="col-xs-2 col-xs-offset-2">
                        <div className="list-group">
​
                            {/* 原生html中,靠<a>跳转不同的页面 */}
                            {/* <a className="list-group-item" href="./about.html">About</a>
                            <a className="list-group-item active" href="./home.html">Home</a> */}
​
                            {/* 在React中靠路由链接实现切换组件--编写路由链接 */}
                            <NavLink activeClassName="atguigu" className="list-group-item" to="/about">About</NavLink>
                            <NavLink activeClassName="atguigu" className="list-group-item" to="/home">Home</NavLink>
                        </div>
                    </div>
                    <div className="col-xs-6">
                        <div className="panel">
                            <div className="panel-body">
                                {/* 注册路由 */}
                                <Route path="/about" component={About}/>
                                <Route path="/home" component={Home}/>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        )
    }
}
​