Vue3 composition API實(shí)現(xiàn)邏輯復(fù)用的方法
Composition API實(shí)現(xiàn)邏輯復(fù)用的步驟:
- 抽離邏輯代碼到一個(gè)函數(shù),這個(gè)函數(shù)命令約定為useXXX格式(這點(diǎn)同React Hooks)
- 在setup中引用函數(shù)useXXX
舉下例子,定義一個(gè)獲取當(dāng)前鼠標(biāo)位置的方法
第一種,直接使用ref定義的useMousePosition:
這種方式,導(dǎo)出和導(dǎo)入都可以隨意解構(gòu)
// useMousePosition.js
import { ref, onMounted, onUnmounted } from 'vue'
// 1. 定義一個(gè)函數(shù),抽離邏輯,命名使用 useXXX
function useMousePosition() {
// 使用ref定義
const x = ref(0)
const y = ref(0)
function update(e) {
console.log(x.value, y.value);
x.value = e.pageX
y.value = e.pageY
}
onMounted(() => {
console.log('開(kāi)始監(jiān)聽(tīng)鼠標(biāo)劃動(dòng)事件');
window.addEventListener('mousemove', update)
})
onUnmounted(() => {
console.log('解除監(jiān)聽(tīng)鼠標(biāo)劃動(dòng)事件');
window.removeEventListener('mousemove', update)
})
return {
x,
y
}
}
// 導(dǎo)出這個(gè)函數(shù)
export default useMousePosition
<!-- 在任意一個(gè)組件,都可以調(diào)用這個(gè)方法 -->
<template>
<p>mouse position: {{x}}, {{y}}</p>
</template>
<script>
import useMousePosition from './useMousePosition'
export default {
name: 'MousePosition',
setup() {
// useMousePosition是使用ref定義變量的,這種可以解構(gòu)
const { x, y } = useMousePosition()
console.log(x, y)
return {
x, y
}
}
}
</script>
第二種,使用reactive定義鼠標(biāo)坐標(biāo)對(duì)象
這種導(dǎo)出的方式,在組件中導(dǎo)入時(shí)是不能解構(gòu)的
import { onMounted, onUnmounted, reactive } from 'vue'
export function useMousePosition2() {
// 使用reactive定義
const mouse = reactive({
x: 0,
y: 0
})
function update(e) {
mouse.x = e.pageX
mouse.y = e.pageY
}
onMounted(() => {
console.log('開(kāi)始監(jiān)聽(tīng)鼠標(biāo)劃動(dòng)事件');
window.addEventListener('mousemove', update)
})
onUnmounted(() => {
console.log('解除監(jiān)聽(tīng)鼠標(biāo)劃動(dòng)事件');
window.removeEventListener('mousemove', update)
})
return {
mouse
}
}
<template>
<!-- 使用對(duì)象方式顯示信息 -->
<p>mouse position2: {{mouse.x}}, {{mouse.y}}</p>
</template>
<script>
import { useMousePosition2 } from './useMousePosition'
export default {
name: 'MousePosition',
setup() {
// useMousePosition2是使用reactive定義的,這種不可以解構(gòu)
const { mouse } = useMousePosition2()
return {
mouse
}
}
}
</script>
第三種,使用toRefs
使用這種方式,可以將reactive對(duì)象,解構(gòu)為ref對(duì)象
export function useMousePosition3() {
// 使用reactive定義
const mouse = reactive({
x: 0,
y: 0
})
function update(e) {
mouse.x = e.pageX
mouse.y = e.pageY
}
onMounted(() => {
console.log('開(kāi)始監(jiān)聽(tīng)鼠標(biāo)劃動(dòng)事件');
window.addEventListener('mousemove', update)
})
onUnmounted(() => {
console.log('解除監(jiān)聽(tīng)鼠標(biāo)劃動(dòng)事件');
window.removeEventListener('mousemove', update)
})
// 這里,使用toRefs解構(gòu)成ref對(duì)象
return toRefs(mouse)
}
<template>
<p>mouse position: {{x}}, {{y}}</p>
</template>
<script>
import { useMousePosition3 } from './useMousePosition'
export default {
name: 'MousePosition',
setup() {
// 使用reactive定義鼠標(biāo)坐標(biāo)對(duì)象,然后通過(guò)toRefs將其解構(gòu)成ref對(duì)象
const { x, y } = useMousePosition()
console.log(x, y)
return {
x, y
}
}
}
</script>
三種方式都可以實(shí)現(xiàn),但是我們一般使用時(shí),都會(huì)返回ref對(duì)象,所以比較建議使用第一種和第三種,盡量不使用第二種
到此這篇關(guān)于Vue3 composition API實(shí)現(xiàn)邏輯復(fù)用的方法的文章就介紹到這了,更多相關(guān)Vue3 composition API邏輯復(fù)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 淺談Vue3.0新版API之composition-api入坑指南
- Vue3 Composition API的使用簡(jiǎn)介
- 詳解Vue3 Composition API中的提取和重用邏輯
- vue3.0 的 Composition API 的使用示例
- Vue3中Composition?API和Options?API的區(qū)別
- 詳解vue3.0 的 Composition API 的一種使用方法
- Vue2如何支持composition API示例詳解
- Vue OptionsAPI與CompositionAPI的區(qū)別與使用介紹
- vue composition-api 封裝組合式函數(shù)的操作方法
- Vue3中使用Composition API管理組件狀態(tài)
相關(guān)文章
Vite?Vue3?EsLint?Prettier配置步驟極簡(jiǎn)方法詳解
這篇文章主要為大家介紹了Vite?Vue3?EsLint?Prettier配置步驟的極簡(jiǎn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Vue的hover/click事件如何動(dòng)態(tài)改變顏色和背景色
這篇文章主要介紹了Vue的hover/click事件如何動(dòng)態(tài)改變顏色和背景色問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
vue.js 輸入框輸入值自動(dòng)過(guò)濾特殊字符替換中問(wèn)標(biāo)點(diǎn)操作
這篇文章主要介紹了vue.js 輸入框輸入值自動(dòng)過(guò)濾特殊字符替換中問(wèn)標(biāo)點(diǎn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
Vue 組件事件觸發(fā)和監(jiān)聽(tīng)實(shí)現(xiàn)源碼解析
這篇文章主要為大家介紹了Vue 組件事件觸發(fā)和監(jiān)聽(tīng)實(shí)現(xiàn)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Vue彈窗的兩種實(shí)現(xiàn)方式實(shí)例詳解
這篇文章主要介紹了Vue彈窗的兩種實(shí)現(xiàn)方式,一種使用.sync修飾符另一種使用v-model,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
vue keep-alive實(shí)現(xiàn)多組件嵌套中個(gè)別組件存活不銷(xiāo)毀的操作
這篇文章主要介紹了vue keep-alive實(shí)現(xiàn)多組件嵌套中個(gè)別組件存活不銷(xiāo)毀的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10

