vueUse常用Api

VueUse是一个包含众多Composition API实用函数的开源项目,适用于Vue 2和Vue 3。本文介绍了如useUrlSearchParams、useFullscreen、useIntersectionObserver等常用函数,帮助开发者提升项目效率。
摘要由CSDN通过智能技术生成

vueUse工具常用Api

简介:vueuse 是一个用于 vue 项目中的常用工具集,是 Anthony Fu 的一个开源项目,提供了大量适用于 Vue 2 和 Vue 3 的基本 Composition API 实用程序函数。

官网:vueUse-code.js
常用函数

useUrlSearchParams 路由参数 获取url中query参数,或者设置query参数

import { useUrlSearchParams } from '@vueuse/core'

const params = useUrlSearchParams('history') //history模式
const params = useUrlSearchParams('hash') //hash模式

console.log(params.foo) // 'bar'
params.foo = 'bar'
params.vueuse = 'awesome'

usePreferredColorScheme 系统主题 获取系统主题模式

import { usePreferredColorScheme } from '@vueuse/core'

const preferredColor = usePreferredColorScheme()

useFullscreen 全屏 dom全屏,进入和退出,切换方法

// dom
const el = ref<HTMLElement | null>(null)

const { isFullscreen, enter, exit, toggle } = useFullscreen(el)

useMediaControls 媒体标签参数 可获取媒体组件video的参数,具体参数参考文档接口

<script setup lang="ts">
import { onMounted, ref } from 'vue'
import { useMediaControls } from '@vueuse/core'

const video = ref()
const { playing, currentTime, duration, volume } = useMediaControls(video, { 
  src: 'video.mp4',
})

// Change initial media properties
onMounted(() => {
  volume.value = 0.5
  currentTime.value = 60
})
</script>

<template>
  <video ref="video" />
  <button @click="playing = !playing">Play / Pause</button>
  <span>{
  { currentTime }} / {
  { duration }}</span>
</template>

useMouse 获取鼠标位置

<template>
    <div>
        <p>x的值:{
  { x }}</p>
        <p>y的值:{
  { y }}</p>
    </div>
</template>

<script setup>
    import { useMouse } from '@vueuse/core';

    const { x, y } = useMouse({
        type: 'page', // 鼠标的位置是相对页面(page)还是浏览器(client)
        touch: true,
        resetOnTouchEnds: false,
        initialValue: {
            x: 100,
            y: 200
        }
    })
</script>

useDebounceFn 防抖,持续触发事件时,一定时间段内没有再触发事件

<template>
    <p> {
  { counter }}</p>

    <button @click="clickedFn">UseDebounceFn</button>
</template>

<script setup lang="ts">
    import { ref } from 'vue'
    import { useDebounceFn } from '@vueuse/core'

    const counter = ref(0)
    // 第三个参数为最大等待时间,类似于 lodash debounce
    const debouncedFn = useDebounceFn(() => {
        counter.value += 1
    }, 1000, { maxWait: 5000 })

    const clickedFn = () => {
        debouncedFn()
    }
</script>

useIntersectionObserver 监听进入可视区域行为,实现数据的懒加载


// stop 是停止观察是否进入或移出可视区域的行为    
const { stop } = useIntersectionObserver(
  // target 是观察的目标dom容器,必须是dom容器,而且是vue3.0方式绑定的dom对象
  target,
  // isIntersecting 是否进入可视区域,true是进入 false是移出
  // observerElement 被观察的dom
  ([{ isIntersecting }], observerElement) => {
    // 在此处可根据isIntersecting来判断,然后做业务
    //如果进入了可视区,就先让其停止监测,然后进行数据的请求
    if (isIntersecting) {
          stop()
          findNew().then(data => {
          goods.value = data.result
    })
  },
    // 配置选项,相交的比例大于0就触发
    {
      threshold: 0
    }
)

useVirtualList 创建虚拟列表,实现虚拟滚动条

<script setup lang="ts">
import type { Ref } from 'vue'
import { computed, ref } from 'vue'
import { useVirtualList } from '@vueuse/core'
const index: Ref = ref()
const search = ref('')
const allItems = Array.from(Array(99999).keys())
  .map(i => ({
    height: i % 2 === 0 ? 42 : 84,
    size: i % 2 === 0 ? 'small' : 'large',
  }))
const filteredItems = computed(() => {
  return allItems.filter(i => i.size.startsWith(search.value.toLowerCase()))
})
const { list, containerProps, wrapperProps, scrollTo } = useVirtualList(
  filteredItems,
  {
    itemHeight: i => (filteredItems.value[i].height + 8),
    overscan: 10,
  },
)
const handleScrollTo = () => {
  scrollTo(index.value)
}
</script>

<template>
  <div>
    <div>
      <div class="inline-block mr-4">
        Jump to index
        <input v-model="index" placeholder="Index" type="number">
      </div>
      <button type="button" @click="handleScrollTo">
        Go
      </button>
    </div>
    <div>
      <div class="inline-block mr-4">
        Filter list by size
        <input v-model="search" placeholder="e.g. small, medium, large" type="search">
      </div>
    </div>
    <div v-bind="containerProps" class="h-300px overflow-auto p-2 bg-gray-500/5 rounded">
      <div v-bind="wrapperProps">
        <div
          v-for="{ index, data } in list"
          :key="
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值