Vue.js和Nuxt.js是以其出色的开发者体验而闻名的框架。自从Vue 3发布后(Nuxt 3就是在此基础上编写的),我们获得了一系列的API,允许我们使用导入的函数来编写Vue组件,而不是声明选项。这就是通常所说的组合API。这个API使我们能够在Vue的Reactivity API、Lifecycle Hooks和它的底层依赖注入系统上创建抽象。
在这篇文章中,我们将讨论Vue开发者如何利用VueUse的功能来有效地简化开发,减少模板代码,同时允许他们快速建立原型和测试想法。
内容
VueUse和组合API
VueUse将自己描述为一个基本的Vue组合工具的集合。VueUse从组合API提供的API中利用其力量,并提供了200多个灵活和类型安全的函数,在你的组件中添加基本的交互,否则可能需要你的代码。
VueUse游乐场使你能够随心所欲地试验API。这个游乐场只是对这样一个广泛的库的完美补充。我们可以安装其他库,实时玩弄VueUse的功能,甚至可以分享你正在实验的游乐场的链接。
任何开发者确实可以写出一个类似于VueUse提供的可组合函数,然而,VueUse的函数是经过结构化、测试和优化的,对于任何Vue开发者来说,它是一把功能性的瑞士军刀。
开始使用VueUse
因为VueUse只是一个函数的集合,开始使用它应该像在你的项目中添加一个utils 文件并简单地从其中导入函数一样无缝。
要在你的Vue项目中安装VueUse,你可以通过npm安装获得它。
npm i @vueuse/core
或者通过CDN,将其作为window.VueUse 。
<script src="https://unpkg.com/@vueuse/shared"></script>
<script src="https://unpkg.com/@vueuse/core"></script>
查看他们的入门页面,了解在Nuxt和其他环境下的安装。
用VueUse作曲
使用VueUse的可组合性很简单。你会得到一个函数,它正好能做一个工具,或者提供一组功能。这个函数处理功能背后的整个复杂性,并且能够返回ref,ref是Vue中的反应性和可改变的对象。然后,ref被用作Vue的反应式变量,可以被使用或变异
下面是useClipboard VueUse函数的一个例子。这个可组合的函数能够从剪贴板中读写,以及响应复制、剪切和粘贴命令。甚至可以检查当前环境是否支持它。
import { useClipboard } from '@vueuse/core'
const source = ref('Something you need to copy')
const { text, copy, copied, isSupported } = useClipboard({ source })
使用方法很简单,而且非常灵活;你能够在你的Vue应用中到处使用它。该函数将返回你需要的变量的引用。useClipboard 源代码简明而完整,为你提供了实现这一功能所需的最简单的API。
如果你想用reactive而不是refs ,你可以简单地用vue的reactive() 函数来包装它们。
import { reactive } from 'vue'
import { useMouse } from '@vueuse/core'
const clipboard = reactive(useClipboard())
// "all available refs" will be unwrapped.
console.log(clipboard.copied)
配置可合成函数
VueUse函数提供了很多灵活性,例如,你有能力使用事件过滤器来节流、减震甚至暂停它们。
import { debounceFilter, throttleFilter, useMouse } from '@vueuse/core'
// mouse position will be updated after mouse idle for 1s
const { x, y } = useMouse({ eventFilter: throttleFilter(1000) })
// mouse position will be updated after mouse idle for 100ms
const { x, y } = useMouse({ eventFilter: debounceFilter(100) })
VueUse还能对其他特定功能的反应时间进行进一步配置。你有能力改变事件发生的时间与Vue生命周期事件的关系。
无渲染组件
VueUse通过@vueuse/components 包提供无渲染组件。在无渲染组件中,Ref绑定是自动完成的,VueUse提供了带有槽和道具的即用型组件,以捕捉事件并触发和编辑组件。
下面是一个VueUse组件的例子,它使我们能够在一个网页中 "落眼"(捕捉颜色)。
<script setup>
import { useEyeDropper } from '@vueuse/components'
<script/>
<template>
<UseEyeDropper v-slot="{ isSupported, sRGBHex, open }">
<button :disabled="!isSupported" @click="open">
sRGBHex: {{ sRGBHex }}
</button>
</UseEyeDropper>
<template>
如果从@vueuse/core ,同样的功能也可以提供可用的反应式引用。 这给了开发者最好的可用灵活性来使用和重用这些功能。
VueUse的函数库完全是树状的,经过测试,类型化,SSR友好,并为Vue做了很好的优化,使其安全且对开发者友好。
用Reactivity Transform简明地使用可组合函数
Reactivity Transform是一个实验性的编译时转换,允许我们在不使用.value 的情况下访问我们的Vueref 。它们是通过在相应的宏上加前缀$ 来创建的,就像这样。
ref→$refcomputed→$computedshallowRef→$shallowRefcustomRef→$customReftoRef→$toRef
对于VueUse来说,这意味着我们能够以一种非结构化的方式使用由可合成的Refs。
import { useMouse } from '@vueuse/core'
const { x, y } = $(useMouse())
console.log(x, y) // no need to write x.value and y.value
VueUse中突出的函数
显然,我们可以用VueUse中的函数构建很多很酷的东西;每个函数都有一个特定的用例。下面,你可以找到一个大纲,说明我们如何使用其中的一些函数来轻松构建和扩展令人震惊的界面和交互。
在VueUse上,功能被按类别分开,并被重新组合成两种不同的类型:核心和附加功能。核心函数是轻量级和无依赖性的函数,在内部使用Vue反应性来执行任务。附加组件是按照可组合的方式对流行的包进行包装的功能版本。
在下面的章节中,我将列出每个类别,并简要解释它所包含的功能和你可以用它们构建的例子。
浏览器
浏览器函数是反应式函数,具有与浏览器API交互的能力。你有能力检查权限;使用API,如通知、全屏和振动;甚至根据断点(useBreakpoint )来操作你的用户界面。
传感器
传感器功能能够捕获用户事件并使用设备API。这些函数的范围包括从鼠标或键盘抓取不同的事件(useMousePressed,useMouse,onStartTyping,onMagicKeys )到DOM发射的事件,如useElementHover 和onClickOutside 。
VueUse的传感器函数由于其与反应性的关系而非常棒。有时你需要实时的事件,但有时你可能需要对它们进行节流,VueUse很好地完成了这一点。
动画
动画功能大多与时间有关。然而,它们不仅仅是针对动画的;你也可以用它们来根据时间更新你的用户界面。
这些函数包括useNow 和useTimestamp ,给我们提供当前的日期(实时)。我们还有useInterval 和useTimeout ,它们的作用类似于JavaScriptsetTimeout 和setInterval ,以及useTransition 。它们可以执行非常简单到复杂和自定义的转换。
VueUse还公开了一个名为@vueuse/motion的插件。@vueuse/motion在引擎盖下使用popmotion,使你能够创建漂亮的动画。@vueuse/motion还允许你把它的API作为指令或作为一个可组合的。请访问文档,了解更多关于如何使用这个伟大的附加组件制作动画的例子。
状态
状态函数使你能够访问与你的Vue组件和浏览器状态有关的一切。这个类别的亮点是createGlobalState,useLocalStorage 和useRefHistory 。
createGlobalState useLocalStorage 使我们能够反应性地使用浏览器的 ,而 则跟踪一个 的变化历史。localStorage useRefHistory ref
元素
元素组件帮助你反应性地访问你的HTML元素的状态。你可以使用useMouseInElement 来获取鼠标在元素中的相对位置,或者使用useDraggable 来使任何HTML元素可以拖动。useDraggable 功能非常强大,因为你能够跟踪它们的位置,并将它们的坐标持久地保存在浏览器的存储器中。
组件
组件函数允许你反应性地处理你的组件的许多方面。有一些函数可以绑定模板参考,以便安全地与组件的生命周期互动。
我在这个类别中的亮点是useVirtualList ,它能够将一个渲染的数组虚拟成一行。这个函数允许你渲染最少的元素,以便在一个容器中显示数组中的项目。
观察
观察函数的作用就像Vue的watch ,是一种类固醇。它们让你能够只观察一次,观察并过滤事件,以去势或节流的方式观察,甚至观察并忽略某些变化。
网络
这些是与网络事件互动的函数。它们能够进行异步HTTP调用并返回调用或连接的状态。
这个类别中突出的函数是useFetch 和useWebSocket ,因为它们可能可以单独成为另一个包,并且仍然非常受欢迎。
useFetch 使我们能够在我们的Vue应用中获取、重新获取、拦截和中止HTTP请求。它非常强大,因为它处理反应性的方式;该函数返回反射和回调,使你能够跟踪请求的状态,中止,并在获取事件后启动其他函数。
VueUse还为Axios库提供了一个可组合的包装器。useAxios ,实现了Axios的所有功能,同时保持了Vue对事件的反应性。
实用工具
这个类别包含任何其他可能帮助你在Vue应用中创建或处理反应式元素和功能的函数。
上面讨论的功能只是200多个功能中的一部分概述,而且这个列表还在不断扩大。
你可以用VueUse构建的应用程序
- 像Trello看板这样复杂的动画拖放界面可以用
@vueuse/gesture附加包轻松实现 - 通过结合
useDraggable和useResizeObserver,可以建立一个图像分类UI,使用户能够选择图像的一部分并进行分类,以帮助用户创建选择框并跟踪其相对于被分类图像的位置。 - 由于VueUse支持
@vueuse/gestures、useGamepad、useMagicKeys和useMouse,它可以成为在浏览器上创建游戏的一个好伙伴。这简化了为与本地API交互而编写的代码。
VueUse的贡献者总是寻找创造性的方法来展示如何利用每个功能的例子。翻阅文档可以成为开发者的灵感来源。
编写你自己的可组合程序
编写Vue的可组合程序就像使用它们一样简单。下面是一个可组合函数的例子,它可以帮助反应性地跟踪鼠标的位置。
// mouse.js
import { ref, onMounted, onUnmounted } from 'vue'
// by convention, composable function names start with "use"
export function useMouseCustom() {
// state encapsulated and managed by the composable
const x = ref(0)
const y = ref(0)
// a composable can update its managed state over time.
function update(event) {
x.value = event.pageX
y.value = event.pageY
}
// a composable can also hook into its owner component's
// lifecycle to setup and teardown side effects.
onMounted(() => window.addEventListener('mousemove', update))
onUnmounted(() => window.removeEventListener('mousemove', update))
// expose managed state as return value
return { x, y }
}
上面的useMouseCustom 函数遵循了VueUse暴露出来的一些列准则。这些准则可以帮助你写出更好的可组合程序,这些程序在Vue版本之间是向后兼容的,而且副作用很小甚至没有。
总结
我相信VueUse是对Vue生态系统的一个伟大补充。它在开发者体验方面所带来的价值是巨大的。该库对任何水平的开发者都是平易近人的,并且对任何可能的改进都是开放的。
在这篇文章中,我们已经看到了VueUse是如何利用组合API的力量来创建可以为你的开发工作流程带来超强动力的函数。这些函数是经过测试的,安全的,并且很容易集成到你的任何规模的Vue/Nuxt应用程序上。