npm install @vueuse/core
因为vueUse目前(2022.10.10)网络上并没有中文版,但他真的很好用,只能生啃了
https://vueuse.org/core/useDark/
import { useDark} from '@vueuse/core'
//直接调用库,判断是否为暗黑,而且是响应式的
let isDark = useDark()
// computed,根据isDark变化而变化
const theme = computed(()=>isDark.value?'dark':'light')
//然后接下来如果打开或者关闭暗黑模式,theme的值也会随之变化的
这个其实就是localStorage或者sessionStorage本身的调用而已,只不过这个更简单,对象也不用转换序列化直接拿就行
import { useStorage , useLocalStorage , useSessionStorage} from '@vueuse/core'
//返回其本身
const state = useStorage('name','jack')
console.log(state.value) //jack
const obj = useLocalStorage('humen',{name:'tom',age:13})
console.log(obj.value) //{"name": "tom","age": 13}
const flag = useSessionStorage('flag',true)
console.log(flag.value) //true
useSessionStorage('sid',"asd")
//等价于
sessionStorage.setItem("sid","asd")
useSessionStorage('sid',null)
//等价于
sessionStorage.getItem("sid")
https://vueuse.org/core/usemanualrefhistory/#usemanualrefhistory
import {useManualRefHistory } from '@vueuse/core'
const counter = ref(0)
console.log(counter.value) //0
//后面的配置对象可选,其中capacity表示保留最大的历史长度,默认保留全部
const {history,commit,undo,redo,clear,last} = useManualRefHistory(counter,{capacity:15})
counter.value ++
console.log(counter.value) //1
console.log(history.value) //[{"snapshot": 0,"timestamp": 1665393961869}]
//提交历史记录
commit()
console.log(counter.value) //1
console.log(history.value)
// [
// {
// "snapshot": 1,
// "timestamp": 1665393961869
// },
// {
// "snapshot": 0,
// "timestamp": 1665393961869
// }
// ]
//就是不做嘛,取消那次commit,同时将值改回之前的
undo()
console.log(counter.value) // 0
console.log(history.value)
// [
// {
// "snapshot": 0,
// "timestamp": 1665393961869
// }
// ]
//redo,再次做一次commit,并且值也再做一个更新
redo()
console.log(counter.value) //1
console.log(history.value)
// [
// {
// "snapshot": 1,
// "timestamp": 1665393961869
// },
// {
// "snapshot": 0,
// "timestamp": 1665393961869
// }
// ]
//保存上一次的记录
console.log(last.value)
// {
// "snapshot": 1,
// "timestamp": 1665394221917
// }
//清楚历史记录
clear()
console.log(counter.value) //1
console.log(history.value)
// [
// {
// "snapshot": 1,
// "timestamp": 1665393961869
// },
// {
// "snapshot": 0,
// "timestamp": 1665393961869
// }
// ]
https://vueuse.org/core/useasyncstate/#useasyncstate
可以查看其中是否为处理完成,或者看失败效果都是可以的
import {useAsyncState } from '@vueuse/core'
import axios from 'axios'
//execute是执行的函数,需要传一个Promise
//state是处理完成的数据,就是请求后得到的结果
// isReady和isLoading是看目前有没有处理完成还是处理中
// error 是该请求如果错误的话,会显示错误信息
const {state,isReady,isLoading ,execute,error} = useAsyncState(
//第一个函数发请求,其中可传参过去
(args) =>{
// 这里就可以拿参数过去
const id = args?.id || 1
return axios.get(`https://jsonplaceholder.typicode.com/todos/${id}`).then(t => t.data)
},
//这个不太知道,不用管也行
{},
//配置
{
immediate:false //immediate为false,需要手动执行execute才会做异步处理
}
)
<van-button @click="execute">点击测试事件van-button>
<br>结果:{{state}}
<br>是否处理完成:{{isReady}}
<br>是否处理中:{{isLoading}}
<br>错误信息:{{error}}
<br>
一开始,几个值是
结果:{}
是否处理完成:false
是否处理中:false
错误信息:null
发请求中,分别是
结果:{}
是否处理完成:false
是否处理中:true
错误信息:null
发成功后
结果:{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
}
是否处理完成:true
是否处理中:false
错误信息:null
如果错误则是
结果:{}
是否处理完成:false
是否处理中:false
错误信息:xxx(错误信息)
可以看到,状态结果都有返回的,如果以后是想做过渡动画或者判断是否还在请求中之类的,可以直接调用这个,判断isLoading就可以
https://vueuse.org/core/usebrowserlocation/#usebrowserlocation
import {useBrowserLocation} from '@vueuse/core'
const location = useBrowserLocation()
console.log(location.value)
{
"trigger": "load",
"state": {
"back": null,
"current": "/",
"forward": null,
"position": 1,
"replaced": true,
"scroll": {
"left": 0,
"top": 6
}
},
"length": 2,
"hash": "",
"host": "192.168.1.6:5173",
"hostname": "192.168.1.6",
"href": "http://192.168.1.6:5173/",
"origin": "http://192.168.1.6:5173",
"pathname": "/",
"port": "5173",
"protocol": "http:",
"search": ""
}
https://vueuse.org/core/useGamepad/
虽然可能以后都用不上,但是他帅啊,而且现在浏览器居然能做出这种了
(题外话,浏览器唤醒蓝牙也是可以的)
具体咋用还不是很知道,但知道有这么一回事就行了
https://vueuse.org/core/usePreferredLanguages/
import {usePreferredLanguages} from '@vueuse/core'
const lang = usePreferredLanguages()
console.log(lang)
[
"zh-CN",
"en-GB",
"en-US",
"en",
"zh"
]
https://vueuse.org/core/useScreenSafeArea/
这个还不知道怎么用,但是可以抓到IOS低下那安全区域
import { useScreenSafeArea } from '@vueuse/core'
const {
top,
right,
bottom,
left,
} = useScreenSafeArea()
https://vueuse.org/core/useTitle/
import {useTitle} from '@vueuse/core'
useTitle('我是标题') //浏览器的标题就会变了
https://vueuse.org/core/useUrlSearchParams
要根据路由是history还是hash,传对应的值才会显示正确,hash就是有#的那个
import {useUrlSearchParams} from '@vueuse/core'
//如果浏览器是history类型的话
const param = useUrlSearchParams('history')
console.log(param)
如果浏览器为http://192.168.22.199:5173/?name=jack&age=12
,结果就是
{
"name": "jack",
"age": "12"
}
一般用在手机浏览器中,电脑的PC端咋震动嘛
一定要用在某些事件按钮里面,这样才是最好的
import {useVibrate} from '@vueuse/core'
//一个点击事件
const testClick = () => {
// 参数配置:震300ms,然后暂停100ms,再震300ms
const { vibrate, stop, isSupported } = useVibrate({ pattern: [300, 100, 300] })
console.log(isSupported.value);
vibrate()
//在某一处可以停止
// stop()
}
https://vueuse.org/core/onKeyStroke/
import {onKeyStroke } from '@vueuse/core'
const counter = ref(0)
onKeyStroke(['w','W','ArrowUp'],(event)=>{
console.log(event)
counter.value ++ //如果按下W或者上键,counter的值+1
})
import {onLongPress } from '@vueuse/core'
//定义一个html的ref元素,这个要挂载到html中的
const htmlRef = ref(null)
const flag = ref(false)
//第一个参数是html中的ref元素
//第二个参数是回调函数,长按后发生什么事情
//第三个是option,默认delay = 500
onLongPress(htmlRef,(evt)=>{
console.log(evt)
flag.value = true
},{
delay:1000
})
{{flag}}
<van-button ref="htmlRef">点击测试事件van-button>
长按1s后,flag = true
https://vueuse.org/core/usegeolocation/
import { useGeolocation } from '@vueuse/core'
const { coords, locatedAt, error } = useGeolocation()
其中coords包含所有的地理信息
有很多好用的,比如
https://vueuse.org/core/computedAsync/
import { computedAsync } from '@vueuse/core'
const userInfo = computedAsync(
//写异步回调函数,return什么
async () => {
return await mockLookUp(name.value)
},
null, // initial state
)
import { reactiveOmit } from '@vueuse/core'
const obj = reactive({
x: 0,
y: 0,
elementX: 0,
elementY: 0,
})
const picked = reactiveOmit(obj, 'x', 'elementX') // { y: number, elementY: number }
import { reactivePick } from '@vueuse/core'
const obj = reactive({
x: 0,
y: 0,
elementX: 0,
elementY: 0,
})
const picked = reactivePick(obj, 'x', 'elementX') // { x: number, elementX: number }
import { useBase64 } from '@vueuse/core'
//这个就是要转换成base64的
const text = ref('')
//转换成base64
const { base64 } = useBase64(text)
https://vueuse.org/core/useCloned/
官方说的是,将ref克隆到reactive中,但是ref和reactive的深拷贝好像也是可以的?
import {useCloned } from '@vueuse/core'
const source = ref(123)
const { cloned } = useCloned(source)
source.value = 456
console.log(source.value) //456
console.log(cloned.value) //123
const obj = reactive({name:'tom',age:12})
const {cloned:clonedObj} = useCloned(obj)
obj.name = 'jack'
obj.age = 13
console.log(obj) //{"name": "jack", "age": 13}
console.log(clonedObj.value) //{"name": "tom", "age": 12}
https://vueuse.org/core/useCycleList/
也是挺方便的
import { useCycleList } from '@vueuse/core'
//参数是一个队列,然后state就是当前值,可以用next或者prev手动调用前一个或者后一个
const { state, next, prev } = useCycleList([
'Dog',
'Cat',
'Lizard',
'Shark',
'Whale',
'Dolphin',
'Octopus',
'Seal',
])
console.log(state.value) // 'Dog'
prev()
console.log(state.value) // 'Seal'
其实就是一个布尔值的真假值切换而已
import { useToggle } from '@vueuse/core'
const isDark = true
const toggleDark = useToggle(isDark) //isDark就是false了
useToNumber 和useToString
const number = ref(3.14)
const str = useToString(number)
例子在这里
(以下的都要下载外部库,都要先npm i @vueuse/integrations )
文档
要先安装外部库
npm i @vueuse/integrations
npm i qrcode
import { useQRCode } from '@vueuse/integrations/useQRCode'
//这个其实就是二维码图片,和公司对接的还要看一下
const qrcode = useQRCode('https://www.bilibili.com/')
<img :src="qrcode" alt="">