This is a react router without flux and redux.
We just want a simple way to build a Single Page Application.
Define rules that include the component and how to fetch data of the each page in a router.
npm install capybara-router --save
https://kelp404.github.io/capybara-router/
const React = require('react');
const ReactDOM = require('react-dom');
const {Router, RouterView} = require('capybara-router');
const history = require('history');
const axios = require('axios');
const ErrorPage = props => {
return <h2 className="text-center">{`${props.error}`}</h2>;
};
const Home = props => {
console.log(props.data);
return <h2>Home</h2>;
};
const router = new Router({
history: history.createBrowserHistory(),
routes: [
{
name: 'web',
uri: '/',
onEnter: props => {
document.title = 'Home';
},
resolve: {
data: params => axios({
method: 'get',
url: `/data/${params.id}.json`
}).then(response => response.data)
},
component: Home
}
],
errorComponent: ErrorPage
});
const element = (
<RouterView>
<div className="text-center text-muted py-5">
<div className="spinner-border">
<span className="sr-only">Loading...</span>
</div>
</div>
</RouterView>
);
ReactDOM.render(element, document.getElementById('root'));
npm start
Run the debug server on localhost:8000/capybara-router.npm run build
Build the example app.npm test
Build test scripts and run tests.
Generate a instance of Router with your config.
Just allow single instance in your application.
const {Router} = require('capybara-router');
const axios = require('axios');
const history = require('history');
const router = new Router({
history: history.createBrowserHistory(),
routes: [
{
name: 'web',
uri: '/',
isAbstract: false,
onEnter: props => {
document.title = 'Web';
},
resolve: {
data: axios({
method: 'get',
url: '/data.json'
}).then(response => response.data)
},
component: props => (<p>{JSON.stringify(props.data)}</p>)
}
],
errorComponent: props => (<h2>Error</h2>)
});
Type: Object
Required: required
Please provide history object.
Type: Object
Required: required
The React component for the error page.
Type: Array<Object>
Required: required
Type: String
Required: required
The name of this route.
Use .
to make the child route.
Such as web
, web.project
, web.project.members
.
Type: String
Required: required
The URI of this route.
It support the regular expression.
/users/{userId:[\\w-]{20}}
will parse the user id from URL.
.*
will match all URL. Use it to define the 404 page.
Type: Boolean
Default: false
The URI of this route.
An abstract state can have child states but cannot get activated itself.
An 'abstract' state is simply a state that can't be transitioned to.
Type: Function
(props) => {}
Required: optional
capybara-route will call this function before the component.
Type: Object
Required: optional
Define how to fetch data.
Type: Object
Required: optional
The React component.
Type: Function
Required: optional
The lazy loading function.
Run the lazy loading function when the .component
is null.
{
name: 'web',
uri: '/path',
loadComponent: () => import(
/* webpackChunkName: "chunk-name" */
'./path/component'
)
}
Reload the root router view.
Push a state to the history or Replace a state of the history.
If the new URI and the old one are same, it will reload the current page.
Type: String|Object
Required: required
The destination.
String
: The target is the URI.
Object
:
{
name: {String}, // The route name.
params: {Object} // The parameter of the route.
}
Type: Object
Required: optional
Type: Boolean
Default: false
Replace the current state with the new one.
Type: Boolean
Default: false
Reload the root router view.
Listen the change event.
Type: String
The event type.
ChangeStart
, ChangeSuccess
, ChangeError
Type: Function
The callback function.
ChangeStart
: (action, toState, fromState, next) => {}
ChangeSuccess
: (action, toState, fromState) => {}
ChangeError
: (error) => {}
Type: Function
Call this function to stop the listen.
Render the error component.
Type: Object
The Error object.
Get the current route via router.history and router.routes.
Type: Route
Find the route by the route name.
Type: String
The route name.
Type: Route
When the instance of Router was created.
This function returns the instance.
const {getRouter} = require('capybara-router');
// new Router({ ... });
const router = getRouter();
The router will replace the loading view with the page component.
const {RouterView} = require('capybara-router');
<RouterView>
<p className="text-center text-muted h3" style={{padding: '20px 0'}}>
<i className="fa fa-spinner fa-pulse fa-fw"></i> Loading...
</p>
</RouterView>
Render a SPA link element.
const {Link} = require('capybara-router');
<Link to={`/users/${user.id}`}>{user.id}</Link>
<Link to={{name: 'route-name', params: {paramKey: 'value'}}}>link</Link>
- Meetpet https://meetpet.org/