
我就直接复制文档了,喜欢的话给点个星星哈!
路由一直是前端开发的重要组成部分,主流框架都有官方或社区的提供的路由支持,比如 vue-router 和 react-router,但它们都与框架深度绑定而无法共用。oh-router 将核心功能与框架解绑,以此在不同的框架之间提供一致的 API 接口。
特性:
路由匹配 和 hooks路由匹配 和 hooks 直接基于 react-router v6安装依赖
$ npm install --save oh-router oh-router-react 下面是一个结合 React 最基本的使用案例:在 StackBlitz 中打开
import { Router } from 'oh-router' import { RouterView, Link } from 'oh-router-react' import ReactDOM from 'react-dom/client' const router = new Router({ routes: [ { path: '/', element: () => ( <div> <div>Home</div> <Link to="/about">to About</Link> </div> ), }, { path: '/about', element: () => ( <div> <div>About</div> <Link to="/">to Home</Link> </div> ), }, ], }) ReactDOM.createRoot(document.getElementById('root')!).render( <RouterView router={router} /> ) 安装依赖
$ npm install --save oh-router oh-router-vue 下面是一个结合 Vue 最基本的使用案例:在 StackBlitz 中打开
<div id="app"> <router-view /> </div> <script> import { Router } from 'oh-router' import { installForVue } from 'oh-router-vue' import { createApp } from 'vue' const router = new Router({ routes: [ { path: '/', element: { template: `<div> <div>Home</div> <router-link to="/about">to About</router-link> </div`, }, }, { path: '/about', element: { template: `<div> <div>About</div> <router-link to="/">to Home</router-link> </div`, }, }, ], }) const app = createApp({}) app.use(installForVue(router)) app.mount('#app') </script> import Router from 'oh-router' const app = document.querySelector<HTMLDivElement>('#app')! const routes = [ { path: '/', element: `<div>Home</div> <div> <button Onclick="to('/libs')">libs</button> <button Onclick="to('/languages')">languages</button> </div>`, children: [ { path: '/libs', element: `<ul> <li Onclick="to('/libs/react')"><button>React</button></li> <li Onclick="to('/libs/vue')"><button>Vue</button></li> <ul/>`, }, { path: '/libs/:name', element: `Lib: `, name: 'lib-detail', }, { path: '/languages', element: `<ul><li>Java</li><li>Go</li><ul/>`, }, ], }, { path: '*', element: '404', }, ] const router = new Router({ routes }) .addLocationListener((location) => { let cOntent= location.matched.map(({ route }) => route.element).join('\n') const lastRoute = location.matched[location.matched.length - 1] if (lastRoute.route.name === 'lib-detail') { content += lastRoute.params.name } app.innerHTML = content }) .start() window.to = function to(path: string) { router.navigate(path) } 1 shilianmlxg 2022-05-23 17:38:16 +08:00 第一个 start 膜拜大佬,之前的觉得最复杂的就是 router 了 比如 mobx + router-query |
2 lblblong OP @shilianmlxg 哈哈哈哈感谢感谢,不得不说有眼光!用了 oh-router 会发现路由从未如此简单 |
3 Torpedo 2022-05-23 18:07:13 +08:00 "react-router 必须要在组件创建之后才提供导航方法" ,这个没太理解。react-router 不创建组建也能调用吧 |
4 lblblong OP @Torpedo react-router 提供的 Link 和 useNavigate 都得基于 <Router> 根组件提供的上下文才能使用,但是 oh-router 只要创建了 Router 实例之后就可以进行路由导航了,比如: ```tsx const router = new Router(...) // 在实例创建之后就可以导航了 router.navigate('/login') ReactDOM.createRoot(document.getElementById('root')!).render( <RouterView router={router} /> ) ``` |
6 felixin 2022-05-23 20:23:16 +08:00 via Android 建议参考下 router5 给路由加上 name |
9 linkopeneyes 2022-06-14 14:56:21 +08:00 有兴趣支持一下 webcomponent 吗~最近玩 webcomponent 发现没一个好用的路由库 |