๐ ๏ธ Vue kit of useful Vue Composition API functions.
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
import Vue from 'vue'
import VueCompositionAPI from '@vue/composition-api'
Vue.use(VueCompositionAPI)
<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>
- Sensors
useGeolocation
โ tracks geolocation state of user's device.useHover
โ tracks mouse hover state of a given element.useIdle
โ tracks whether user is being inactive.useIntersection
โ tracks intersection of target element with an ancestor element.useKey
โ executes a handler when a keyboard key is pressed.useLocation
โ tracks bar navigation location state.useMedia
โ tracks state of a CSS media query.useMediaDevices
โ tracks connected hardware devices.useMouse
โ tracks the mouse position.useMouseElement
โ tracks the mouse position relative to given element.useMouseLeavePage
โ tracks when mouse leaves page boundaries.useOrientation
โ tracks state of device's screen orientation.useSize
โ tracks size of an HTML element.useScroll
โ tracks an HTML element's scroll position.useScrollbarWidth
โ gets current browser's scrollbar width.useSearchParams
โ tracks browser's location search params.useWindowSize
โ tracksWindow
scroll position.
- Animations
useInterval
โ updatescounter
value repeatedly on a fixed time delay.useIntervalFn
โ calls function repeatedly on a fixed time delay.useRaf
โ returnselapsedTime
with requestAnimationFrame.useRafFn
โ calls function with requestAnimationFrame.useTimeout
โ returnsisReady
true when timer is completed.useTimeoutFn
โ calls function when timer is completed.
- Side Effects
useBeforeUnload
โ shows browser alert when user try to reload or close the page.useCookie
โ provides way to read, update and delete a cookie.useFetch
โ provides a way to fetch resources asynchronously across the network.useLocalStorage
โ provides way to read, update and delete a localStorage key.useSessionStorage
โ provides way to read, update and delete a sessionStorage key.
- UI
useClickAway
โ triggers callback when user clicks outside target area.useFullscreen
โ display an element in full-screen mode
- Utils
getQuery
โ get a CSS media query string.
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>