成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

五個可以加速開發(fā)的 VueUse 庫函數

開發(fā) 項目管理
VueUse 是 Anthony Fu 的一個開源項目,它為 Vue 開發(fā)人員提供了大量適用于 Vue 2 和 Vue 3 的基本 Composition API 實用程序函數。

[[413578]]

VueUse 是 Anthony Fu 的一個開源項目,它為 Vue 開發(fā)人員提供了大量適用于 Vue 2 和 Vue 3 的基本 Composition API 實用程序函數。

它有幾十個解決方案,適用于常見的開發(fā)者用例,如跟蹤Ref變化、檢測元素可見性、簡化常見的Vue模式、鍵盤/鼠標輸入等。這是一個真正節(jié)省開發(fā)時間的好方法,因為你不必自己添加所有這些標準功能。

我喜歡VueUse庫,因為它在決定提供哪些實用工具時真正把開發(fā)者放在第一位,而且它是一個維護良好的庫,因為它與Vue的當前版本保持同步。

VueUse 有哪些實用程序?

如果你想看到每一個實用程序的完整列表,我絕對建議你去看看官方文檔[1]。但總結一下,VueUse中有9種類型的函數。

  1. Animation——包含易于使用的過渡、超時和計時功能。
  2. Browser——可用于不同的屏幕控制、剪貼板、偏好等。
  3. Component——提供了不同組件方法的簡寫。
  4. Formatters——提供響應時間格式化功能。
  5. Sensors——用來監(jiān)聽不同的DOM事件、輸入事件和網絡事件。
  6. State——管理用戶狀態(tài)(全局、本地存儲、會話存儲)。
  7. Utility——不同的實用函數,如 getter、條件、引用同步等。
  8. Watch——更多高級類型的觀察器,如可暫停的觀察器、退避的觀察器和條件觀察器。
  9. Misc——不同類型的事件、WebSockets和web workers 的功能

這些類別中的大多數都包含幾個不同的功能,所以VueUse對于你的使用情況來說是很靈活的,可以作為一個很好的地方來快速開始構建Vue應用程序。

在本教程中,我們將看一下5個不同的VueUse函數,這樣你就可以了解在這個庫中工作是多么容易。

但首先,讓我們將其添加到Vue項目中!

將 VueUse 安裝到你的 Vue 項目中

VueUse的最大特點之一是,它只用一個軟件包就能同時兼容Vue 2和Vue 3!

安裝VueUse有兩種選擇npm或CDN

  1. npm i @vueuse/core # yarn add @vueuse/core 
  2. <script src="https://unpkg.com/@vueuse/shared"></script> 
  3. <script src="https://unpkg.com/@vueuse/core"></script> 

我建議使用NPM,因為它使用法更容易理解,但如果我們使用CDN,VueUse將在應用程序中通過 window.VueUse 訪問。

對于NPM的安裝,所有的功能都可以通過使用標準的對象重構從 @vueuse/core 中導入,像這樣訪問。

  1. import { useRefHistory } from '@vueuse/core' 

好了,現在我們已經安裝了VueUse,讓我們在應用程序中使用它!

useRefHistory 跟蹤響應式數據的更改

useRefHistory 跟蹤對Ref所做的每一個改變,并將其存儲在一個數組中。這使我們能夠輕松地為我們的應用程序提供撤銷和重做功能。

讓我們看一個示例,其中我們正在構建一個我們希望能夠撤消的文本區(qū)域。

