{"id":26460011,"url":"https://github.com/kuu12/less-router","last_synced_at":"2025-03-19T02:48:00.260Z","repository":{"id":143885680,"uuid":"140142834","full_name":"kuu12/less-router","owner":"kuu12","description":"A very easy React router component but fully functional.","archived":false,"fork":false,"pushed_at":"2020-06-10T01:19:35.000Z","size":177,"stargazers_count":5,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-04-27T11:40:58.279Z","etag":null,"topics":["higher-order-component","minimal","react","react-router","reactjs","router"],"latest_commit_sha":null,"homepage":"https://kuu12.github.io/less-router/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kuu12.png","metadata":{"files":{"readme":"README.cn.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-07-08T06:21:19.000Z","updated_at":"2020-08-13T10:16:14.000Z","dependencies_parsed_at":null,"dependency_job_id":"e5d899a5-eabe-4875-a9cd-7841e94cabaf","html_url":"https://github.com/kuu12/less-router","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuu12%2Fless-router","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuu12%2Fless-router/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuu12%2Fless-router/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuu12%2Fless-router/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kuu12","download_url":"https://codeload.github.com/kuu12/less-router/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244345095,"owners_count":20438241,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["higher-order-component","minimal","react","react-router","reactjs","router"],"created_at":"2025-03-19T02:47:59.595Z","updated_at":"2025-03-19T02:48:00.255Z","avatar_url":"https://github.com/kuu12.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Less Router \u0026middot; [![NpmVersion](https://img.shields.io/npm/v/less-router.svg)](https://www.npmjs.com/package/less-router) [![npm bundle size (minified + gzip)](https://img.shields.io/bundlephobia/minzip/less-router.svg)](https://bundlephobia.com/result?p=less-router) [![npm](https://img.shields.io/npm/dt/less-router.svg)](https://www.npmjs.com/package/less-router) [![Travis (.org)](https://img.shields.io/travis/kuu12/less-router.svg)](https://travis-ci.org/kuu12/less-router/)\n\n### 更少的API，更多的优雅和更简单地学习。\n\n[README in English](https://github.com/kuu12/less-router/blob/master/README.md)\n\n[在线演示](https://kuu12.github.io/less-router/)\n\n# 特性\n\n### 简单的API\n花3-5分钟即可开始使用。\n\n### 可缓存\n加入`autoCache`属性后，组件将不会被卸载或重新加载，而是隐藏或显示。\n\n### 支持 *React Router V4* 的大多数特性\n动态路由、递归路由、404页面等等。\n\n### 极限体积\nGzip压缩后仅有3kB，而 *React Router V4* 是8kB。\n\n### 稳定\n所有特性都经过自动化测试。\n\n# 安装\n```shell\nnpm install --save less-router\n```\n\n# 使用\n\n- [基本使用及URL参数](#基本使用及url参数)\n- [改变路由](#改变路由)\n- [匹配规则](#匹配规则)\n- [Basename](#basename)\n- [Props传递](#props传递)\n- [使用缓存](#使用缓存)\n- [动态路由](#动态路由)\n- [404页面](#404页面)\n- [只渲染第一个匹配的路由](#只渲染第一个匹配的路由)\n- [API参考](#api参考)\n\n## 基本使用及URL参数\n用Routing函数包装路由组件，以及项目根组件\n```javascript\nimport Routing from 'less-router';\nconst Component = ({ router, nickname }) =\u003e (\n  \u003cdiv\u003e\n    你好, {nickname}\n  \u003c/div\u003e\n);\nexport default Routing(Component);\n```\n使用已包装的组件\n```javascript\nimport ComponentRoute from './component';\n// ...\n\u003cComponentRoute\n  // nickname会从URL取值并注入到组件的属性中\n  path=\"/somepath/:nickname\"\n  title=\"欢迎\"\n/\u003e\n```\n根组件也需要包装\n```javascript\nimport Routing from 'less-router'\nclass App extends React.Component {\n}\nexport default Routing(App);\n```\n根组件不需要传入`path`属性\n```javascript\nimport AppRoute from './app';\nReactDOM.render(\n  \u003cAppRoute /\u003e,\n  document.querySelector('#root-id'),\n);\n```\n\n\u003e 兼容 ***React Hot Loader***:\n\u003e `react-hot-loader`和`less-router`都需要对根组件进行包装。此时，`Routing`**必须**放在`hot(module)`外面。\n\u003e ```javascript\n\u003e import Routing from 'less-router';\n\u003e import { hot } from 'react-hot-loader';\n\u003e\n\u003e class App extends React.Component {\n\u003e }\n\u003e export default Routing(hot(module)(App)); // 正常运作\n\u003e // export default hot(module)(Routing(App)); // 会报错\n\u003e ```\n\n## 改变路由\n```javascript\nimport Routing from 'less-router';\nconst Component = ({ router }) =\u003e (\n  \u003cdiv\u003e\n    \u003cbutton onClick={() =\u003e router.push('/home')}\u003e\n      进入 Home\n    \u003c/button\u003e\n    \u003cbutton onClick={() =\u003e router.replace('/home')}\u003e\n      重定向到 Home\n    \u003c/button\u003e\n    \u003cbutton onClick={() =\u003e router.back()}\u003e\n      返回\n    \u003c/button\u003e\n    \u003cbutton onClick={() =\u003e router.forward()}\u003e\n      前进\n    \u003c/button\u003e\n  \u003c/div\u003e\n);\nexport default Routing(Component);\n```\n`router`属性是由`Routing`自动注入的。\n\n## 匹配规则\n\n`/users` 匹配\n- [x] `/users`\n- [x] `/users/`\n- [ ] `/users/123`\n\n`/users/` 匹配\n- [x] `/users`\n- [x] `/users/`\n- [x] `/users/123`\n\n`/users/:id` 匹配\n- [ ] `/users`\n- [ ] `/users/`\n- [x] `/users/123`\n\n\u003e **关于Query String：** query string 不属于`location.pathname`，*Less Router* 会忽略它。\n\u003e 如果你需要从query string中获取参数，参见 [https://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript](https://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript)\n\n## Basename\n假如你的项目准备部署在`https://www.freehost.com/my-username/my-app/`，你需要在**根组件**的`basename`属性中声明\n\n```javascript\nReactDOM.render(\n  \u003cAppRoute basename=\"/my-username/my-app\" /\u003e,\n  document.querySelector('#root-id'),\n);\n```\n之后使用`props.router.push(pathname)`或者`props.router.replace(pathname)`时，路由会自动为你加上basename。\n\n## Props传递\n*Less Router* 保留数个props\n- **传给已包装的组件：** `path` `title` `parentPath` `autoCache` `notFound`\n- **注入到原始组件：** `router` `path` `pathname` 以及 [URL参数](#基本使用及url参数)\n\n其他props会直接传给原始组件:\n```javascript\n\u003cComponentRoute\n  path=\"/somepath\"\n  title=\"Example\"\n  aaa=\"111\"\n  bbb=\"222\"\n/\u003e\n```\n```javascript\nimport Routing from 'less-router';\nconst Component = ({ aaa, bbb }) =\u003e (\n  \u003cdiv\u003e\n    {aaa} {bbb}\n  \u003c/div\u003e\n);\nexport default Routing(Component);\n```\n\n## 使用缓存\n加入`autoCache`属性\n```javascript\n\u003cComponentRoute\n  path=\"/list\"\n  title=\"一个长列表\"\n  autoCache\n/\u003e\n```\n改变路由后，这个组件不会被销毁。再次回到此路由时，也不会触发`componentDidMount`。\n如果你在`componentDidMount`里写了网络请求的逻辑，想再次进入此路由时刷新页面，那在此之前先清除缓存。\n\n```javascript\n// 现在在其他路由中\nawait router.clearCache('/list'); // 清除'/list'路由的缓存。注意这是一个异步操作\nrouter.push('/list'); // 再次进入'/list'路由\n```\n\n## 动态路由\n```javascript\nimport Routing from 'less-router';\nimport ChildRoute from './child';\nconst Parent = ({ router, path, pathname }) =\u003e (\n  \u003cdiv\u003e\n    \u003cChildRoute\n      parentPath={path}\n      path=\"/child\"\n    /\u003e\n    \u003cbutton onClick={() =\u003e router.push(pathname + '/child')}\u003e\n      Show Child\n    \u003c/button\u003e\n  \u003c/div\u003e\n);\nexport default Routing(Parent);\n```\n\n将`props.path`传入`parentPath`即可，无需手动输入`parentPath`的值。\n\n```javascript\nimport Routing from 'less-router';\nconst Child = () =\u003e (\n  \u003cdiv\u003e\n  \u003c/div\u003e\n);\nexport default Routing(Child);\n```\n\n**留意:** `ParentRoute`的`path`**必须**以`/`结尾，否则进入`/parent/child`路由后，`ParentRoute`会消失，`ChildRoute`也跟着消失。\n```javascript\n\u003cParentRoute\n  path=\"/parent/\" // 正确\n//path = \"/parent\" // 错误\n/\u003e\n```\n复习 [匹配规则](#匹配规则)\n\n## 404页面\n```javascript\n\u003cComponentRoute\n  notFound\n  title=\"未找到该路径\"\n/\u003e\n```\n`notFound`支持动态路由，可以使该组件只在某个路径下时才触发\n```javascript\nimport Routing from 'less-router';\nimport ChildRoute from './child';\nconst Parent = ({ path }) =\u003e (\n  \u003cdiv\u003e\n    \u003cChildRoute\n      notFound\n      title=\"未找到该路径\"\n      parentPath={path}\n    /\u003e\n  \u003c/div\u003e\n);\nexport default Routing(Parent);\n```\n\n## 只渲染第一个匹配的路由\n\n```javascript\n\u003cPurchasedRoute\n  path=\"/movies/purchased\"\n/\u003e\n\u003cMovieRoute\n  path=\"/movies/:title\"\n/\u003e\n```\n\n两个`path`都能匹配`https://www.example.com/movies/purchased`。但显然我们只想匹配第一个路由，\n\n这时可以使用分组功能，同一分组只有第一个匹配的组件会被渲染。\n\n```javascript\n\u003cPurchasedRoute\n  path=\"/movies/purchased\"\n  group=\"123\"\n/\u003e\n\u003cMovieRoute\n  path=\"/movies/:title\"\n  group=\"123\"\n/\u003e\n```\n\n## API参考\n查阅 [高级指南](https://github.com/kuu12/less-router/blob/master/GUIDE.md).\n\n### Routing\n\nA higher-order component. Receving a component and return a new component with route features.\nThe initial rendered component will be treated as root route.\n\n### Component With Route Features\n\nWrapped Component settings.\n\n- path\n- title\n- parentPath\n- autoCache\n- basename\n- notFound\n\n### Props injected to Origin Component\n\n- router\n- path\n- pathname\n- URL Parameters\n- Passthrough props\n\n### Property `router`\n\n- push\n- replace\n- clearCache\n- back\n- forward\n- go\n- pathname\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkuu12%2Fless-router","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkuu12%2Fless-router","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkuu12%2Fless-router/lists"}