Skip to content

microcipcip/vue-use-kit

Repository files navigation



Vue use kit


NPM Version NPM Downloads Build Status GitHub license Demo

๐Ÿ› ๏ธ Vue kit of useful Vue Composition API functions.

Install

npm install vue-use-kit

Since Vue 3.0 has not yet been released, you must also install @vue/composition-api library, which will enable the composition API in Vue 2.0.

npm install @vue/composition-api

Setup

import Vue from 'vue'
import VueCompositionAPI from '@vue/composition-api'
Vue.use(VueCompositionAPI)

Usage

<template>
  <div>isDesktop: {{ isDesktop ? 'Yes' : 'No' }}</div>
</template>

<script lang="ts">
  import Vue from 'vue'
  import { useMedia } from 'vue-use-kit'

  export default Vue.extend({
    name: 'UseMedia',
    setup() {
      const query = '(min-width: 1024px)'
      const isDesktop = useMedia(query)
      return { isDesktop }
    }
  })
</script>

APIs

  • Sensors
    • useGeolocation โ€” tracks geolocation state of user's device. Demo
    • useHover โ€” tracks mouse hover state of a given element. Demo
    • useIdle โ€” tracks whether user is being inactive. Demo
    • useIntersection โ€” tracks intersection of target element with an ancestor element. Demo Demo
    • useKey โ€” executes a handler when a keyboard key is pressed. Demo
    • useLocation โ€” tracks bar navigation location state. Demo
    • useMedia โ€” tracks state of a CSS media query. Demo Demo
    • useMediaDevices โ€” tracks connected hardware devices. Demo
    • useMouse โ€” tracks the mouse position. Demo Demo
    • useMouseElement โ€” tracks the mouse position relative to given element. Demo
    • useMouseLeavePage โ€” tracks when mouse leaves page boundaries. Demo
    • useOrientation โ€” tracks state of device's screen orientation. Demo
    • useSize โ€” tracks size of an HTML element. Demo
    • useScroll โ€” tracks an HTML element's scroll position. Demo
    • useScrollbarWidth โ€” gets current browser's scrollbar width. Demo
    • useSearchParams โ€” tracks browser's location search params. Demo
    • useWindowSize โ€” tracks Window scroll position. Demo
  • Animations
    • useInterval โ€” updates counter value repeatedly on a fixed time delay. Demo
    • useIntervalFn โ€” calls function repeatedly on a fixed time delay. Demo
    • useRaf โ€” returns elapsedTime with requestAnimationFrame. Demo
    • useRafFn โ€” calls function with requestAnimationFrame. Demo Demo
    • useTimeout โ€” returns isReady true when timer is completed. Demo
    • useTimeoutFn โ€” calls function when timer is completed. Demo
  • Side Effects
    • useBeforeUnload โ€” shows browser alert when user try to reload or close the page. Demo
    • useCookie โ€” provides way to read, update and delete a cookie. Demo
    • useFetch โ€” provides a way to fetch resources asynchronously across the network. Demo
    • useLocalStorage โ€” provides way to read, update and delete a localStorage key. Demo
    • useSessionStorage โ€” provides way to read, update and delete a sessionStorage key. Demo
  • UI
    • useClickAway โ€” triggers callback when user clicks outside target area. Demo
    • useFullscreen โ€” display an element in full-screen mode Demo
  • Utils
    • getQuery โ€” get a CSS media query string. Demo

๐ŸŽ Other examples of composition API functions

Some Vue composition API functions have not been included in this library but can be created easily by following the steps below.

useStore

Creating a useStore function connected to Vuex store is pretty straightforward. For example, given the following store:

// @src/mystore.ts
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
  state: { searchTerm: '' },
  mutations: {
    SET_SEARCH(state, newVal) {
      state.searchTerm = newVal
    }
  },
  getters: { searchTerm: state => state.searchTerm },
  actions: {},
  modules: {}
})

export default store

We can get the store from the vm and expose it in our useStore function:

// @src/useStore.ts
import { getCurrentInstance } from '@vue/composition-api'

export function useStore() {
  const vm = getCurrentInstance()
  if (!vm) throw new Error('Vue instance not found!')
  return vm.$store
}

Now we can use useStore inside the setup() method of our component:

// MyComponent.vue
<template>
  <input type="text" v-model="searchTerm" placeholder="๐Ÿ”Ž Search..." />
</template>

<script lang="ts">
  import Vue from 'vue'
  import { ref, watch } from '@src/api'
  import { useStore } from '@src/useStore'

  export default Vue.extend({
    name: 'UseStoreDemo',
    setup() {
      const { commit, getters } = useStore()
      const searchTerm = ref(getters['searchTerm'])
      watch(searchTerm, newVal => commit('SET_SEARCH', newVal))
      return { searchTerm }
    }
  })
</script>

useRouter

Creating a useRouter function connected to VueRouter is rather simple. We can get $route and $router from the vm and expose them in our useRouter function:

// @src/useRouter.ts
import { getCurrentInstance } from '@vue/composition-api'

export function useRouter() {
  const vm = getCurrentInstance()
  if (!vm) throw new Error('Vue instance not found!')
  const route = vm.$route
  const router = vm.$router
  return { route, router }
}

Now we can use useRouter inside the setup() method of our component:

// MyComponent.vue
<template>
  <div>
    Current id: {{ id }}
  </div>
</template>

<script lang="ts">
  import Vue from 'vue'
  import { useRouter } from '@src/useRouter'

  export default Vue.extend({
    name: 'UseRouterDemo',
    setup() {
      const { route } = useRouter()
      return { id: route.params.id }
    }
  })
</script>

Inspiration

Made with