官方链接:https://reactrouter.com/web/guides/quick-start
(这次的笔记对 React Router 写了几句简单的代码,下回有时间重新把例子补充得好看一些,并做页面展示)
一、实现路由切换
1. 概念理解
用户能够在浏览器上输入不同的 url 得到不同的页面展示,步骤如下:
- 获取输入的 url 中 的 hash 值
- 根据不同 hash 值选择展示不同的页面
// 进入页面let type = window.location.hashif(type === '#register'){//...}else{/...}// 这里写逻辑// 点击「注册」,直接把 window.location.hash 改成 #register// 点击「登录」,直接把 window.location.hash 改成 #login
除了不同 hash 展示不同页面外,还可以改变路径
- 这种方式需要后端支持,要把所有路径都指向首页
window.location.pathname // 不直接修改这个,直接这样改变路径会刷新页面window.history.pushState(state,title,[,url]) // 使用这种方式就不会刷新页面
// 进入页面let type = window.location.pathNameif(type === '#register'){//...}else{/...}// 这里写逻辑// 点击「注册」,通过 window.pushState(state,title,'/register') 修改路径// 点击「登录」,通过 window.pushState(state,title,'/login') 修改路径
2. 简单例子
使用 Hash 模式
import React, { useState } from "react";import ReactDOM from "react-dom";function Tab1() {return (<div>这是页面 1 </div>)}function Tab2() {return (<div>这是页面 2</div>)}function App() {let [tab, setTab] = useState('#tab1')let hashValue = window.location.hashlet tabPage = <Tab1 />if (hashValue === '#tab1') {tabPage = <Tab1 />} else if (hashValue === '#tab2') {tabPage = <Tab2 />} else {tabPage = <Tab2 />}return (<div><button onClick={() => { setTab('tab1'); window.location.hash = '#tab1' }}>切换为 Tab1</button><br /><button onClick={() => { setTab('tab2'); window.location.hash = '#tab2' }}>切换为 Tab2</button>{tabPage}</div>)}const rootElement = document.getElementById("root");ReactDOM.render(<App />, rootElement);
二、使用 React Router
我使用的例子都是 Hash 模式,没有使用 History 模式,React Router 记住以下几个常用标签
- Router
- Link
- Switch
- Route
import React from "react";import ReactDOM from "react-dom";import {HashRouter as Router,Link, Switch, Route} from 'react-router-dom'function Tab1(){return (<div>这是页面 1 </div>)}function Tab2(){return (<div>这是页面 2</div>)}function App(){return (<Router><div><Link to='/tab1'>Tab1</Link><br/><Link to='/tab2'>Tab2</Link><Switch><Route path="/tab1" component={Tab1} /><Route path="/tab2" component={Tab2} /><Route exact path="/" component={Tab1} /></Switch></div></Router>)}const rootElement = document.getElementById("root");ReactDOM.render(<App />,rootElement);
「@浪里淘沙的小法师」
