create-adaptable-composable
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseCreate Adaptable Composable
创建适应性强的Composable
Adaptable composables are reusable functions that can accept both reactive and non-reactive inputs. This allows developers to use the composable in a variety of contexts without worrying about the reactivity of the inputs.
Steps to design an adaptable composable in Vue.js:
- Confirm the composable's purpose and API design and expected inputs/outputs.
- Identify inputs params that should be reactive (MaybeRef / MaybeRefOrGetter).
- Use or
toValue()to normalize inputs inside reactive effects.toRef() - Implement the core logic of the composable using Vue's reactivity APIs.
适应性强的Composable是可复用的函数,既可以接收响应式输入,也可以接收非响应式输入。这使得开发者可以在各种场景下使用该Composable,而无需担心输入的响应式问题。
在Vue.js中设计适应性强的Composable的步骤:
- 确认Composable的用途、API设计以及预期的输入和输出。
- 识别需要支持响应式的输入参数(MaybeRef / MaybeRefOrGetter)。
- 在响应式副作用内部使用或
toValue()来标准化输入。toRef() - 使用Vue的响应式API实现Composable的核心逻辑。
Core Type Concepts
核心类型概念
Type Utilities
类型工具
ts
/**
* value or writable ref (value/ref/shallowRef/writable computed)
*/
export type MaybeRef<T = any> = T | Ref<T> | ShallowRef<T> | WritableComputedRef<T>;
/**
* MaybeRef<T> + ComputedRef<T> + () => T
*/
export type MaybeRefOrGetter<T = any> = MaybeRef<T> | ComputedRef<T> | (() => T);ts
/**
* value or writable ref (value/ref/shallowRef/writable computed)
*/
export type MaybeRef<T = any> = T | Ref<T> | ShallowRef<T> | WritableComputedRef<T>;
/**
* MaybeRef<T> + ComputedRef<T> + () => T
*/
export type MaybeRefOrGetter<T = any> = MaybeRef<T> | ComputedRef<T> | (() => T);Policy and Rules
策略与规则
- Read-only, computed-friendly input: use
MaybeRefOrGetter - Needs to be writable / two-way input: use
MaybeRef - Parameter might be a function value (callback/predicate/comparator): do not use , or you may accidentally invoke it as a getter.
MaybeRefOrGetter - DOM/Element targets: if you want computed/derived targets, use .
MaybeRefOrGetter
When or is used:
MaybeRefOrGetterMaybeRef- resolve reactive value using (e.g. watcher source)
toRef() - resolve non-reactive value using
toValue()
- 只读、适合计算的输入:使用
MaybeRefOrGetter - 需要支持可写/双向绑定的输入:使用
MaybeRef - 参数可能是函数值(回调/断言/比较器):不要使用,否则可能会意外将其作为getter调用。
MaybeRefOrGetter - DOM/Element目标:如果需要计算/派生目标,使用。
MaybeRefOrGetter
当使用或时:
MaybeRefOrGetterMaybeRef- 使用解析响应式值(例如作为watcher的源)
toRef() - 使用解析非响应式值
toValue()
Examples
示例
Adaptable Composable: read-only title parameter
useDocumentTitlets
import { watch, toRef } from 'vue'
import type { MaybeRefOrGetter } from 'vue'
export function useDocumentTitle(title: MaybeRefOrGetter<string>) {
watch(toRef(title), (t) => {
document.title = t
}, { immediate: true })
}Adaptable Composable: two-way writable count parameter
useCounterts
import { watch, toRef } from 'vue'
import type { MaybeRef } from 'vue'
function useCounter(count: MaybeRef<number>) {
const countRef = toRef(count)
function add() {
countRef.value++
}
return { add }
}适应性强的 Composable:只读标题参数
useDocumentTitlets
import { watch, toRef } from 'vue'
import type { MaybeRefOrGetter } from 'vue'
export function useDocumentTitle(title: MaybeRefOrGetter<string>) {
watch(toRef(title), (t) => {
document.title = t
}, { immediate: true })
}适应性强的 Composable:双向可写的计数参数
useCounterts
import { watch, toRef } from 'vue'
import type { MaybeRef } from 'vue'
function useCounter(count: MaybeRef<number>) {
const countRef = toRef(count)
function add() {
countRef.value++
}
return { add }
}