react-router
SSR 與 CSR ?
SSR => server side render
CSR => client side render
SSR
app.get('/', function (req, res) {
res.send('hello world');
})
app.get('/hello', function (req, res) {
res.send('你好');
})
app.get('/hello/:name', function (req, res) {
res.send('你好, ' + req.params.name);
})
CSR
<Switch>
<Route path="/evaluations/:evaluationId/presentation" render={() => null} />
<Route path="/cases/:programId" render={() => null} />
<Route path="/cases/:programId/recusals/:recusalIndex/print" render={() => null} />
<Route component={SiteHeader} />
</Switch>
所以 CSR 可以幹嘛 ?
- SPA(Single Page Application)
畫面僅需 重新 render 所需要改變的部分 - 通過管理 URL,實現頁面以及狀態切換
可以「模組化」
click <Link />
switch URL
render component
環境建置
沒啥特別 => 看
基本操作 <Route> <Link>
function App() {
return (
<Router>
<div>
<Header />
<Route exact path="/" component={Home} />
<Route path="/about" component={About} />
<Route path="/topics" component={Topics} />
</div>
</Router>
);
}
你在的頁面
想要切換渲染的 component
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about/">About</Link>
</li>
<li>
<Link to="/users/">Users</Link>
</li>
</ul>
</nav>
link 提供一個
超連結到對應的
網址
click <Link />
switch URL
render component
隨著需要的頁面越多,變化開始有越來越多對應的網址
例如:部落格的文章頁面,商城的商品頁
那怎麼能一次把這些需求寫死吧?
因此,我們要用 “參數” 來指定 routing 的規則。
<Route path="/posts/:id?" component={PostRender} / >
<Route path="/posts/:id?" component={PostRender} / >
- 當你定義這行時,你事實上就定義了指定的 component (i.e. PostRender) 的 props.match.params 多了一個 “id” 這個 property
- 換句話說,當你連結 “…/posts/3838” 的時候,就等於把 3838 當作參數傳給 PostRender 的 props.match.params.id, 你可以在 PostRender 裡頭根據 id 去處理拿到文章的邏輯。
因此子層的 component會這樣寫
function ProgramDetailPage({
match: {
params: {
programId,
},
},
}: ContextRouter) {
return (
<div style={styles.container}>
<Query
variables={{
id: programId,
}}
query={SCHEDULED_PROGRAM_DETAIL}>
{({ loading }) => {
if (loading) return <LoadingSpinner />;
return (
...
);
}
exact: bool
When true, will only match if the path matches the location.pathname exactly.
// 列舉所有文章
<Route exact path="/posts" component={Posts} />
// 展示某篇文章
<Route path="/posts/:id?" component={PostRender} />
react-router
By Jay Chou
react-router
- 299