@@ -20,15 +20,17 @@ npm i effector effector-react react
2020
2121## Usage
2222
23- ### ` RouterProvider ` - provides router instance
23+ ### Component API
24+
25+ #### ` RouterProvider ` - provides router instance
2426
2527Wrap your app into this:
2628
2729``` tsx
28- import { createHistoryRouter } from ' atomic-router'
29- import { RouterProvider , Route } from ' atomic-router-react'
30+ import { createHistoryRouter } from " atomic-router" ;
31+ import { RouterProvider , Route } from " atomic-router-react" ;
3032
31- import { HomePage } from ' ./routes'
33+ import { HomePage } from " ./routes" ;
3234
3335const router = createHistoryRouter ({ routes });
3436
@@ -41,15 +43,15 @@ const App = () => {
4143};
4244```
4345
44- ### ` Link ` - render a link
46+ #### ` Link ` - render a link
4547
4648Simple usage:
4749
4850``` tsx
4951import { createRoute } from ' atomic-router'
5052import { Link } from ' atomic-router-react'
5153
52- const homeRoute = createRoute <{postId : string }> ()
54+ const homeRoute = createRoute ()
5355const postRoute = createRoute <{postId: string }>()
5456
5557<Link to = { homeRoute } >Route link</Link >
@@ -60,23 +62,102 @@ const postRoute = createRoute<{postId:string}>()
6062All params:
6163
6264``` tsx
63- import { Link } from ' atomic-router-react'
65+ import { Link } from " atomic-router-react" ;
6466
6567<Link
6668 to = { route }
67- params = { { foo: ' bar' }}
68- query = { { bar: ' baz' }}
69+ params = { { foo: " bar" }}
70+ query = { { bar: " baz" }}
6971 activeClassName = " font-semibold text-red-400"
7072 inactiveClassName = " opacity-80"
71- />
73+ />;
74+ ```
75+
76+ #### ` Route ` - render route
77+
78+ ``` tsx
79+ import { Route } from " atomic-router-react" ;
80+
81+ <Route route = { homeRoute } view = { HomePage } />;
82+ ```
83+
84+ ### Declarative API
85+
86+
87+
88+ #### ` createRouteView ` - render view if route is opened
89+
90+ ``` tsx
91+ import { createRoute } from " atomic-router" ;
92+ import { createRouteView } from " atomic-router-react" ;
93+ import { restore , createEffect } from " effector" ;
94+
95+ const homeRoute = createRoute ();
96+
97+ const getPostsFx = createEffect (/* ... */ );
98+
99+ const $posts = restore (getPostsFx , []);
100+
101+ const postsLoadedRoute = chainRoute ({
102+ route ,
103+ beforeOpen: getPostsFx ,
104+ });
105+
106+ const PostsList = createRouteView ({
107+ route: postsLoadedRoute ,
108+ view : () => {
109+ const posts = useStore ($posts );
110+
111+ return ; /* ... */
112+ },
113+ otherwise : () => {
114+ return <div >Loading...</div >;
115+ },
116+ });
117+ ```
118+
119+ You can also set only a part of ` createRouteView ` config on create and pass the rest of it via props.
120+
121+ #### ` createRoutesView ` - render routes
122+
123+ ``` tsx
124+ import { createRouteView , RouterProvider } from " atomic-router-react" ;
125+
126+ // { route: RouteInstance<...>, view: FC<...> }
127+ import * as Home from " @/pages/home" ;
128+ import * as Post from " @/pages/post" ;
129+
130+ import { router } from " @/app/routing" ;
131+
132+ const RoutesView = createRoutesView ({
133+ routes: [
134+ { route: Home .route , view: Home .Page },
135+ { route: Post .route , view: Post .Page },
136+ ],
137+ otherwise : () => {
138+ return <div >Page not found!</div >;
139+ },
140+ });
141+
142+ const App = () => {
143+ return (
144+ <RouterProvider router = { router } >
145+ <RoutesView />
146+ </RouterProvider >
147+ );
148+ };
72149```
73150
74- ### ` Route ` - render route
151+ Like in ` createRouteView ` , you can set only a part of ` createRoutesView ` config on create and pass the rest of it via props:
75152
76153``` tsx
77- import { Route } from ' atomic-router-react'
154+ // Set specific otherwise view
155+ const RoutesView = createRoutesView ({
156+ otherwise: SpecificNotFound ,
157+ });
78158
79- <Route route = { homeRoute } view = { HomePage } />
159+ // Pass the routes as a prop
160+ <RoutesView routes = { routes } />;
80161```
81162
82163### ` useLink ` — resolve path from route
0 commit comments