vue-use-route-query

47,966 28
Install
npm install vue-use-route-query
Latest Version:1.3.0
Vue:2 · 3
License:MIT
Last Updated:Oct 22, 2023
Links: GitHub  ·  npm
Maintainer: djaler

npm npm bundle size demo

Vue Use Route Query

A tiny Vue composable function to create a ref synced with vue router query.

Install

Works for Vue 2 and Vue 3 within a single package by the power of vue-demi!

npm install --save vue-use-route-query

or

yarn add vue-use-route-query

or

pnpm install vue-use-route-query

Usage

Simple example with a string parameter without any transformations

import { defineComponent } from 'vue'
import { useRouteQuery } from 'vue-use-route-query'

export default defineComponent({
    setup() {
        const foo = useRouteQuery('foo', ''); // Ref<string>
        const bar = useRouteQuery('bar', null); // Ref<string | null>

        foo.value = 'foo'; // Results in 'foo=foo' in the query
      
        return {
            foo,
            bar,
        }
    }
})

More complex example with a transformer

import { defineComponent } from 'vue'
import { useRouteQuery, RouteQueryTransformer } from 'vue-use-route-query'

export default defineComponent({
    setup() {
        // This transformer will reverse the string because why not
        const reverseTransformer: RouteQueryTransformer<string> = {
            fromQuery(query) {
                return query.split('').reverse().join('');
            },
            toQuery(value) {
                return value?.split('').reverse().join('');
            }
        }

        const foo = useRouteQuery('foo', '', reverseTransformer);

        foo.value = 'bar'; // Results in 'foo=rab' in the query

        return {
            foo,
        }
    }
})

A several transformers provided by the library out of the box:

  • integerTransformer
    const foo = useRouteQuery('foo', 0, integerTransformer); // Ref<number>
    
  • floatTransformer
    const foo = useRouteQuery('foo', 0, floatTransformer); // Ref<number>
    
  • booleanTransformer
    const foo = useRouteQuery('foo', false, booleanTransformer); // Ref<boolean>
    
  • enumTransformer - stores the enum key in the query and maps it back to the enum value
    enum Foo {
      BAR,
      BAZ
    }
    
    const foo = useRouteQuery('foo', Foo.Bar, enumTransformer); // Ref<Foo>
    
    foo.value = Foo.BAZ; // Results in 'foo=BAZ' in the query
    

Navigation mode

By default, all changes are applied using router.replace to not create additional entries in history. But you may configure this behaviour using mode option.

const foo = useRouteQuery('foo', '', { mode: 'push' });
const bar = useRouteQuery('bar', '', transformer, { mode: 'push' });

Update awaiting

Query update is asynchronous by its nature, but sometimes you may want to wait for query to be updated before doing something. For example, you may want to fetch some data from the server based on the query. To do that, you can use waitForQueryUpdate:

import { defineComponent } from 'vue';
import { useRouteQuery, waitForQueryUpdate } from 'vue-use-route-query';

export default defineComponent({
    setup() {
        const foo = useRouteQuery('foo', '');

        async function submit(value: string) {
            foo.value = value;
            await waitForQueryUpdate();
            // Now the query is updated and you can do something with it
            // For example, fetch some data from the server
            fetch(`https://example.com/api?foo=${foo.value}`);
        }

        return {
            foo,
            submit,
        };
    },
});

Related Packages

vue-router-tiny

A router for Vue.js

562 3
vue-router-sitemap

Module to generate a sitemap for vue-router configuration

3,327 111
@queryweave/vue-router

Vue Router adapter contracts for QueryWeave.

1,045 7
vue-route-props

Automatically bind vue-router query to vm, APIs are mostly same as the Vue props...

723 1
vuex-composition-api

Make Vuex modules with syntax inspired by @vue/composition-api

629 22

Version History

Version Released License
1.3.0 MIT
1.2.0 MIT
1.1.0 MIT
1.0.0 MIT
0.0.1 MIT