Vue版的 hooks 库 --- VueUse

3,724 阅读2分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战

前言

-- 最近在使用 Vue3.2+ 开发demo项目, 其中多次使用到了 VueUse 中的方法, 然后忍不住向大家推荐它了

-- VueUse 是一个基于 Composition API 的实用函数集, 与 Composition API 的配合相得益彰

-- VueUse 的作者是 Anthony Fu , Core team member of VueNuxt and Vite.

摘要

-- 本文主要介绍, 我在开发过程中, 用到的几个赞不绝口的方法. 同时也可以帮大家了解掌握 VueUse的使用方法.

-- 当然这篇文章也会持续更新的

-- 如果大家想了解更多, 请移步 VueUse 官方文档

进入主题

useTitle

作用: 修改项目的标题

它可以帮助你, 随时随地修改项目的标题

import { useTitle } from '@vueuse/core'

const title = useTitle()
console.log(title.value) // 拿到当前的标题
title.value = 'Hello' // 修改项目的标题

useVModels

作用: 优化父子组件数据的双向绑定

// 可以很好的实现父子组件数据的双向绑定
// 原用法
const emit = defineEmits(['update:modelValue', 'update:age'])
const changeInfo = () => {
// 触发父组件值更新
 emit('update:modelValue', 'Tom')
 emit('update:age', 30)
}


// 升级版
const { foo, bar } = useVModels(props)

console.log(foo.value) // props.foo
foo.value = 'foo' // emit('update:foo', 'foo')

useWindowScroll

作用: 你可以拿到响应式的滚动距离

import { useWindowScroll } from '@vueuse/core'

const { x, y } = useWindowScroll() // 拿到的 x, y都是响应式的

useIntersectionObserver

作用: 判断一个元素是否在视口(viewport)中; 或者说 判断一个元素是否在可见区域

关键点: stop -- 可以停止观测, target -- 被观测的元素, isIntersecting -- 表示是否可见, 第二个参数是回调方法

应用: 懒加载

// stop 是一个函数,可以停止观察
const { stop } = useIntersectionObserver(
      // 第一个参数是 target, 为要监听的元素
      target,
      // 第二个参数是回调方法,isIntersecting 表示是否可见
      ([{ isIntersecting }]) => {
        console.log(isIntersecting ? '可见' : '不可见')
      },
}

useIntervalFn

作用: 定时器的优化

import { useIntervalFn } from '@vueuse/core'

const { pause, resume, isActive } = useIntervalFn(() => {
  /* your function */
}, 1000)

// pause 停止定时器
// resume 开启定时器
// isActive 定时器是否在进行中, 在进行中为 true, 反之 false

demo 你可以很简单的实现一个倒计时组件

<template> 
<span
   class="code"
   v-if="!isActive"
   @click="sendCode"
   >发送验证码</span
  >
  <span class="code" v-else>{{ time }} 秒后可再次发送</span>
</template> 

<script setup>
import { ref, watch } from 'vue'
import { useIntervalFn } from '@vueuse/core'

// 倒计时组件
const time = ref(10)

const { pause, resume, isActive } = useIntervalFn(() => {
  time.value--
}, 1000)

// -初始化组件时关闭
pause()

// -何时关闭
watch(time, () => {
  if (time.value === 0) {
    pause()
  }
})

// -点击开始
const sendCode = () => {
  resume()
}
</script>