模块化妙用!用vue3实现一个鼠标追踪器和异步加载组件
用vue3實現(xiàn)一個鼠標追蹤器和異步加載組件
- 一、🖱?鼠標追蹤器
- 1、功能實現(xiàn)
- 2、給靜態(tài)頁面綁定功能
- 二、??異步加載組件
- 1、功能實現(xiàn)
- 2、給靜態(tài)頁面綁定功能
- 3、用泛型改造異步組件功能
- 三、📚結(jié)束語
周一最近學(xué)完 vue3 新特性,就想著用 vue3 來搗鼓點新的小工具。突然想到以前自己遇到的一個問題,想要獲取當前鼠標點擊的位置,但是以前是直接用原生 js 寫的,體驗感就沒有那么好了,于是乎,今天就用 vue3 來開始我的小工具之旅啦!
在今天的文章中,將帶領(lǐng)大家初始化一個 vue3 項目,并且用 vue3 實現(xiàn)一個鼠標追蹤器和異步加載組件。
🎬🎬🎬
一、🖱?鼠標追蹤器
1、功能實現(xiàn)
我們先在 vue3 項目下建立一個 ts 文件,這個 ts 文件用來實現(xiàn)鼠標追蹤器的功能。具體代碼如下:
//引入需要使用的Composition API import { ref, onMounted, onUnmounted } from 'vue' //實現(xiàn)鼠標追蹤器功能 function useMousePosition(){//初始化x軸和y軸的值const x = ref(0)const y = ref(0)//獲取鼠標點擊后x軸和y軸的值const updateMouse = (e: MouseEvent) => {x.value = e.pageXy.value = e.pageY}//鼠標點擊時執(zhí)行updateMouse函數(shù)onMounted(() => {document.addEventListener('click', updateMouse)})//鼠標點擊結(jié)束后對當前點擊事件執(zhí)行銷毀操作onUnmounted(() => {document.removeEventListener('click', updateMouse)})//返回x和y的值return {x, y} }//導(dǎo)出函數(shù) export default useMousePosition2、給靜態(tài)頁面綁定功能
我們在 vue3 項目下建立一個 .vue 文件,來加載靜態(tài)組件內(nèi)容。具體代碼如下:
<template><div id="app"><h1>鼠標追蹤器</h1><h1>X:{{x}},Y:{{y}}</h1></div> </template><script lang="ts"> //引入函數(shù) import useMousePosition from './useMousePosition'export default{name: 'App',setup(){//引用函數(shù)中返回的值const { x, y } = useMousePosition()//返回值return{x,y}} }; </script><style> #app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px; } </style>最終我們來看下顯示效果:
看完效果,我們來分析下代碼。大家可以看到, vue3 中的代碼抽離,使得功能實現(xiàn)變得非常方便。我們通過在組件外部再定義一個 ts 文件,來實現(xiàn)具體的功能,而不再將具體的功能放在組件內(nèi)部來實現(xiàn)。
這樣從某種層面上來講,代碼的可擴展性和可維護性都靈活了許多。
二、??異步加載組件
看完鼠標追蹤器,我們再來實現(xiàn)一個異步加載組件。
在我們?nèi)粘5拈_發(fā)中,經(jīng)常需要用到異步加載組件,而異步加載最常見的需求就是加載loading的狀態(tài)。
加載 loading 的狀態(tài)其實就是當我們剛開始加載頁面時,如果異步請求的內(nèi)容還沒有顯示,那就先顯示一個 loading 效果讓用戶先等等,等到異步請求的內(nèi)容加載出來了,就可以顯示具體的效果。
接下來我們就來實現(xiàn)這個功能。
1、功能實現(xiàn)
我們先在 vue3 項目下建立一個 ts 文件,這個 ts 文件用來實現(xiàn)加載異步組件的功能。具體代碼如下:
import { ref } from 'vue' import axios from 'axios'function useURLLoader(url: string){const result = ref(null)const loading = ref(true)const loaded = ref(false)const error = ref(null)axios.get(url).then((rawData) => {loading.value = falseloaded.value = trueresult.value = rawData.data}).catch(e => {error.value = eloading.value = false})return{result,loading,loaded,error} }export default useURLLoader實現(xiàn)完功能以后,接下來我們將給靜態(tài)頁面綁定該異步功能。
2、給靜態(tài)頁面綁定功能
這里先給大家介紹一個在線免費API,網(wǎng)址為https://dog.ceo/dog-api/。這個API是一個狗狗API,可以實時獲取圖片數(shù)據(jù)。具體使用方式如下:
接下來我們在 vue3 項目下建立一個 .vue 文件,來加載靜態(tài)組件內(nèi)容。具體代碼如下:
<template><div id="app"><h1>異步加載組件</h1><button v-if="loading">Loading……</button><img v-if="loaded" :src="result.message"></div> </template><script lang="ts"> import useURLLoader from './useUrlLoader'export default{name: 'App',setup(){const { result, loading, loaded, error } = useURLLoader('https://dog.ceo/api/breeds/image/random')return{result,loading,loaded,error}} }; </script><style> #app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px; } </style>最終我們來看下顯示效果:
大家可以看到,當我們刷新時,異步請求的數(shù)據(jù)還沒有加載出來,所以會先顯示 Loading ,等到數(shù)據(jù)加載出來以后,再顯示具體的數(shù)據(jù),這就是我們經(jīng)常使用的異步加載組件。
3、用泛型改造異步組件功能
大家都知道, vue2 對于 typescript 的支持是非常有限的,因此, vue3 的改造升級后對 ts 有了極大的加持。
在上面的這個例子中,我們已經(jīng)感受到了 Composition API 的擴展性和維護性,但是呢,不滿足于現(xiàn)狀,我們還想要再給它來個類型的加持,該怎么做呢?
依據(jù)上面的案例,我們繼續(xù)升級改造。
首先,我們希望 result 可以通過泛型來推斷出類型,所以,我們將 ts文件的代碼進行以下改造。代碼如下:
import { ref } from 'vue' import axios from 'axios'//泛型改造 function useURLLoader<T>(url: string){// result的一開始是沒有賦予數(shù)據(jù)類型的,待result賦予數(shù)據(jù)后,再對其賦予數(shù)據(jù)類型const result = ref<T | null>(null)const loading = ref(true)const loaded = ref(false)const error = ref(null)axios.get(url).then((rawData) => {loading.value = falseloaded.value = trueresult.value = rawData.data}).catch(e => {error.value = eloading.value = false})return{result,loading,loaded,error} }export default useURLLoader這次我們換一個貓貓的API,來對 .vue 文件進行改造。具體代碼如下:
<template><div id="app"><h1>異步加載組件</h1><button v-if="loading">Loading……</button><img v-if="loaded" :src="result[0].url"></div> </template><script lang="ts"> import { watch } from 'vue' import useURLLoader from './useUrlLoader'interface CatResult{id: string;url: string;width: string;height: string; }export default{name: 'App',setup(){const { result, loading, loaded, error } = useURLLoader<CatResult[]>('https://api.thecatapi.com/v1/images/search?limit=1')watch(result, () => {if(result.value){console.log('value', result.value[0].url)}}) return{result,loading,loaded,error}} }; </script><style> #app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px; } </style>最終瀏覽器的顯示效果如下:
通過代碼我們可以發(fā)現(xiàn),用泛型來改造組件,會使得該組件的可擴展性更強。 ts 這么好的語言誰能不愛呢對吧!
三、📚結(jié)束語
到這里,對于 vue3 開發(fā)鼠標追蹤器和異步加載組件的講解就結(jié)束啦!在這篇文章中,我們學(xué)會了用 vue3 的新特性來實現(xiàn)鼠標追蹤器和異步加載組件,同時,我們還使用了ts中的泛型和接口,來改造異步加載組件,使其擴展性更強。
vue3 持續(xù)學(xué)習(xí),更新永不停歇……我們下期見!🥂 🥂 🥂
-
關(guān)注公眾號 星期一研究室 ,第一時間關(guān)注學(xué)習(xí)干貨,更多精彩專欄待你解鎖~
-
如果這篇文章對你有用,記得一鍵三連再走哦~
總結(jié)
以上是生活随笔為你收集整理的模块化妙用!用vue3实现一个鼠标追踪器和异步加载组件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雪梨百合汤的功效与作用、禁忌和食用方法
- 下一篇: vue3的传送门teleport究竟有多