Vue3 composition API實現(xiàn)邏輯復(fù)用的方法
Composition API實現(xiàn)邏輯復(fù)用的步驟:
- 抽離邏輯代碼到一個函數(shù),這個函數(shù)命令約定為useXXX格式(這點同React Hooks)
- 在setup中引用函數(shù)useXXX
舉下例子,定義一個獲取當(dāng)前鼠標(biāo)位置的方法
第一種,直接使用ref定義的useMousePosition:
這種方式,導(dǎo)出和導(dǎo)入都可以隨意解構(gòu)
// useMousePosition.js import { ref, onMounted, onUnmounted } from 'vue' // 1. 定義一個函數(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('開始監(jiān)聽鼠標(biāo)劃動事件'); window.addEventListener('mousemove', update) }) onUnmounted(() => { console.log('解除監(jiān)聽鼠標(biāo)劃動事件'); window.removeEventListener('mousemove', update) }) return { x, y } } // 導(dǎo)出這個函數(shù) export default useMousePosition
<!-- 在任意一個組件,都可以調(diào)用這個方法 --> <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)對象
這種導(dǎo)出的方式,在組件中導(dǎo)入時是不能解構(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('開始監(jiān)聽鼠標(biāo)劃動事件'); window.addEventListener('mousemove', update) }) onUnmounted(() => { console.log('解除監(jiān)聽鼠標(biāo)劃動事件'); window.removeEventListener('mousemove', update) }) return { mouse } } <template> <!-- 使用對象方式顯示信息 --> <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對象,解構(gòu)為ref對象
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('開始監(jiān)聽鼠標(biāo)劃動事件'); window.addEventListener('mousemove', update) }) onUnmounted(() => { console.log('解除監(jiān)聽鼠標(biāo)劃動事件'); window.removeEventListener('mousemove', update) }) // 這里,使用toRefs解構(gòu)成ref對象 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)對象,然后通過toRefs將其解構(gòu)成ref對象 const { x, y } = useMousePosition() console.log(x, y) return { x, y } } } </script>
三種方式都可以實現(xiàn),但是我們一般使用時,都會返回ref對象,所以比較建議使用第一種和第三種,盡量不使用第二種
到此這篇關(guān)于Vue3 composition API實現(xiàn)邏輯復(fù)用的方法的文章就介紹到這了,更多相關(guān)Vue3 composition API邏輯復(fù)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue鼠標(biāo)懸停事件監(jiān)聽實現(xiàn)方法
頁面在鼠標(biāo)懸停(不動)n秒之后,頁面進行相應(yīng)的事件,下面這篇文章主要給大家介紹了關(guān)于vue鼠標(biāo)懸停事件監(jiān)聽的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09Vue突然報錯doesn‘t?work?properly?without?JavaScript?enabled
最近在做項目的時候遇到了些問題,所以這篇文章主要給大家介紹了關(guān)于Vue突然報錯doesn‘t?work?properly?without?JavaScript?enabled的解決方法,需要的朋友可以參考下2023-01-01elementui源碼學(xué)習(xí)仿寫el-collapse示例
這篇文章主要為大家介紹了elementui源碼學(xué)習(xí)之仿寫el-collapse示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12