官方文档
yarn add @vueUse/core
获取激活元素
ActiveElement
获取鼠标位置
useDraggable
文件外部拖拽
DropZone
动态获取元素尺寸
ElementBounding
检测元素是否在视区
useElementVisibility
检测内容是否在视区
IntersectionObserver
屏幕捕获
帧率显示
useFps
长列表
useInfiniteScroll
透视卡片效果
useParallax
一次性滑动
usePointerSwipe
滚动监测
useScroll
滑块锁定
useScrollLock
滑动解锁效果
useSwipe
监听鼠标选择的内容
useTextSelection
for简写增删列表
useTemplateRefsList
虚拟列表
useVirtualList
v-Model 简写
useVModel
props + emit -> ref
- 原始写法
import { useVModel } from '@vueuse/core'
export default {
setup(props, { emit }) {
const data = useVModel(props, 'data', emit)
console.log(data.value) // props.data
data.value = 'foo' // emit('update:data', 'foo')
},
}
<script lang="ts" setup>
import { useVModel } from '@vueuse/core'
const props = defineProps<{
modelValue: string
}>()
const emit = defineEmits(['update:modelValue'])
const data = useVModel(props, 'modelValue', emit)
</script>
v-model 简写2
useVModels
import { useVModels } from '@vueuse/core'
export default {
props: {
foo: String,
bar: Number,
},
setup(props, { emit }) {
const { foo, bar } = useVModels(props, emit)
console.log(foo.value) // props.foo
foo.value = 'foo' // emit('update:foo', 'foo')
},
}
数据监听器
watchArray
类似于watch
,但向回调函数提供添加和删除的元素。如果使用,等{ deep: true }
更新列表,则通过。push``splice
import { watchArray } from '@vueuse/core'
const list = ref([1, 2, 3])
watchArray(list, (newList, oldList, added, removed) => {
console.log(newList) // [1, 2, 3, 4]
console.log(oldList) // [1, 2, 3]
console.log(added) // [4]
console.log(removed) // []
})
onMounted(() => {
list.value = [...list.value, 4]
})
监听器暂停/启动开关
watchPausable
Base64
useBase64
如果您使用对象、数组、映射或集合,您可以在选项中提供序列化程序。否则,您的数据将被默认序列化程序序列化。对象和数组将由 JSON.stringify
转换为字符串。map
和 set
在 stringify
之前将分别转换为 object
和 array
。
import { Ref, ref } from 'vue'
import { useBase64 } from '@vueuse/core'
const text = ref('')
const { base64 } = useBase64(text)
去抖
useDebounceFn
import { useDebounceFn } from '@vueuse/core'
const debouncedFn = useDebounceFn(() => {
// do something
}, 1000) // 1秒内所有请求讲合并成一次调用
document.addEventListener('resize', debouncedFn)
事件(event bus)
useEventBus
import { useEventBus } from '@vueuse/core'
const bus = useEventBus<string>('news')
const listener = (event: string) => {
console.log(`news: ${event}`)
}
// 创建一个事件
const unsubscribe = bus.on(listener)
// fire an event
// 触发事件
bus.emit('The Tokyo Olympics has begun')
// 移除所有事件
unsubscribe()
// 移除指定事件
bus.off(listener)
// 清空事件
bus.reset()
请求缓存(反应链)
useMemoize
import { useMemoize } from '@vueuse/core'
const getUser = useMemoize(
async (userId: number): Promise<UserData> =>
axios.get(`users/${userId}`).then(({ data }) => data),
)
const user1 = await getUser(1) // Request users/1
const user2 = await getUser(2) // Request users/2
// ...
const user1 = await getUser(1) // Retrieve from cache
// ...
const user1 = await getUser.load(1) // Request users/1
// ...
getUser.delete(1) // Delete cache from user 1
getUser.clear() // Clear full cache
配合computed
或asyncComputed
能达到自动更新的反应链模式
const user1 = asyncComputed(() => getUser(1))
// ...
await getUser.load(1) // Will also update user1
组件
分页
useOffsetPagination
多步骤表单
useStepper
工具
事件钩子
createEventHook
- 包装一个请求
import { createEventHook } from '@vueuse/core'
export function useMyFetch(url) {
const fetchResult = createEventHook<Response>()
const fetchError = createEventHook<any>()
fetch(url)
.then(result => fetchResult.trigger(result))
.catch(error => fetchError.trigger(error.message))
return {
onResult: fetchResult.on,
onError: fetchError.on,
}
}
- 使用
<script setup lang="ts">
import { useMyFetch } from './my-fetch-function'
const { onResult, onError } = useMyFetch('my api url')
onResult((result) => {
console.log(result)
})
onError((error) => {
console.errr(error)
})
</script>