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('開始監(jiān)聽鼠標(biāo)劃動(dòng)事件'); window.addEventListener('mousemove', update) }) onUnmounted(() => { console.log('解除監(jiān)聽鼠標(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('開始監(jiān)聽鼠標(biāo)劃動(dòng)事件'); window.addEventListener('mousemove', update) }) onUnmounted(() => { console.log('解除監(jiān)聽鼠標(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('開始監(jiān)聽鼠標(biāo)劃動(dòng)事件'); window.addEventListener('mousemove', update) }) onUnmounted(() => { console.log('解除監(jiān)聽鼠標(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)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3組合式函數(shù)Composable實(shí)戰(zhàn)ref和unref使用
這篇文章主要為大家介紹了Vue3組合式函數(shù)Composable實(shí)戰(zhàn)ref和unref使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06element-plus 下拉框?qū)崿F(xiàn)全選的示例代碼
本文主要介紹了element-plus 下拉框?qū)崿F(xiàn)全選的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05vue vuex vue-rouert后臺(tái)項(xiàng)目——權(quán)限路由(適合初學(xué))
這篇文章主要介紹了vue vuex vue-rouert后臺(tái)項(xiàng)目——權(quán)限路由,通過(guò)本文可以很清除的捋清楚vue+vuex+vue-router的關(guān)系,本版本非常簡(jiǎn)單,適合初學(xué)者,需要的朋友可以參考下2017-12-12vue使用vue-video-player插件播放視頻的步驟講解
在最近的項(xiàng)目中有一個(gè)視頻播放的功能,在之前的項(xiàng)目中沒有接觸過(guò)類似的功能,第一次接觸,把具體操作步驟一下,這篇文章主要給大家介紹了關(guān)于vue使用vue-video-player插件播放視頻的相關(guān)資料,需要的朋友可以參考下2022-12-12VUE渲染后端返回含有script標(biāo)簽的html字符串示例
今天小編就為大家分享 一篇VUE渲染后端返回含有script標(biāo)簽的html字符串示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10ElementUI實(shí)現(xiàn)在下拉列表里面進(jìn)行搜索功能詳解
有時(shí)候需要用到下拉列表全選和搜索,下面這篇文章主要給大家介紹了關(guān)于ElementUI實(shí)現(xiàn)在下拉列表里面進(jìn)行搜索功能的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04實(shí)例分析vue循環(huán)列表動(dòng)態(tài)數(shù)據(jù)的處理方法
本篇文章給大家詳細(xì)分享了關(guān)于vue循環(huán)列表動(dòng)態(tài)數(shù)據(jù)的處理方法以及相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們參考下。2018-09-09Spring Boot/VUE中路由傳遞參數(shù)的實(shí)現(xiàn)代碼
在路由時(shí)傳遞參數(shù),一般有兩種形式,一種是拼接在url地址中,另一種是查詢參數(shù)。這篇文章主要介紹了Spring Boot/VUE中路由傳遞參數(shù),需要的朋友可以參考下2018-03-03