reactify
将纯函数转换为反应函数。转换后的函数接受ref作为其参数,并返回类型正确的ComputedRef。
用法
基本用例
ts
import { reactify } from '@mpxjs/mpxuse-core'
// 简单的函数
function add(a: number, b: number): number {
return a + b
}
// 现在它接受引用并返回计算的引用
// (a: number | Ref<number>, b: number | Ref<number>) => ComputedRef<number>
const reactiveAdd = reactify(add)
const a = ref(1)
const b = ref(2)
const sum = reactiveAdd(a, b)
console.log(sum.value) // 3
a.value = 5
console.log(sum.value) // 7
import { reactify } from '@mpxjs/mpxuse-core'
// 简单的函数
function add(a: number, b: number): number {
return a + b
}
// 现在它接受引用并返回计算的引用
// (a: number | Ref<number>, b: number | Ref<number>) => ComputedRef<number>
const reactiveAdd = reactify(add)
const a = ref(1)
const b = ref(2)
const sum = reactiveAdd(a, b)
console.log(sum.value) // 3
a.value = 5
console.log(sum.value) // 7
实现的例子 毕达哥拉斯定理.
ts
import { reactify } from '@mpxjs/mpxuse-core'
const pow = reactify(Math.pow)
const sqrt = reactify(Math.sqrt)
const add = reactify((a: number, b: number) => a + b)
const a = ref(3)
const b = ref(4)
const c = sqrt(add(pow(a, 2), pow(b, 2)))
console.log(c.value) // 5
// 5:12:13
a.value = 5
b.value = 12
console.log(c.value) // 13
import { reactify } from '@mpxjs/mpxuse-core'
const pow = reactify(Math.pow)
const sqrt = reactify(Math.sqrt)
const add = reactify((a: number, b: number) => a + b)
const a = ref(3)
const b = ref(4)
const c = sqrt(add(pow(a, 2), pow(b, 2)))
console.log(c.value) // 5
// 5:12:13
a.value = 5
b.value = 12
console.log(c.value) // 13
你也可以这样做:
ts
import { reactify } from '@mpxjs/mpxuse-core'
function pythagorean(a: number, b: number) {
return Math.sqrt(a ** 2 + b ** 2)
}
const a = ref(3)
const b = ref(4)
const c = reactify(pythagorean)(a, b)
console.log(c.value) // 5
import { reactify } from '@mpxjs/mpxuse-core'
function pythagorean(a: number, b: number) {
return Math.sqrt(a ** 2 + b ** 2)
}
const a = ref(3)
const b = ref(4)
const c = reactify(pythagorean)(a, b)
console.log(c.value) // 5
其他的例子比如让stringify
变成响应式
ts
import { reactify } from '@mpxjs/mpxuse-core'
const stringify = reactify(JSON.stringify)
const obj = ref(42)
const dumped = stringify(obj)
console.log(dumped.value) // '42'
obj.value = { foo: 'bar' }
console.log(dumped.value) // '{"foo":"bar"}'
import { reactify } from '@mpxjs/mpxuse-core'
const stringify = reactify(JSON.stringify)
const obj = ref(42)
const dumped = stringify(obj)
console.log(dumped.value) // '42'
obj.value = { foo: 'bar' }
console.log(dumped.value) // '{"foo":"bar"}'
类型声明
typescript
export declare type Reactified<T, Computed extends boolean> = T extends (
...args: infer A
) => infer R
? (
...args: {
[K in keyof A]: Computed extends true
? MaybeComputedRef<A[K]>
: MaybeRef<A[K]>
}
) => ComputedRef<R>
: never
export interface ReactifyOptions<T extends boolean> {
/**
* Accept passing a function as a reactive getter
*
* @default true
*/
computedGetter?: T
}
/**
* Converts plain function into a reactive function.
* The converted function accepts refs as it's arguments
* and returns a ComputedRef, with proper typing.
*
* @param fn - Source function
*/
export declare function reactify<T extends Function, K extends boolean = true>(
fn: T,
options?: ReactifyOptions<K>
): Reactified<T, K>
export { reactify as createReactiveFn }
export declare type Reactified<T, Computed extends boolean> = T extends (
...args: infer A
) => infer R
? (
...args: {
[K in keyof A]: Computed extends true
? MaybeComputedRef<A[K]>
: MaybeRef<A[K]>
}
) => ComputedRef<R>
: never
export interface ReactifyOptions<T extends boolean> {
/**
* Accept passing a function as a reactive getter
*
* @default true
*/
computedGetter?: T
}
/**
* Converts plain function into a reactive function.
* The converted function accepts refs as it's arguments
* and returns a ComputedRef, with proper typing.
*
* @param fn - Source function
*/
export declare function reactify<T extends Function, K extends boolean = true>(
fn: T,
options?: ReactifyOptions<K>
): Reactified<T, K>
export { reactify as createReactiveFn }