花3-5分钟即可开始使用。
加入autoCache
属性后,组件将不会被卸载或重新加载,而是隐藏或显示。
动态路由、递归路由、404页面等等。
Gzip压缩后仅有3kB,而 React Router V4 是8kB。
所有特性都经过自动化测试。
npm install --save less-router
用Routing函数包装路由组件,以及项目根组件
import Routing from 'less-router';
const Component = ({ router, nickname }) => (
<div>
你好, {nickname}
</div>
);
export default Routing(Component);
使用已包装的组件
import ComponentRoute from './component';
// ...
<ComponentRoute
// nickname会从URL取值并注入到组件的属性中
path="/somepath/:nickname"
title="欢迎"
/>
根组件也需要包装
import Routing from 'less-router'
class App extends React.Component {
}
export default Routing(App);
根组件不需要传入path
属性
import AppRoute from './app';
ReactDOM.render(
<AppRoute />,
document.querySelector('#root-id'),
);
兼容 React Hot Loader:
react-hot-loader
和less-router
都需要对根组件进行包装。此时,Routing
必须放在hot(module)
外面。import Routing from 'less-router'; import { hot } from 'react-hot-loader'; class App extends React.Component { } export default Routing(hot(module)(App)); // 正常运作 // export default hot(module)(Routing(App)); // 会报错
import Routing from 'less-router';
const Component = ({ router }) => (
<div>
<button onClick={() => router.push('/home')}>
进入 Home
</button>
<button onClick={() => router.replace('/home')}>
重定向到 Home
</button>
<button onClick={() => router.back()}>
返回
</button>
<button onClick={() => router.forward()}>
前进
</button>
</div>
);
export default Routing(Component);
router
属性是由Routing
自动注入的。
/users
匹配
-
/users
-
/users/
-
/users/123
/users/
匹配
-
/users
-
/users/
-
/users/123
/users/:id
匹配
-
/users
-
/users/
-
/users/123
关于Query String: query string 不属于
location.pathname
,Less Router 会忽略它。 如果你需要从query string中获取参数,参见 https://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript
假如你的项目准备部署在https://www.freehost.com/my-username/my-app/
,你需要在根组件的basename
属性中声明
ReactDOM.render(
<AppRoute basename="/my-username/my-app" />,
document.querySelector('#root-id'),
);
之后使用props.router.push(pathname)
或者props.router.replace(pathname)
时,路由会自动为你加上basename。
Less Router 保留数个props
- 传给已包装的组件:
path
title
parentPath
autoCache
notFound
- 注入到原始组件:
router
path
pathname
以及 URL参数
其他props会直接传给原始组件:
<ComponentRoute
path="/somepath"
title="Example"
aaa="111"
bbb="222"
/>
import Routing from 'less-router';
const Component = ({ aaa, bbb }) => (
<div>
{aaa} {bbb}
</div>
);
export default Routing(Component);
加入autoCache
属性
<ComponentRoute
path="/list"
title="一个长列表"
autoCache
/>
改变路由后,这个组件不会被销毁。再次回到此路由时,也不会触发componentDidMount
。
如果你在componentDidMount
里写了网络请求的逻辑,想再次进入此路由时刷新页面,那在此之前先清除缓存。
// 现在在其他路由中
await router.clearCache('/list'); // 清除'/list'路由的缓存。注意这是一个异步操作
router.push('/list'); // 再次进入'/list'路由
import Routing from 'less-router';
import ChildRoute from './child';
const Parent = ({ router, path, pathname }) => (
<div>
<ChildRoute
parentPath={path}
path="/child"
/>
<button onClick={() => router.push(pathname + '/child')}>
Show Child
</button>
</div>
);
export default Routing(Parent);
将props.path
传入parentPath
即可,无需手动输入parentPath
的值。
import Routing from 'less-router';
const Child = () => (
<div>
</div>
);
export default Routing(Child);
留意: ParentRoute
的path
必须以/
结尾,否则进入/parent/child
路由后,ParentRoute
会消失,ChildRoute
也跟着消失。
<ParentRoute
path="/parent/" // 正确
//path = "/parent" // 错误
/>
复习 匹配规则
<ComponentRoute
notFound
title="未找到该路径"
/>
notFound
支持动态路由,可以使该组件只在某个路径下时才触发
import Routing from 'less-router';
import ChildRoute from './child';
const Parent = ({ path }) => (
<div>
<ChildRoute
notFound
title="未找到该路径"
parentPath={path}
/>
</div>
);
export default Routing(Parent);
<PurchasedRoute
path="/movies/purchased"
/>
<MovieRoute
path="/movies/:title"
/>
两个path
都能匹配https://www.example.com/movies/purchased
。但显然我们只想匹配第一个路由,
这时可以使用分组功能,同一分组只有第一个匹配的组件会被渲染。
<PurchasedRoute
path="/movies/purchased"
group="123"
/>
<MovieRoute
path="/movies/:title"
group="123"
/>
查阅 高级指南.
A higher-order component. Receving a component and return a new component with route features. The initial rendered component will be treated as root route.
Wrapped Component settings.
- path
- title
- parentPath
- autoCache
- basename
- notFound
- router
- path
- pathname
- URL Parameters
- Passthrough props
- push
- replace
- clearCache
- back
- forward
- go
- pathname