vue3【提效】使用 VueUse 高效开发(工具库 @vueuse/core + 新增的组件库 @vueuse/components)

简介: vue3【提效】使用 VueUse 高效开发(工具库 @vueuse/core + 新增的组件库 @vueuse/components)

Vueuse 是一个功能强大的 Vue.js 生态系统工具库,提供了可重用的组件和函数,帮助开发者更轻松地构建复杂的应用程序。

官网 :https://vueuse.org/core/useWindowScroll/

安装 VueUse

npm i @vueuse/core @vueuse/components

可选)安装自动导入,添加到 imports 中

      // 需自动导入方法的库
      imports: [
        'vue',
        'pinia',
        '@vueuse/core',
        '@vueuse/components'
      ]

工具库

获取鼠标坐标 useMouse()

<script setup lang="ts">
const { x, y } = useMouse()
</script>

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

监听鼠标按下 useMousePressed()

<script setup>
const { pressed } = useMousePressed()
</script>

<template>
  <p>{{ pressed }}</p>
</template>

获取鼠标选择的文字 useTextSelection()

<script setup>
const state = useTextSelection()
</script>

<template>
  <p>一段供鼠标选择的文字</p>
  <p>被鼠标选择的文字是:{{ state.text }}</p>
</template>

窗口滚动条 useWindowScroll()

// 获取滚动条坐标
const { x, y } = useWindowScroll({ behavior: 'smooth' })
<!-- 滚动滚动条 -->
<button @click="x += 200">向右滚动 200 px</button>
<button @click="y += 200">向下滚动 200 px</button>

<!-- 滚动滚动条到指定位置 -->
<button @click="y = 600">向下滚动到 600 px</button>

元素滚动条 useScroll()

const el = ref<HTMLElement | null>(null)
const { x, y, isScrolling, arrivedState, directions } = useScroll(el)
<div ref="el" />
 

获取窗口大小 useWindowSize()

const { width, height } = useWindowSize()

添加事件监听 useEventListener

<script setup lang="ts">
let num = ref(0)
// 监听鼠标移动
useEventListener('mousemove', () => {
  num.value++
})
</script>

<template>
  <div class="p-20">
    <p>num:{{ num }}</p>
  </div>
</template>
  • 组件卸载时,监听事件会自动被移除

复制到剪贴板 useClipboard()

<script setup lang="ts">
const { copy, copied, isSupported, text } = useClipboard()

let msg = '你好'

async function doCopy() {
  copy(msg)

  if (copied) {
    alert('已复制到剪贴板!')
  }
}
</script>

<template>
  <div class="p-20">
    <p>{{ msg }}</p>
    <p v-if="text">已复制到剪贴板的内容:{{ text }}</p>
    <button v-if="isSupported" @click="doCopy">复制</button>
  </div>
</template>
  • copy 复制的方法
  • copied 是否完成复制
  • isSupported 浏览器是否支持复制到剪贴板
  • text 复制到剪贴板的内容

选择本地文件 useFileDialog()

<script setup lang="ts">
const { files, open, reset, onChange } = useFileDialog()
onChange((files) => {
  console.log(files)
})
</script>

<template>
  <button type="button" @click="open()">选择文件</button>
  <button type="button" :disabled="!files" @click="reset()">清空选择</button>
  <template v-if="files">
    <p>
      已选择 <b>{{ `${files.length}` }}</b> 个文件
    </p>
    <li v-for="file of files" :key="file.name">
      {{ file.name }}
    </li>
  </template>
</template>

切换全屏模式 useFullscreen()

<script setup lang="ts">
const { isFullscreen, enter, exit, toggle } = useFullscreen()
</script>

<template>
  <button v-if="isFullscreen" @click="exit">退出全屏</button>
  <button v-else @click="enter">全屏</button>

  <button @click="toggle">切换全屏模式</button>
</template>

图片加载 useImage

<script setup>
const avatarUrl = 'https://place.dog/300/200'
const { isLoading, error } = useImage({ src: avatarUrl })
</script>

