1.0.0 • Published 2 years ago

@baoshishu/vue-query v1.0.0

Weekly downloads
51
License
MIT
Repository
-
Last release
2 years ago

vue-query npm package Actions Status

Composition API for fetching asynchronous data in Vue.

  • 🔥 Simple API
  • 🎗TypeScript Support
  • 💪 Hide the Complexity of Reactive

Depends on @vue/composition-api

Installation

npm install @baoshishu/vue-query

Usage

<template>
  <div>
    <div v-if="error">error!</div>
    <div v-else-if="loading">...loading</div>
    <pre v-else>{{ JSON.stringify(data) }}</pre>
  </div>
</template>

<script>
import { createComponent } from '@vue/composition-api';
import { useQuery } from '@baoshishu/vue-query';

export default createComponent({
  setup() {
    const fetcher = name =>
      fetch(`https://api.github.com/users/${name}`).then(res => res.json());
    return useQuery(name, fetcher);
  },
});
</script>

If first argument of useQuery is a function, the result of this function will be passed to fetcher function, and this query will be reactive. You can think of this argument as the getter passed to computed.

<template>
  <div>
    <div v-if="error">error!</div>
    <div v-else-if="loading">...loading</div>
    <pre v-else>{{ JSON.stringify(data) }}</pre>
  </div>
</template>
<script>
export default {
  setup(props, context) {
    const fetcher = ({ path, params }) => {
      return fetch(
        `https://api.github.com/${path}?page=${params.page}`
      ).then(res => res.json());
    };
    return useQuery(
      () => ({
        path: '/users',
        params: { page: context.root.$route.query.page },
      }),
      fetcher
    );
  },
};

// if we change route, fetcher will be called again
$route.query.page = 2;

// fetcher({'/users', {page: 2}})
</script>

When route changes page, as route is reactive, a new request would be fired to fetch users of this new page

Array Keys

When a query needs more information to uniquely describe its data, you can use an array to describe it, and it will be destructed as argumets to fetcher function.

const fetcher = (a, b) => Promise.resolve(a, b);
useQuery(['a', 'b'], fetcher);

If the first argument is a function which returns an array, this query will be reactive.

const fetcher = (a, b) => Promise.resolve(a, b);

import { reactive } from '@vue/composition-api';
var params = reactive({ page: 1, per_page: 10 });

const fetcher = (page, per_page) => Promise.resolve(page, per_page);

useQuery(() => [params.page, params.per_page], fetcher);

Query config

Fetch success callback.

import { createComponent } from '@vue/composition-api';
import { useQuery } from '@baoshishu/vue-query';

export default createComponent({
  setup() {
    const fetcher = name =>
      fetch(`https://api.github.com/users/${name}`).then(res => res.json());
    return useQuery(name, fetcher, { success(){
      console.log('fetch success')
    }});
  },
});

Conditionally fetch data, condition can be a Ref or normal tracking function.

import { createComponent } from '@vue/composition-api';
import { useQuery } from '@baoshishu/vue-query';

export default createComponent({
  setup() {
    condition = ref(false);
    const fetcher = name =>
      fetch(`https://api.github.com/users/${name}`).then(res => res.json());
    
    setTimeout(()=>{
      condition.value = true // only fetch if condition is set to true

    }, 1000)
    return useQuery(name, fetcher, {
      enabled: condition,
    });
  },
});

Related

License

MIT

1.0.0

2 years ago

0.3.7

3 years ago

0.3.6

3 years ago

0.3.5

3 years ago

0.3.4

3 years ago

0.3.3

3 years ago

0.3.2

3 years ago

0.3.1

3 years ago

0.3.0

3 years ago

0.2.1

4 years ago

0.2.0

4 years ago

0.1.9

4 years ago

0.1.8

4 years ago

0.1.7

4 years ago

0.1.6

4 years ago

0.1.5

4 years ago

0.1.4

4 years ago

0.1.3

4 years ago

0.1.2

4 years ago

0.1.1

4 years ago

0.1.0

4 years ago