- Giới thiệu về React Router
- Nhiều Route
- Tái sử dụng component với Nested Route
- IndexRoute
- Một số cách khai báo với Route
- Sử dụng Link component, đừng sử dụng tag a
- Browser History
- Route với parameter string
Giới thiệu về React Router
Cách tiếp cận của React Router không khác mấy so với các thư viện Router trước đây
Ví dụ với 1 component Home
class Home extends React.Component{
render(){
return(
<h1>Welcome Home</h1>;
)
}
}
ReactDOM.render( (<Home/>), document.getElementById('root'));
Sử dụng với React-Router
ReactDOM.render((
<Router>
<Route path="/" component={Home} />
</Router>
), document.getElementById('root'));
Câu khai báo trên có thể diễn giải là với route "/" (tương đương với trang chủ), thì gọi render
component Home
2 component <Router>
và <Route>
là những component React không render trong DOM, nếu path
khớp với uri, nó render ra component chúng ta truyền vào cho nó (qua props component), chúng ta sẽ gặp lại khái niệm này thường xuyên: Một component bản thân không render trong DOM, mà render một component khác
Nhiều Route
Xét ví dụ
ReactDOM.render((
<Router>
<Route path="/" component={Home}></Route>
<Route path="/tags" component={TagsPage}></Route>
<Route path="/post/:id" component={Post}></Route>
</Router>
), document.getElementById('root'));
- Với URL yourpage.com/ -> render component
Home
- Với URL yourpage.com/tags -> render component
TagsPage
- Với URL yourpage.com/post/12 -> render component
Post
Tái sử dụng component với Nested Route
Khai báo nested Route
ReactDOM.render((
<Router>
<Route component={MainLayout}>
<Route component={SearchLayout}>
<Route path="users" component={UserList} />
</Route>
</Route>
</Router>
), document.getElementById('root'));
Khi user truy cập đường dẫn /users, React Router sẽ render component <UserList />
bên trong component <SearchLayout/>
, cả 2 component này lại đặt trong component <MainLayout/>
Nếu muốn trang chủ cũng render <MainLayout/>
cùng với component <Home/>
ReactDOM.render((
<Router>
<Route component={MainLayout}>
<Route path="/" component={Home} />
<Route component={SearchLayout}>
<Route path="users" component={UserList} />
<Route path="widgets" component={WidgetList} />
</Route>
</Route>
</Router>
), document.getElementById('root'));
IndexRoute
Thay vì viết như trên, có thể sử dụng component IndexRoute
cũng cho cũng kết quả
ReactDOM.render((
<Router>
<Route path="/" component={MainLayout}>
<IndexRoute component={Home} />
<Route component={SearchLayout}>
<Route path="users" component={UserList} />
<Route path="widgets" component={WidgetList} />
</Route>
</Route>
</Router>
), document.getElementById('root'));
Một số cách khai báo với Route
Nếu có một khai báo cho trang User như bên dưới
<Route path="user/settings" component={UserSettings} />
<Route path="user/inventory" component={UserInventory} />
<Route path="user/orders" component={UserOrders} />
Viết lại cho gọn
<Route path="user">
<Route path="settings" component={UserSettings} />
<Route path="inventory" component={UserInventory} />
<Route path="orders" component={UserOrders} />
</Route>
Cần bổ sung thêm component cho trang /user
<Route path="user">
<IndexRoute component={UserProfile} />
<Route path="settings" component={UserSettings} />
<Route path="inventory" component={UserInventory} />
<Route path="orders" component={UserOrders} />
</Route>
Sử dụng Link component, đừng sử dụng tag a
Khi đã định nghĩa với Route, nếu muốn dẫn đến một route nào đó, sử dụng component <Link to="" />
thay cho tag <a/>
<div className="app">
<header className="primary-header"></header>
<aside className="primary-aside">
<ul>
<li><Link to="/">Home</Link></li>
<li><Link to="/user">Users</Link></li>
<li><Link to="/user/settings">Settings</Link></li>
</ul>
</aside>
<main>
{this.props.children}
</main>
</div>
Với <Link>
nó biết khi nào đang active
<Link to="/users" activeClassName="active">Users</Link>
Browser History
<Router>
muốn hoạt động được, phải khai báo với ReactRouter.browserHistory
var browserHistory = ReactRouter.browserHistory;
ReactDOM.render((
<Router history={browserHistory}>
</Router>
), document.getElementById('root'));
Những version trước đây của React Router, attribute history
có giá trị mặc định là hashHistory giống như router của Backbone.js, các version sau này, attribute history sẽ không có giá trị mặc định và bắt buộc phải khai báo khi sử dụng
Nếu muốn redirect user đến một route nào đó
browserHistory.push('/some/path');
Route với parameter string
<Route path="users/:userId" component={UserProfile} />
Component UserProfile sẽ được render trong các trường hợp: users/1
, users/145
, users/abc
, React Router sẽ truyền vào giá trị userId
vào UserProfile như một props, access đến giá trị này bằng this.props.params.userId
Initializing...