Skip to content
此页目录
本文总阅读量

vssue实用方法

浏览器

使用屏幕断点

ts
import { useBreakpoints } from "@vueuse/core";
/**
 * 浏览器屏幕断点
 */
export const handleBreakpoints = () => {
  const breakpoints = useBreakpoints({
    xs: 0,
    sm: 768,
    md: 992,
    lg: 1200,
    xl: 1920,
    xxl: 2560,
  });
  const xs = breakpoints.between("xs", "sm");
  const sm = breakpoints.between("sm", "md");
  const md = breakpoints.between("md", "lg");
  const lg = breakpoints.between("lg", "xl");
  const xl = breakpoints.between("xl", "xxl");

  return { xs, sm, md, lg, xl };
};

复制文字

ts
import { useClipboard } from "@vueuse/core";
/**
 * 复制文字
 * @param text 要复制的内容
 */
export const handleClipboard = (text: string) => useClipboard().copy(text);

事件监听

ts
import { useEventListener } from '@vueuse/core'

const el = ref<HTMLElement | null>(null) // dom 元素
useEventListener(el,'click',() => {}) // 会在 dom 存在时自动注册事件,dom 被删除时会自动取消监听

取色器

ts
import { useEyeDropper } from '@vueuse/core'
const { 
  isSupported, // 是否支持
  open, // 打开取色
  sRGBHex // 16 进制色值
} = useEyeDropper()

网站图标

ts
import { useFavicon } from '@vueuse/core'
const icon = useFavicon()
icon.value = 'dark.png' // 修改当前网站的图标

全屏元素

ts
import { useFullscreen } from '@vueuse/core'
const el = ref<HTMLElement | null>(null)
const { 
  isFullscreen, // 是否全屏
  enter, // 进入全屏
  exit, // 退出全屏
  toggle // 切换
} = useFullscreen(el) // 传如 dom 元素

异步加载图片

vue
<script setup>
import { useImage } from '@vueuse/core'

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

<template>
  <span v-if="isLoading">Loading</span>
  <img v-else :src="avatarUrl">
</template>

加载 script 标签

ts
import { useScriptTag } from '@vueuse/core'
useScriptTag('https://player.twitch.tv/js/embed/v1.js',(el: HTMLScriptElement) => {

})

// 或手动控制加载
const { scriptTag, load, unload } = useScriptTag('https://player.twitch.tv/js/embed/v1.js',() => {

},{ manual: true },)

await load()
await unload()

加载 css 字符串

  • 输入
ts
import { useStyleTag } from '@vueuse/core'

const {
  id,
  css,
  load,
  unload,
  isLoaded,
} = useStyleTag('.home { margin-top: 32px; }')

css.value = '.home { margin-top: 64px; }'
  • 输出
html
<style type="text/css" id="vueuse_styletag_1">
.foo { margin-top: 64px; }
</style>

网站标题

ts
import { useTitle } from '@vueuse/core'

const title = useTitle('初始标题') // 可传入 computed 属性
// const title = useTitle('新标题', { titleTemplate: '%s | 默认值' }) // 新标题将会替换 %s
console.log(title.value) // 输出当前标题
title.value = 'Hello' // 修改标题

url 查询参数

  • history
ts
// 当前 url:localhost/?foo=fao
const params = useUrlSearchParams('history')
console.log(params.foo) // fao
params.foo = 'bar'
params.vueuse = 'some'
// 当前 url:localhost/?foo=bar&vueuse=awesome
  • hash
ts
const params = useUrlSearchParams('hash')
params.foo = 'bar'
params.vueuse = 'some'
// 当前 url:localhost/#/?foo=bar&vueuse=some

系统通知

ts
import { useWebNotification } from '@vueuse/core'
const {
  isSupported, // 是否支持
  notification, // 原数据
  show,
  close,
  onClick,
  onShow,
  onError,
  onClose,
} = useWebNotification({
  title: '标题',
  body: '正文',
  dir: 'rtl', // 文本方向 "auto" | "ltr" | "rtl"
  lang: 'en', // 通知语言
  tag: 'test', // 通知 id
  icon: '', // 通知图标
  renotify: true, // 是否在新的通知替换旧的通知
  requireInteraction: false, // 是否保持活跃,直到用户点击关闭才消失
  silent: false, // 是否静音,关闭震动
  vibrate: [], // 指定具有震动的硬件发出震动
})

