All Projects → riot → Route

riot / Route

Licence: mit
Simple isomorphic router

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to Route

Zeroframe Router
A very simple ZeroFrame Router for the ZeroNet.
Stars: ✭ 11 (-94.47%)
Mutual labels:  simple, router
Nivo
nivo provides a rich set of dataviz components, built on top of the awesome d3 and React libraries
Stars: ✭ 9,550 (+4698.99%)
Mutual labels:  isomorphic, components
Components
Example Components (Built with Tonic)
Stars: ✭ 42 (-78.89%)
Mutual labels:  minimal, components
Water.css
A drop-in collection of CSS styles to make simple websites just a little nicer
Stars: ✭ 6,666 (+3249.75%)
Mutual labels:  simple, minimal
Nextjs Dynamic Routes
[Deprecated] Super simple way to create dynamic routes with Next.js
Stars: ✭ 145 (-27.14%)
Mutual labels:  isomorphic, router
Router
一款单品、组件化、插件化全支持的Andoid端路由框架。
Stars: ✭ 741 (+272.36%)
Mutual labels:  router, components
Bonsai
🌱 a tiny distro-independent package manager
Stars: ✭ 188 (-5.53%)
Mutual labels:  simple, minimal
unitscss
UNITS is a simple and beautiful CSS component set.
Stars: ✭ 13 (-93.47%)
Mutual labels:  components, simple
Hugo Theme Console
A minimal, responsive and light theme for Hugo inspired by Linux console.
Stars: ✭ 143 (-28.14%)
Mutual labels:  simple, minimal
Yui
Minimal vim color scheme
Stars: ✭ 93 (-53.27%)
Mutual labels:  simple, minimal
Rill
🗺 Universal router for web applications.
Stars: ✭ 541 (+171.86%)
Mutual labels:  isomorphic, router
Startup Landing
Collection of free top of the line startup landing templates built using react/nextjs/gatsby. Free to download, simply edit and deploy! Updated weekly!
Stars: ✭ 176 (-11.56%)
Mutual labels:  simple, components
Mam mol
$mol - fastest reactive micro-modular compact flexible lazy ui web framework.
Stars: ✭ 385 (+93.47%)
Mutual labels:  isomorphic, components
Catberry
Catberry is an isomorphic framework for building universal front-end apps using components, Flux architecture and progressive rendering.
Stars: ✭ 793 (+298.49%)
Mutual labels:  isomorphic, components
Go Starter Kit
[abandoned] Golang isomorphic react/hot reloadable/redux/css-modules/SSR starter kit
Stars: ✭ 2,855 (+1334.67%)
Mutual labels:  isomorphic, components
Derrick
🙌 Derrick is a clean minimal and fast theme for a personal blog.
Stars: ✭ 51 (-74.37%)
Mutual labels:  simple, minimal
CleanUI
Android library to create beautiful, clean and minimal UIs.
Stars: ✭ 19 (-90.45%)
Mutual labels:  components, simple
SSTMCSPGAAS
Stupidly Simple Tiny Minimal Coming Soon Page Generator As A Service
Stars: ✭ 23 (-88.44%)
Mutual labels:  minimal, simple
Waffles
Bash Configuration Management
Stars: ✭ 79 (-60.3%)
Mutual labels:  simple, minimal
Minrouter
a micro middleware router for isomorphic javaScript web apps
Stars: ✭ 159 (-20.1%)
Mutual labels:  isomorphic, router

Riot Router

Build Status Code Quality NPM version NPM downloads MIT License Coverage Status

Simple isomorphic router

The Riot.js Router is the minimal router implementation with such technologies:

  • compatible with the DOM pushState and history API
  • isomorphic functional API
  • erre.js streams and javascript async generators
  • rawth.js urls parsing

It doesn't need Riot.js to work and can be used as standalone module.

For Riot.js 3 and the older route version please check the v3 branch

Table of Contents

Install

We have 2 editions:

edition file
UMD Version route.js
ESM Module route.esm.js
Standalone UMD Module route.standalone.js

Script injection

<script src="https://unpkg.com/@riotjs/[email protected]/route.js"></script>

Note: change the part x.x.x to the version numbers what you want to use: ex. 4.5.0 or 4.7.0.

