react-router-dom學習
react-router-dom
主要由三個類別的元件
- 路由器:
, - 路由匹配器:
, - 導航:,
,
也稱導航元件為路由改變元件。
每個React Router應用程式的核心都應該是一個路由元件(Route)。
對於一個web應用而言,主要由兩個路由元件
他是最常規的URL路徑,需要配置於路由路徑一直的服務端,在react中支援開箱即用。
無狀態的路由。
將當前位置儲存在URL的雜湊部分,因此URL看起來像是:http://example.com/#/your/page
由於hash值永遠不會被傳遞到後端服務,因此,不需要特殊的伺服器配置。
路由匹配器
有兩個路由匹配器
當使用
如果沒有找到對應的
注意:
<div> <Switch> <Route path="/about"> <About /> </Route> <Route path="/contact/:id"> <Contact /> </Route> <Route path="/contact"> <AllContacts /> </Route> <Route path="/"> <Home /> </Route> </Switch> </div> ReactDOM.render( <Router> <App /> </Router> )
導骯
元件用來在應用中建立一個連結,無論在何處使用元件,都見在HTML文件中建立一個錨點() ```jsx Home//等同於
## <NavLink> <NavLink>是一個特殊的<Link>,當他的‘to’屬性匹配到當前位置時,它可以將自身設定為 ‘active’ 狀態。 ```jsx <NavLink to="/react" activeClassName="hurry"> React </NavLink> //當URL時 /react 時,這個元件將會渲染: <a href="/react" className="hurry">React</a> //當URL時其他時,將會渲染: <a href="/react">React</a>
在任何時候如果想使用強制導航,都可以使用
<Redirect to="/login" />
API
useHistory
這個鉤子函式使您可以訪問可用於當行的歷史記錄例項。
import { useHistory } from "react-router-dom";
function HomeButton() {
let history = useHistory();
function handleClick() {
history.push("/home");
}
return (
<button type="button" onClick={handleClick}>
Go home
</button>
);
}
useLocation
返回表示當前URL的位置物件。類似於useState,它在URL改變時返回一個新的位置。
import React from "react";
import ReactDOM from "react-dom";
import {
BrowserRouter as Router,
Switch,
useLocation
} from "react-router-dom";
function usePageViews() {
let location = useLocation();
React.useEffect(() => {
ga.send(["pageview", location.pathname]);
}, [location]);
}
function App() {
usePageViews();
return <Switch>...</Switch>;
}
ReactDOM.render(
<Router>
<App />
</Router>,
node
);
useParams
返回URL引數的鍵/值對物件,使用它來訪問當前
import React from "react";
import ReactDOM from "react-dom";
import {
BrowserRouter as Router,
Switch,
Route,
useParams
} from "react-router-dom";
function BlogPost() {
let { slug } = useParams();
return <div>Now showing post {slug}</div>;
}
ReactDOM.render(
<Router>
<Switch>
<Route exact path="/">
<HomePage />
</Route>
<Route path="/blog/:slug">
<BlogPost />
</Route>
</Switch>
</Router>,
node
);
useRouteMatch
該鉤子函式嘗試以與
import { Route } from "react-router-dom";
function BlogPost() {
return (
<Route
path="/blog/:slug"
render={({ match }) => {
// Do whatever you want with the match...
return <div />;
}}
/>
);
}
//可以使用以下程式碼替換
import { Route } from "react-router-dom";
function BlogPost() {
return (
<Route
path="/blog/:slug"
render={({ match }) => {
// Do whatever you want with the match...
return <div />;
}}
/>
);
}
//或者
import { Route } from "react-router-dom";
function BlogPost() {
return (
<Route
path="/blog/:slug"
render={({ match }) => {
// Do whatever you want with the match...
return <div />;
}}
/>
);
}
這是一個
該元件包含以下5個屬性:
- basename: string
有前導斜槓沒有結尾斜槓。 - getUserConfirmation: func
確認導航,預設使用window.confirm - forceRefresh: bool
整個頁面強制重新整理。 - keyLength: number
location.key 的長度,預設是6 - children: node
渲染的子元素
<BrowserRouter
basename="/calendar"
getUserConfirmation={(message, callback) => {
// this is the default behavior
const allowTransition = window.confirm(message);
callback(allowTransition);
}}
forceRefresh={true}
keyLength={12}
>
<Link to="/today"/> // renders <a href="/calendar/today">
<Link to="/tomorrow"/> // renders <a href="/calendar/tomorrow">
...
</BrowserRouter>
- basename: string
有前導斜槓沒有結尾斜槓。 - getUserConfirmation: func
確認導航,預設使用window.confirm - hashType: string
window.location.hash的字元編碼型別,可選值:
+ slash (default)
例如:#/ 和 #/sunshine/lollio
+ noslash
例如:# 和 #sunshine/lollio
+ hashbang
例如:#!/ 和 #!/sunshine/lollio - children: node
圍繞應用程式提供宣告性的可訪問導航
-
to: string
-
to: object
- pathname
- search
- hash
- state
-
to: func
-
replace: bool
如果為true,則在點選連結時,將會替換歷史記錄堆疊中的當前條目,而不是新增新的條目。 -
innerRef: func
-
innerRef: RefObject
-
components: React.Component
如果想使用自己的導航元件,可以使用這個屬性。 -
others
- className: string | func
- activeClassName: string
- style: object | func
如果使用函式,連結狀態將作為引數傳遞。之後的版本中將會刪除該屬性,使用函式樣式代替內聯樣式。<NavLink to="/faq" style={isActive => ({ color: isActive ? "green" : "blue" })} > FAQs </NavLink>
- activeStyle: object
active狀態下顯示該屬性的樣式。<NavLink to="/faq" activeStyle={{ fontWeight: "bold", color: "red" }} > FAQs </NavLink>
- exact: bool
如果為true,則僅當loaction完全匹配時,才會應用active的樣式。<NavLink exact to="/faq"> FAQs </NavLink>
- strict: bool
<NavLink strict to="/faq"> FAQs </NavLink>
- isActive: func
<NavLink to="/events/123" isActive={(match, location) => { if (!match) { return false; } // only consider an event active if its event id is an odd number const eventID = parseInt(match.params.eventID); return !isNaN(eventID) && eventID % 2 === 1; }} > Event 123 </NavLink>
- location: object
isActive比較當前歷史位置(通常時當前瀏覽器URL)。要與不同的位置進行比較,可以傳遞一個位置 - aria-current: string
- to: string
- to: object
- push: bool
- from: string
- exact: bool
- strict: bool
- sensitive: bool
一個
- initialEntries: array
- initialIndex: number
- getUserConfirmation: func
- keyLength: number
- children: node