第一步是在不使用 VueUse 的情況下創(chuàng)建我們的基本組件——使用 ref、textarea 和用于撤消和重做的按鈕。

  1. <template> 
  2.   <p>  
  3.     <button> Undo </button> 
  4.     <button> Redo </button> 
  5.   </p> 
  6.   <textarea v-model="text"/> 
  7. </template> 
  8.  
  9. <script setup> 
  10. import { ref } from 'vue' 
  11. const text = ref(''
  12. </script> 
  13.  
  14. <style scoped> 
  15.   button { 
  16.     border: none; 
  17.     outline: none; 
  18.     margin-right: 10px; 
  19.     background-color: #2ecc71; 
  20.     color: white; 
  21.     padding: 5px 10px;; 
  22.   } 
  23. </style> 

然后,讓我們通過導入 useRefHistory 函數,然后從我們的文本 ref 中提取history、undo 和 redo 屬性來添加 VueUse。這就像調用 useRefHistory 并傳遞我們的 ref 一樣簡單。

  1. import { ref } from 'vue' 
  2. import { useRefHistory } from '@vueuse/core' 
  3.  
  4. const text = ref(''
  5. const { history, undo, redo } = useRefHistory(text) 

每次我們的 ref 更改時,這都會觸發(fā)一個觀察者——更新我們剛剛創(chuàng)建的 history 屬性。 

然后,為了讓我們能真正看到發(fā)生了什么,讓我們打印出模板內的歷史記錄,同時在點擊相應的按鈕時調用我們的 undo 和 redo 函數。

  1. <template> 
  2.   <p>  
  3.     <button @click="undo"> Undo </button> 
  4.     <button @click="redo"> Redo </button> 
  5.   </p> 
  6.   <textarea v-model="text"/> 
  7.   <ul> 
  8.     <li v-for="entry in history" :key="entry.timestamp"
  9.       {{ entry }} 
  10.     </li> 
  11.   </ul> 
  12. </template> 
  13.  
  14. <script setup> 
  15. import { ref } from 'vue' 
  16. import { useRefHistory } from '@vueuse/core' 
  17. const text = ref(''
  18. const { history, undo, redo } = useRefHistory(text) 
  19. </script> 
  20.  
  21. <style scoped> 
  22.   button { 
  23.     border: none; 
  24.     outline: none; 
  25.     margin-right: 10px; 
  26.     background-color: #2ecc71; 
  27.     color: white; 
  28.     padding: 5px 10px;; 
  29.   } 
  30. </style> 

好的,讓我們運行它。當我們輸入時,每個字符都會觸發(fā)歷史數組中的一個新條目,如果我們點擊undo/redo,我們會轉到相應的條目。

還有不同的選項可以為此功能添加更多功能。例如,我們可以深入跟蹤反應對象并限制這樣的歷史條目的數量。

  1. const { history, undo, redo } = useRefHistory(text, { 
  2.   deep: true
  3.   capacity: 10, 
  4. }) 

有關完整的選項清單,請務必查看文檔。

onClickOutside 關閉模態(tài)

onClickOutside 檢測在一個元素之外的任何點擊。根據我的經驗,這個功能最常見的使用情況是關閉任何模式或彈出窗口。

通常情況下,我們希望我們的模態(tài)擋住網頁的其他部分,以吸引用戶的注意力并限制錯誤。然而,如果他們真的點擊了模態(tài)之外的內容,我們希望它能夠關閉。

只需兩個步驟即可完成此操作:

  1. 為我們要檢測的元素創(chuàng)建一個模板引用
  2. 使用此模板引用運行 onClickOutside

這是一個使用 onClickOutside 的帶有彈出窗口的簡單組件。

  1. <template> 
  2.   <button @click="open = true"Open Popup </button> 
  3.   <div class="popup" v-if='open'
  4.     <div class="popup-content" ref="popup"
  5.       Lorem ipsum dolor sit amet consectetur adipisicing elit. Corporis aliquid autem reiciendis eius accusamus sequi, ipsam corrupti vel laboriosam necessitatibus sit natus vero sint ullam! Omnis commodi eos accusantium illum? 
  6.     </div> 
  7.   </div> 
  8. </template> 
  9.  
  10. <script setup> 
  11. import { ref } from 'vue' 
  12. import { onClickOutside } from '@vueuse/core' 
  13. const open = ref(false) // state of our popup 
  14. const popup = ref() // template ref 
  15. // whenever our popup exists, and we click anything BUT it 
  16. onClickOutside(popup, () => { 
  17.   open.value  = false 
  18. }) 
  19. </script> 
  20.  
  21. <style scoped> 
  22.   button { 
  23.     border: none; 
  24.     outline: none; 
  25.     margin-right: 10px; 
  26.     background-color: #2ecc71; 
  27.     color: white; 
  28.     padding: 5px 10px;; 
  29.   } 
  30.   .popup { 
  31.     position: fixed; 
  32.     top: ; 
  33.     left: ; 
  34.     width: 100vw; 
  35.     height: 100vh; 
  36.     display: flex; 
  37.     align-items: center; 
  38.     justify-content: center; 
  39.     background: rgba(, , , 0.1); 
  40.   } 
  41.   .popup-content { 
  42.     min-width: 300px; 
  43.     padding: 20px; 
  44.     width: 30%; 
  45.     background: #fff; 
  46.   } 
  47. </style> 

結果是這樣的,我們可以用我們的按鈕打開彈出窗口,然后在彈出內容窗口外點擊關閉它。

useVModel 簡化了 v-model 綁定

Vue 開發(fā)人員的一個常見用例是為組件創(chuàng)建自定義 v-model 綁定。這意味著我們的組件接受一個值作為 prop,并且每當該值被修改時,我們的組件都會向父級發(fā)出更新事件。

useVModel函數將其簡化為只使用標準的 ref 語法。假設我們有一個自定義的文本輸入,試圖為其文本輸入的值創(chuàng)建一個 v-model。通常情況下,我們必須接受一個值的prop,然后emit一個變化事件來更新父組件中的數據值。

我們可以使用useVModel,把它當作一個普通的ref,而不是使用ref并調用 props.value 和 update:value。這有助于減少我們需要記住的不同語法的數量!

  1. <template> 
  2.     <div> 
  3.         <input  
  4.             type="text"  
  5.             :value="data" 
  6.             @input="update" 
  7.         /> 
  8.     </div> 
  9. </template> 
  10.  
  11. <script> 
  12. import { useVModel } from '@vueuse/core' 
  13. export default { 
  14.   props: ['data'], 
  15.   setup(props, { emit }) { 
  16.     const data = useVModel(props, 'data', emit) 
  17.     console.log(data.value) // equal to props.data 
  18.     data.value = 'name' // equal to emit('update:data''name'
  19.     const update = (event) => { 
  20.         data.value = event.target.value 
  21.     } 
  22.     return { 
  23.         data, 
  24.         update 
  25.     } 
  26.   }, 
  27. </script> 

每當我們需要訪問我們的值時,我們只需調用 .value,useVModel將從我們的組件props中給我們提供值。而每當我們改變對象的值時,useVModel會向父組件發(fā)出一個更新事件。

下面是一個快速的例子,說明該父級組件可能是什么樣子...

  1. <template> 
  2.   <div> 
  3.     <p> {{ data }} </p> 
  4.     <custom-input  
  5.       :data="data"  
  6.       @update:data="data = $event" 
  7.     /> 
  8.   </div> 
  9. </template> 
  10.  
  11. <script> 
  12. import CustomInput from './components/CustomInput.vue' 
  13. import { ref } from 'vue' 
  14. export default { 
  15.   components: { 
  16.     CustomInput, 
  17.   }, 
  18.   setup () { 
  19.     const data = ref('hello'
  20.     return { 
  21.       data 
  22.     } 
  23.   } 

結果看起來像這樣,我們在父級中的值始終與子級中的輸入保持同步。

使用IntersectionObserver 跟蹤元素可見性

在確定兩個元素是否重疊時,Intersection Observers [2] 非常強大。一個很好的用例是檢查元素當前是否在視口中可見。

本質上,它檢查目標元素與根元素/文檔相交的百分比。如果該百分比超過某個閾值,它會調用一個回調來確定目標元素是否可見。

useIntersectionObserver 提供了一個簡單的語法來使用IntersectionObserver API。我們所需要做的就是為我們想要檢查的元素提供一個模板ref。默認情況下,IntersectionObserver將以文檔的視口為根基,閾值為0.1——所以當這個閾值在任何一個方向被越過時,我們的交集觀察器將被觸發(fā)。 

這個例子的代碼可能是這樣的:我們有一個假的段落,只是在我們的視口中占據了空間,我們的目標元素,然后是一個打印語句,打印我們元素的可見性。

  1. <template> 
  2.   <p> Is target visible? {{ targetIsVisible }} </p> 
  3.   <div class="container"
  4.     <div class="target" ref="target"
  5.       <h1>Hello world</h1> 
  6.     </div> 
  7.   </div> 
  8. </template> 
  9.  
  10. <script> 
  11. import { ref } from 'vue' 
  12. import { useIntersectionObserver } from '@vueuse/core' 
  13. export default { 
  14.   setup() { 
  15.     const target = ref(null
  16.     const targetIsVisible = ref(false
  17.     const { stop } = useIntersectionObserver( 
  18.       target, 
  19.       ([{ isIntersecting }], observerElement) => { 
  20.         targetIsVisible.value = isIntersecting 
  21.       }, 
  22.     ) 
  23.     return { 
  24.       target, 
  25.       targetIsVisible, 
  26.     } 
  27.   }, 
  28. </script> 
  29.  
  30. <style scoped> 
  31. .container { 
  32.   width: 80%; 
  33.   margin:  auto; 
  34.   background-color: #fafafa; 
  35.   max-height: 300px; 
  36.   overflow: scroll
  37. .target { 
  38.   margin-top: 500px; 
  39.   background-color: #1abc9c; 
  40.   color: white; 
  41.   padding: 20px; 
  42. </style> 

當我們運行并滾動它時,我們會看到它正確地更新了。

我們還可以為 Intersection Observer 指定更多選項,例如更改其根元素、邊距(用于計算交點的根邊界框的偏移量)和閾值級別。

  1. const { stop } = useIntersectionObserver( 
  2.   target, 
  3.   ([{ isIntersecting }], observerElement) => { 
  4.     targetIsVisible.value = isIntersecting 
  5.   }, 
  6.   { 
  7.     // root, rootMargin, threshold, window 
  8.     // full options in the source: https://github.com/vueuse/vueuse/blob/main/packages/core/useIntersectionObserver/index.ts 
  9.     threshold: 0.5, 
  10.   } 

同樣重要的是,這個方法返回一個 stop 函數,我們可以調用這個函數來停止觀察交叉點。如果我們只想追蹤一個元素在屏幕上第一次可見的時候,這就特別有用。

在這段代碼中,一旦 targetIsVisible 被設置為 true,觀察者就會停止,即使我們滾動離開目標元素,我們的值也會保持為true。

  1. const { stop } = useIntersectionObserver( 
  2.   target, 
  3.   ([{ isIntersecting }], observerElement) => { 
  4.     targetIsVisible.value = isIntersecting 
  5.     if (isIntersecting) { 
  6.       stop() 
  7.     } 
  8.   }, 

useTransition 在值之間過渡

useTransition 是整個veuse庫中我最喜歡的函數之一。它允許我們在一行內平滑地轉換數值。

我們有一個存儲為ref的數字源和一個將在不同數值之間緩和的輸出。例如,假設我們想建立一個計數器。

我們可以通過三個步驟來做到這一點:

  • 創(chuàng)建我們的 count ref并將其初始化為零
  • 使用 useTransition 創(chuàng)建 output ref(設置持續(xù)時間和轉換類型)
  • 更改 count 的值
  1. <script setup> 
  2. import { ref } from 'vue' 
  3. import { useTransition, TransitionPresets } from '@vueuse/core' 
  4.  
  5. const source = ref(0) 
  6.  
  7. const output = useTransition(source, { 
  8.   duration: 3000, 
  9.   transition: TransitionPresets.easeOutExpo, 
  10. }) 
  11.  
  12. source.value = 5000 
  13.  
  14. </script> 

然后,在我們的模板中,我們希望顯示 output 的值,因為它可以在不同值之間平滑過渡。

  1. <template> 
  2.   <h2>  
  3.     <p> Join over </p> 
  4.     <p> {{ Math.round(output) }}+ </p> 
  5.     <p>Developers </p> 
  6.   </h2> 
  7. </template> 
  8.  
  9. <script setup> 
  10. import { ref } from 'vue' 
  11. import { useTransition, TransitionPresets } from '@vueuse/core' 
  12. const source = ref() 
  13. const output = useTransition(source, { 
  14.   duration: 3000, 
  15.   transition: TransitionPresets.easeOutExpo, 
  16. }) 
  17. source.value = 5000 
  18. </script> 

這就是結果!

我們還可以使用 useTransition 來過渡整個數字數組,這在處理位置或顏色時很有用。處理顏色的一個絕招是使用一個計算屬性將RGB值格式化為正確的顏色語法。

  1. <template> 
  2.   <h2 :style="{ color: color } "> COLOR CHANGING </h2> 
  3. </template> 
  4.  
  5. <script setup> 
  6. import { ref, computed } from 'vue' 
  7. import { useTransition, TransitionPresets } from '@vueuse/core' 
  8. const source = ref([, , ]) 
  9. const output = useTransition(source, { 
  10.   duration: 3000, 
  11.   transition: TransitionPresets.easeOutExpo, 
  12. }) 
  13. const color = computed(() => { 
  14.   const [r, g, b] = output.value 
  15.   return `rgb(${r}, ${g}, ${b})` 
  16. }) 
  17. source.value = [255, , 255] 
  18. </script> 

 

一些進一步定制的酷方法是使用任何內置的過渡預設或使用CSS緩動函數來定義我們自己的過渡。

最后的想法

這絕不是 VueUse 的完整指南,這些只是我發(fā)現 VueUse 庫中最有趣的許多函數。

我喜歡所有這些實用功能對加快開發(fā)速度的幫助,因為它們中的每一個都是為了解決具體而又常見的用例。

我很想聽聽你是如何在自己的項目中實施VueUse的。請在下面留下任何評論。

原文:https://learnvue.co/2021/07/5-vueuse-library-functions-that-can-speed-up-development/ 

作者:Matt Maribojoc

參考資料

[1]官方文檔: https://vueuse.org/functions.html

[2]Intersection Observers : https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver

本文轉載自微信公眾號「前端全棧開發(fā)者」,可以通過以下二維碼關注。轉載本文請聯系前端全棧開發(fā)者公眾號。

 

責任編輯:武曉燕 來源: 前端全棧開發(fā)者
相關推薦

2021-08-11 09:33:15

Vue 技巧 開發(fā)工具

2018-09-11 09:00:50

工具開發(fā)應用程序

2011-02-17 14:43:29

Windows 7加速

2015-07-29 10:11:18

Tableviews加速開發(fā)

2015-07-30 09:49:33

Table ViewsTips加速

2011-09-05 09:53:36

CSS

2023-12-27 14:19:33

Python內置函數開發(fā)

2009-12-01 15:14:32

PHP Substr庫

2010-06-17 13:16:07

SQLServer 數

2022-08-05 13:38:08

C語言庫函數printf()

2009-12-08 11:10:20

PHP GD庫函數

2010-06-13 10:18:08

MySQL 數據庫函數

2025-04-24 08:31:57

2022-11-15 16:37:38

PyTorch抽樣函數子集

2022-12-16 15:20:19

RustC 語言

2022-12-26 10:17:14

2014-06-05 14:36:09

移動游戲手游開發(fā)技巧

2022-01-03 16:08:36

深度學習PyTorchNumPy

2010-11-29 10:36:18

Sybase數據庫函數

2018-11-16 14:58:24

WAN數據加速廣域網
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩国产中文字幕 | 欧美日韩在线视频一区二区 | 99久久久无码国产精品 | 午夜一级大片 | 新91视频网 | 精品久久久久久久人人人人传媒 | 国产一区亚洲 | 亚洲精品成人在线 | 久草网址| 国产小u女发育末成年 | 中文字幕一区二区三区精彩视频 | 91精品国产综合久久久亚洲 | 一区二区成人在线 | 国产视频亚洲视频 | 嫩草视频在线免费观看 | 一级欧美视频 | а_天堂中文最新版地址 | 欧美群妇大交群中文字幕 | 国产精品精品视频一区二区三区 | 天天综合久久 | 亚洲综合色 | 亚洲视频国产视频 | 欧美极品一区二区 | 男女啪啪高潮无遮挡免费动态 | 伊人久久综合 | 欧美一区视频在线 | 日韩精品1区2区3区 国产精品国产成人国产三级 | 国产精品一区三区 | 欧美视频1 | 欧洲视频一区 | 日韩精品人成在线播放 | 精品av| 伊人精品久久久久77777 | 国产精品一区二区在线播放 | 亚洲一区二区中文字幕 | 免费观看黄 | 国产91久久久久 | 国产成人99久久亚洲综合精品 | 久久久久亚洲精品中文字幕 | 国产亚洲精品久久久久动 | www97影院 |