ESM module

import { route } from 'https://unpkg.com/@riotjs/route/route.esm.js'

npm

$ npm i -S @riotjs/route

Download by yourself

Documentation

With Riot.js

You can import the <router> and <route> components in your application and use them as it follows:

<app>
  <router>

    <!-- These links will trigger automatically HTML5 history events -->
    <nav>
      <a href="/home">Home</a>
      <a href="/about">About</a>
      <a href="/team/gianluca">Gianluca</a>
    </nav>

    <!-- Your application routes will be rendered here -->
    <route path="/home">
      Home page
    </route>
    <route path="/about">
      About
    </route>
    <route path="/team/:person">
      Hello dear { route.params.person }
    </route>

  </router>

  <script>
    import { Router, Route } from '@riotjs/route'

    export default {
      components { Router, Route }
    }
  </script>
</app>

You can also use the riot.register method to register them globally

import { Route, Router } from '@riotjs/route'
import { register } from 'riot'

// now the Router and Route components are globally available
register('router', Router)
register('route', Route)

Router

The <router> component should wrap your application markup and will detect automatically all the clicks on links that should trigger a route event.

<router>
  <!-- this link will trigger a riot router event -->
  <a href="/path/somewhere">Link</a>
</router>
<!-- this link will work as normal link without triggering router events -->
<a href="/path/to/a/page">Link</a>

You can also specify the base of your application via component attributes:

<router base="/internal/path">
  <!-- this link is outside the base so it will work as a normal link -->
  <a href="/somewhere">Link<a>
</router>

The router component has also an onStarted callback that will be called asynchronously after the first route event will be called

<router onStarted={onRouterStarted}></router>

Route

The <route> component provides the route property to its children (it's simply a URL object) allowing you to detect the url params and queries.

<route path="/:some/:route/:param">
  {JSON.stringify(route.params)}
</route>

<route path="/search(.*)">
  <!-- Assuming the URL is "/search?q=awesome" -->

  {route.searchParams.get('q')}
</route>

Each <route> component has its own lifecycle attributes in order to let you know when it gets mounted or unmounted.

<app>
  <router>
    <route path="/home"
      on-before-mount={onBeforeHomeMount}
      on-mounted={onHomeMounted}
      on-before-unmount={onBeforeHomeUnmount}
      on-unmounted={onHomeUnmounted}
    />
  </router>
</app>

Standalone

This module was not only designed to be used with Riot.js but also as standalone module. Without importing the Riot.js components in your application you can use the core methods exported to build and customize your own router compatible with any kind of frontend setup.

Fundamentals

This module works on node and on any modern browser, it exports the router and router property exposed by rawth

import { route, router, setBase } from '@riotjs/route'

// required to set base first
setBase('/');

// create a route stream
const aboutStream = route('/about')

aboutStream.on.value(url => {
  console.log(url) // URL object
})

aboutStream.on.value(() => {
  console.log('just log that the about route was triggered')
})

// triggered on each route event
router.on.value(path => {
  // path is always a string in this function
  console.log(path)
})

// trigger a route change manually
router.push('/about')

// end the stream
aboutStream.end()

Base path

Before using the router in your browser you will need to set your application base path. This setting can be configured simply via setBase method:

import { setBase } from '@riotjs/route'

// in case you want to use the HTML5 history navigation
setBase(`/`)

// in case you use the hash navigation
setBase(`#`)

Setting the base path of your application route is mandatory and is the first you probably are going to do before creating your route listeners.

DOM binding

The example above is not really practical in case you are working in a browser environment. In that case you might want to bind your router to the DOM listening all the click events that might trigger a route change event. Window history popstate events should be also connected to the router. With the initDomListeners method you can automatically achieve all the features above:

import { initDomListeners } from '@riotjs/route'

const unsubscribe = initDomListeners()
// the router is connected to the page DOM

// ...tear down and disconnect the router from the DOM
unsubscribe()

The initDomListeners will intercept any link click on your application. However it can also receive a HTMLElement or a list of HTMLElements as argument to scope the click listener only to a specific DOM region of your application

import { initDomListeners } from '@riotjs/route'

initDomListeners(document.querySelector('.main-navigation'))
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].