π οΈ Vue kit of useful Vue Composition API functions.
npm install vue-use-kitSince 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-apiimport 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β tracksWindowscroll position.
- Animations
useIntervalβ updatescountervalue repeatedly on a fixed time delay.useIntervalFnβ calls function repeatedly on a fixed time delay.useRafβ returnselapsedTimewith requestAnimationFrame.useRafFnβ calls function with requestAnimationFrame.useTimeoutβ returnsisReadytrue 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 storeWe 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>