diff --git a/packages/shared/index.ts b/packages/shared/index.ts index dfa48450ed8..68c277a2b39 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -31,6 +31,7 @@ export * from './tryOnMounted' export * from './tryOnScopeDispose' export * from './tryOnUnmounted' export * from './until' +export * from './useArrayEvery' export * from './useArrayFilter' export * from './useArrayMap' export * from './useCounter' diff --git a/packages/shared/useArrayEvery/index.md b/packages/shared/useArrayEvery/index.md new file mode 100644 index 00000000000..88317cdebba --- /dev/null +++ b/packages/shared/useArrayEvery/index.md @@ -0,0 +1,36 @@ +--- +category: Utilities +--- + +# useArrayEvery + +Reactive `Array.every` + +## Usage + +### Use with array of multiple refs + +```js +import { useArrayEvery } from '@vueuse/core' +const item1 = ref(0) +const item2 = ref(2) +const item3 = ref(4) +const item4 = ref(6) +const item5 = ref(8) +const list = [item1, item2, item3, item4, item5] +const result = useArrayEvery(list, i => i % 2 === 0) +// result.value: true +item1.value = 1 +// result.value: false +``` + +### Use with reactive array + +```js +import { useArrayEvery } from '@vueuse/core' +const list = ref([0, 2, 4, 6, 8]) +const result = useArrayEvery(list, i => i % 2 === 0) +// result.value: true +list.value.push(9) +// result.value: false +``` diff --git a/packages/shared/useArrayEvery/index.test.ts b/packages/shared/useArrayEvery/index.test.ts new file mode 100644 index 00000000000..3891a2f9482 --- /dev/null +++ b/packages/shared/useArrayEvery/index.test.ts @@ -0,0 +1,29 @@ +import { ref } from 'vue-demi' +import { useArrayEvery } from '../useArrayEvery' + +describe('useArrayEvery', () => { + it('should be defined', () => { + expect(useArrayEvery).toBeDefined() + }) + + it('should work with array of refs', () => { + const item1 = ref(0) + const item2 = ref(2) + const item3 = ref(4) + const item4 = ref(6) + const item5 = ref(8) + const list = [item1, item2, item3, item4, item5] + const result = useArrayEvery(list, i => i % 2 === 0) + expect(result.value).toBe(true) + item1.value = 1 + expect(result.value).toBe(false) + }) + + it('should work with reactive array', () => { + const list = ref([0, 2, 4, 6, 8]) + const result = useArrayEvery(list, i => i % 2 === 0) + expect(result.value).toBe(true) + list.value.push(9) + expect(result.value).toBe(false) + }) +}) diff --git a/packages/shared/useArrayEvery/index.ts b/packages/shared/useArrayEvery/index.ts new file mode 100644 index 00000000000..e4d44b607db --- /dev/null +++ b/packages/shared/useArrayEvery/index.ts @@ -0,0 +1,12 @@ +import type { MaybeComputedRef } from '@vueuse/shared' +import { resolveUnref } from '@vueuse/shared' +import type { ComputedRef } from 'vue-demi' +import { computed } from 'vue-demi' + +export function useArrayEvery( + list: MaybeComputedRef[]>, + fn: (element: T, index: number, array: MaybeComputedRef[]) => boolean, +): ComputedRef { + const cb = (element: MaybeComputedRef, index: number, array: MaybeComputedRef[]) => fn(resolveUnref(element), index, array) + return computed(() => resolveUnref(list).every(cb)) +}