<template>
  <span v-if="isLoading">图片加载中...</span>
  <span v-else-if="error">图片加载失败</span>
  <img v-else :src="avatarUrl" />
</template>

获取联网信息 useNetwork()

const { isOnline, offlineAt, downlink, downlinkMax, effectiveType, saveData, type } = useNetwork()

判断是否联网 useOnline()

const online = useOnline()

给元素添加动画 useOnline()

<script setup>
const el = ref()
const {
  isSupported,
  animate,

  // actions
  play,
  pause,
  reverse,
  finish,
  cancel,

  // states
  pending,
  playState,
  replaceState,
  startTime,
  currentTime,
  timeline,
  playbackRate
} = useAnimate(el, { transform: 'rotate(360deg)' }, 1000)
</script>

<template>
  <div class="p-40">
    <span ref="el" style="display: inline-block">旋转360度</span>
  </div>
</template>

可控的计时器 useIntervalFn()

<script setup>
let num = ref(0)
const { pause, resume, isActive } = useIntervalFn(() => {
  num.value++
}, 1000)
</script>

<template>
  <div class="p-40">
    <div>
      {{ num }}
    </div>

    <button v-if="isActive" @click="pause">暂停计时器</button>
    <button v-else @click="resume">恢复计时器</button>
  </div>
</template>

暂停代码执行 promiseTimeout

import { promiseTimeout } from '@vueuse/core'
async function print() {
  // 开启 console 的默认计时器
  console.time()

  // 打印当前 console默认计时器 的时间
  console.timeLog()

  // 等待1s后执行
  await promiseTimeout(1000)

  // 打印当前 console默认计时器 的时间
  console.timeLog()
}
print()

获取网页标题 useTitle()

const title = useTitle()
console.log(title.value) // 打印当前网页的标题

更多工具可参考官网,持续更新中!

组件库

图片加载 UseImage

<script setup lang="ts">
import { UseImage } from '@vueuse/components'
</script>

<template>
  <UseImage src="https://place.dog/300/200">
    <!-- 建议优化为图片加载动画 -->
    <template #loading> 图片加载中.. </template>

    <template #error> 图片加载失败 </template>
  </UseImage>
</template>

一键复制到剪贴板 UseClipboard

<script setup lang="ts">
import { UseClipboard } from '@vueuse/components'
</script>

<template>
  <UseClipboard v-slot="{ copy, copied }" source="复制的内容">
    <button @click="copy()">
      <!-- 建议优化为复制相关的图标 -->
      {{ copied ? '复制成功' : '复制' }}
    </button>
  </UseClipboard>
</template>

获取联网状态 UseNetwork / UseOnline

<script setup>
import { UseNetwork } from '@vueuse/components'
</script>

<template>
  <UseNetwork v-slot="{ isOnline }"> 是否联网: {{ isOnline }} </UseNetwork>
</template>

另一个也类似

<script setup>
import { UseOnline } from '@vueuse/components'
</script>

<template>
  <UseOnline v-slot="{ isOnline }"> 是否联网: {{ isOnline }} </UseOnline>
</template>
目录
相关文章
|
2月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
155 64
|
2月前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
124 60
|
18天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
68 3
|
2月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
45 8
|
2月前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
41 1
|
2月前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
50 1
|
2月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
2月前
|
JavaScript 索引
Vue 3.x 版本中双向数据绑定的底层实现有哪些变化
从Vue 2.x的`Object.defineProperty`到Vue 3.x的`Proxy`,实现了更高效的数据劫持与响应式处理。`Proxy`不仅能够代理整个对象,动态响应属性的增删,还优化了嵌套对象的处理和依赖追踪,减少了不必要的视图更新,提升了性能。同时,Vue 3.x对数组的响应式处理也更加灵活,简化了开发流程。
|
2月前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发
|
2月前
|
JavaScript 前端开发 开发者
Vue 3中的Proxy
【10月更文挑战第23天】Vue 3中的`Proxy`为响应式系统带来了更强大、更灵活的功能,解决了Vue 2中响应式系统的一些局限性,同时在性能方面也有一定的提升,为开发者提供了更好的开发体验和性能保障。
90 7