此篇章不会从头开始介绍 React Router,而是挑选一些它的功能去做介绍,因此本篇的范例皆是从 React Router 官网找的范例。
React Router 实际上是由好几个 package 组成,如图所示:
首先第一个介绍的功能是巢状路由,我们不只可以在最父层的元件建立 Router,也可以在子元件建立 Router,让元件根据 Router 去做渲染。
可以看到 App 元件的子元件 Topics 也设定了 Router:
关於 useRouteMatch、useParams 等 hook 会在後面做介绍
import React from "react";
import {
BrowserRouter as Router,
Switch,
Route,
Link,
useRouteMatch,
useParams
} from "react-router-dom";
export default function App() {
return (
<Router>
<div>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
<li>
<Link to="/topics">Topics</Link>
</li>
</ul>
<Switch>
<Route path="/about">
<About />
</Route>
<Route path="/topics">
<Topics />
</Route>
<Route path="/">
<Home />
</Route>
</Switch>
</div>
</Router>
);
}
function Home() {
return <h2>Home</h2>;
}
function About() {
return <h2>About</h2>;
}
function Topics() {
let match = useRouteMatch();
return (
<div>
<h2>Topics</h2>
<ul>
<li>
<Link to={`${match.url}/components`}>Components</Link>
</li>
<li>
<Link to={`${match.url}/props-v-state`}>
Props v. State
</Link>
</li>
</ul>
<Switch>
<Route path={`${match.path}/:topicId`}>
<Topic />
</Route>
<Route path={match.path}>
<h3>Please select a topic.</h3>
</Route>
</Switch>
</div>
);
}
function Topic() {
let { topicId } = useParams();
return <h3>Requested topic ID: {topicId}</h3>;
}
当某个页面有表单并且使用者开始填写但还未送出表单时,若使用者想连到其他画面会跳出提醒,避免使用者误触连结跳转到其他画面。
import React, { useState } from "react";
import {
BrowserRouter as Router,
Switch,
Route,
Link,
Prompt
} from "react-router-dom";
export default function PreventingTransitionsExample() {
return (
<Router>
<ul>
<li>
<Link to="/">Form</Link>
</li>
<li>
<Link to="/one">One</Link>
</li>
<li>
<Link to="/two">Two</Link>
</li>
</ul>
<Switch>
<Route path="/" exact children={<BlockingForm />} />
<Route path="/one" children={<h3>One</h3>} />
<Route path="/two" children={<h3>Two</h3>} />
</Switch>
</Router>
);
}
function BlockingForm() {
let [isBlocking, setIsBlocking] = useState(false);
return (
<form
onSubmit={event => {
event.preventDefault();
event.target.reset();
setIsBlocking(false);
}}
>
<Prompt
when={isBlocking}
message={location =>
`Are you sure you want to go to ${location.pathname}`
}
/>
<p>
Blocking?{" "}
{isBlocking ? "Yes, click a link or the back button" : "Nope"}
</p>
<p>
<input
size="50"
placeholder="type something to block transitions"
onChange={event => {
setIsBlocking(event.target.value.length > 0);
}}
/>
</p>
<p>
<button>Submit to stop blocking</button>
</p>
</form>
);
}
React router 对带有 Query Parameters 的 url 没有限制,可以直接写成路由。
另外也可以透过浏览器的 API "URLSearchParams" 去取出 query 值。
import React from "react";
import {
BrowserRouter as Router,
Link,
useLocation
} from "react-router-dom";
export default function QueryParamsExample() {
return (
<Router>
<QueryParamsDemo />
</Router>
);
}
function useQuery() {
return new URLSearchParams(useLocation().search);
}
function QueryParamsDemo() {
let query = useQuery();
return (
<div>
<div>
<h2>Accounts</h2>
<ul>
<li>
<Link to="/account?name=netflix">Netflix</Link>
</li>
<li>
<Link to="/account?name=zillow-group">Zillow Group</Link>
</li>
<li>
<Link to="/account?name=yahoo">Yahoo</Link>
</li>
<li>
<Link to="/account?name=modus-create">Modus Create</Link>
</li>
</ul>
<Child name={query.get("name")} />
</div>
</div>
);
}
function Child({ name }) {
return (
<div>
{name ? (
<h3>
The <code>name</code> in the query string is "{name}
"
</h3>
) : (
<h3>There is no name in the query string</h3>
)}
</div>
);
}
以上只是简单介绍几个功能,在阅读完 React router 的官方文件後,觉得开发者将 React router 的各项功能、元件作用写得相当清楚,也有附上 Demo 范例,除此之外也有分成 React 和 React native 两种文件,可以点击官方连结详细阅读罗!
>>: [区块链&DAPP介绍 Day24] Dapp 实战 部署第一个 Dapp
上次文章终於迎来续集 我的第一个RWD网页 这次的网页练习跟上次的网页是同系列的,不过这次可是有记起...
网路层 1.无线wifi WiFi是从1999年成立了一个 Wireless Ethernet C...
创建App-Google sign in my App 本App设想登入方法有Google、Appl...
大家好我是乌木白!今天要和大家讲 axios 基本语法~ 在处理 AJAX 的时候,有一些套件可以...
二元搜寻树(Binary Search Tree),也称有序/排序二元树,是一种特殊二元树结构,而节...