isSupported && show()

onClick.on(() => {
  console.log('click');
})

传感器

键盘事件

ts
import { onKeyStroke } from '@vueuse/core'

onKeyStroke('ArrowDown', (e) => {
  console.log('按了↓');
})

// 监听多个键
onKeyStroke(['s', 'S', 'ArrowDown'], (e) => {
  console.log('按了' + e.key);
})

// 指定目标元素
onKeyStroke('A', (e) => {
  console.log('A')
}, { target:  document})

长按

ts
import { onLongPress } from '@vueuse/core'
const el = ref()
onLongPress(el, () => {
  console.log('长按500ms');
})

onLongPress(el, () => {
  console.log('长按1000ms');
},{delay: 1000})
  • 使用指令
vue
<script setup lang="ts">
import { ref } from 'vue'
import { vOnLongPress } from '@vueuse/components'
</script>
<template>
  <button v-on-long-press="onLongPress"></button>
</template>

设备列表

ts
import { useDevicesList } from '@vueuse/core'
const {
  devices, // 设备列表
  videoInputs, // 摄像头列表
  audioInputs, // 麦克风列表
  audioOutputs, // 扬声器列表
} = useDevicesList()

屏幕共享

ts
import { useDisplayMedia } from "@vueuse/core";
const { isSupported, stream, enabled, start, stop } = useDisplayMedia({
  enabled: false, // 是否自动调用屏幕共享,false 为手动调用 start 方法
  video: true, // 屏幕共享
  audio: true, // 系统音频共享
});

start()

const video = ref();
watchEffect(() => {
  video.srcObject = stream.value
})

鼠标悬停

ts
import { useElementHover } from '@vueuse/core'
const el = ref();
const isHovered = useElementHover(el)
  • 指令
ts
import { vElementHover } from '@vueuse/components'
// <button v-element-hover="onHover">
//   {{ isHovered }}
// </button>

焦点

ts
import { useFocus } from '@vueuse/core'

const el = ref()
const { focused } = useFocus(el, { 
  initialValue: true, // 是否聚焦后出发元素上的focus事件
})
// 设置 focused 会触发聚焦与失焦

地理位置

ts
import { useGeolocation } from '@vueuse/core'
const { 
  coords, // 经纬度
  locatedAt, // 时间
  error
} = useGeolocation()

跟踪用户空闲

ts
import { useIdle } from '@vueuse/core'
const { idle, lastActive } = useIdle(5 * 60 * 1000) // 5 min
console.log(idle.value) // true or false  5 分钟后用户没有做任何操作则为 true

无限滚动

ts
import { useInfiniteScroll } from '@vueuse/core'
const el = ref();
const data = ref([1,2,3,4,5,6])

useInfiniteScroll(el,() => {
  data.value.push(12)
},{ 
  direction: "bottom", // 监听方向 "top" | "bottom"
  distance: 10 // 距离边缘最小距离,默认 0
})
  • 指令
ts
import { vInfiniteScroll } from '@vueuse/components'
// <div v-infinite-scroll="onLoadMore">
//   <div v-for="item in data" :key="item">
//     {{ item }}
//   </div>
// </div>

// <!-- with options -->
// <div v-infinite-scroll="[onLoadMore, { 'distance' : 10 }]">
//   <div v-for="item in data" :key="item">
//     {{ item }}
//   </div>
// </div>

鼠标位置

ts
import { useMouse } from '@vueuse/core'
const { x, y, sourceType } = useMouse()

网络状态

ts
import { useNetwork } from '@vueuse/core'
const { 
  isSupported, // 是否支持
  isOnline, // 是否在线
  offlineAt, // 上次连接以来的时间
  downlink, // 下载速度
  downlinkMax, // 最大可达到的下载速度
  effectiveType, // 检测到的有效速度类型
  rtt, // 延迟
  saveData, // 用户是否激活了数据保护模式
  type // 网络类型
} = useNetwork()
console.log(isOnline.value)

网络在线

ts
import { useOnline } from '@vueuse/core'
const online = useOnline() // 网络是否在线

页面离开

ts
import { usePageLeave } from '@vueuse/core'
const isLeft = usePageLeave() // 鼠标是否离开页面

文本选中

ts
import { useTextSelection } from '@vueuse/core'
const state = useTextSelection() // state.text

评论

交流群