iT邦幫忙

2024 iThome 鐵人賽

DAY 7
1
JavaScript

不會 VueUse 而被提分手的我系列 第 7

D-07 syncRef 文件說明與範例 — 來點鏡像魔法

  • 分享至 

  • xImage
  •  

更加困難的挑戰到來,但這正是我變得更強的契機!
我深入研究了 VueUse 的 syncRef,這個功能就像是兩邊的鏡像,能夠同步兩個 refs 的數值變化。它的力量在於當一方變化時,另一方也能立即響應,正如我和程世社季子的心靈曾經同步一樣。等著我吧程世社季子!
#挽回愛情的第七天
https://ithelp.ithome.com.tw/upload/images/20240920/20162115Dso6rs6eHg.png

前情提要

syncRef 是 VueUse 庫中一個強大且靈活的工具函式,用於同步兩個 Vue 的 Ref 參數。本文將詳細介紹 syncRef 的功能、參數、使用場景,並提供一些實用的範例。

syncRef API

功能

syncRef 用於在兩個 Vue Ref 參數之間建立雙向同步。它支持不同類型間的轉換,並提供了多種同步選項,如同步方向、深度監聽等。這個函式特別適用於需要保持兩個相關但可能類型不同的響應式資料同步的場景。

Props

名稱 類型 說明
left Ref<L> Vue 的 Ref 參數,代表左側需要同步的值。
right Ref<R> Vue 的 Ref 參數,代表右側需要同步的值。
options SyncRefOptions<L, R, D> 可選參數,用於設定同步行為。

options 參數

名稱 類型 說明
deep boolean 是否深度監聽。默認為 false
immediate boolean 是否立即同步值。默認為 true
direction D extends Direction 同步方向。可以是 "ltr""rtl""both"。默認為 "both"。如果定義了 transform,則此值會被重新定義。
transform TransformType<D, L, R> 轉換函式參數,根據 LR 的類型關係有不同的要求。

transform 參數(根據 L 和 R 的關係有不同的要求)

名稱 類型 說明
ltr (left: L) => R 從左值到右值的轉換函式
rtl (right: R) => L 從右值到左值的轉換函式

L 和 R 的關係有不同的要求

情況 要求 符號解釋
L = R 可選的 ltr 和/或 rtl 轉換函式 L 完全等於 R,兩個類型完全相同。
L ⊆ R 必須提供 ltr 轉換函式,rtl 可選 L 是 R 的子集。L 中的所有元素都在 R 中,但 R 可能有 L 沒有的元素。
R ⊆ L 必須提供 rtl 轉換函式,ltr 可選 R 是 L 的子集。R 中的所有元素都在 L 中,但 L 可能有 R 沒有的元素。
L ∩ R ≠ ∅L ≠ R 必須提供 ltrrtl 轉換函式 L 和 R 有交集(共同元素),但不完全相同。'∩' 表示交集,'∅' 表示空集,'≠' 表示不等於。
L ∩ R = ∅ 必須提供 ltrrtl 轉換函式 L 和 R 沒有交集,即沒有共同元素。'∩' 表示交集,'=' 表示等於,'∅' 表示空集。

返回值

syncRef 返回一個函式:

  • () => void:調用此函式可以停止同步。

注意:當 LR 完全相等時,options 參數是可選的。在其他所有情況下,options 參數是必需的。

用法範例

範例 1:基本用法

線上玩玩看範例一

import { ref } from 'vue'
import { syncRef } from '@vueuse/core'

const left = ref('Hello')
const right = ref('World')

syncRef(left, right)

console.log(left.value, right.value) // 'Hello', 'Hello'
left.value = 'Changed'
console.log(left.value, right.value) // 'Changed', 'Changed'

範例 2:使用轉換函式

線上玩玩看範例二

import { ref } from 'vue'
import { syncRef } from '@vueuse/core'

const number = ref(10)
const string = ref('10')

syncRef(number, string, {
  transform: {
    ltr: (n) => n.toString(),
    rtl: (s) => parseInt(s),
  },
})

number.value = 20
console.log(string.value) // '20'
string.value = '30'
console.log(number.value) // 30

範例 3:單向同步

線上玩玩看範例三

import { ref } from 'vue'
import { syncRef } from '@vueuse/core'

const source = ref(0)
const target = ref(10)

syncRef(source, target, { direction: 'ltr' })

source.value = 5
console.log(target.value) // 5
target.value = 20
console.log(source.value) // 仍然是 5

syncRef 的使用場景

  1. 跨組件資料同步:當需要在不同組件間保持資料一致性時,syncRef 可以輕鬆實現資料的雙向綁定。
  2. 資料轉換:當兩個相關的資料需要在不同格式間轉換時(如數字和字符串),syncRef 的轉換函式可以自動處理這種轉換。
  3. 受控組件實現:在實現自定義的受控組件時,可以使用 syncRef 來同步內部狀態和外部傳入的 props。
  4. 複雜表單處理:在處理複雜表單時,可以使用 syncRef 來保持不同部分的表單資料同步。

為什麼開發者需要 syncRef

  1. 簡化資料同步邏輯syncRef 封裝了複雜的監聽和更新邏輯,大大簡化了開發者手動實現資料同步的工作。
  2. 提高程式碼可讀性和可維護性:使用 syncRef 可以將資料同步的邏輯集中管理,使程式碼結構更清晰。
  3. 靈活的配置選項syncRef 提供了多種配置選項,如同步方向、深度監聽等,滿足不同場景的需求。
  4. 類型安全syncRef 的類型定義考慮了多種類型關係,確保在 TypeScript 環境下的類型安全。

結論

syncRef 是一個強大而靈活的工具函式,它簡化了 Vue 應用中的資料同步邏輯。通過提供直觀的 API 和豐富的配置選項,syncRef 能夠處理從簡單的值同步到複雜的類型轉換等各種場景。對於需要在不同組件或資料源之間保持資料一致性的開發者來說,syncRef 是一個不可或缺的工具。

通過合理使用 syncRef,開發者可以大大減少手動編寫資料同步邏輯的工作量,提高程式碼的可讀性和可維護性,同時確保應用中資料流的一致性和可靠性。


上一篇
D-06 useVModel 解析與動機 — 實用性很高の函式之一
下一篇
D-08 syncRef 解析與動機 — 深度解析鏡像魔法
系列文
不會 VueUse 而被提分手的我30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言