From 3b5b2f3831a04f880f6d1aa40c191496c6be8d6d Mon Sep 17 00:00:00 2001 From: huynl-96 Date: Thu, 14 Jul 2022 01:20:08 +0700 Subject: [PATCH] feat(useArrayJoin): new function --- packages/shared/index.ts | 1 + packages/shared/useArrayJoin/index.md | 50 ++++++++++++++++++++++ packages/shared/useArrayJoin/index.test.ts | 40 +++++++++++++++++ packages/shared/useArrayJoin/index.ts | 11 +++++ 4 files changed, 102 insertions(+) create mode 100644 packages/shared/useArrayJoin/index.md create mode 100644 packages/shared/useArrayJoin/index.test.ts create mode 100644 packages/shared/useArrayJoin/index.ts diff --git a/packages/shared/index.ts b/packages/shared/index.ts index dfa48450ed8..e97098ec311 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -32,6 +32,7 @@ export * from './tryOnScopeDispose' export * from './tryOnUnmounted' export * from './until' export * from './useArrayFilter' +export * from './useArrayJoin' export * from './useArrayMap' export * from './useCounter' export * from './useDateFormat' diff --git a/packages/shared/useArrayJoin/index.md b/packages/shared/useArrayJoin/index.md new file mode 100644 index 00000000000..4a1cceb23fe --- /dev/null +++ b/packages/shared/useArrayJoin/index.md @@ -0,0 +1,50 @@ +--- +category: Utilities +--- + +# useArrayJoin + +Reactive `Array.join` + +## Usage + +### Use with array of multiple refs + +```js +import { useArrayJoin } from '@vueuse/core' +const item1 = ref('foo') +const item2 = ref(0) +const item3 = ref({ prop: 'val' }) +const list = [item1, item2, item3] +const result = useArrayJoin(list) +// result.value: foo,0,[object Object] +item1.value = 'bar' +// result.value: bar,0,[object Object] +``` + +### Use with reactive array + +```js +import { useArrayJoin } from '@vueuse/core' +const list = ref(['string', 0, { prop: 'val' }, false, [1], [[2]], null, undefined, []]) +const result = useArrayJoin(list) +// result.value: string,0,[object Object],false,1,2,,, +list.value.push(true) +// result.value: string,0,[object Object],false,1,2,,,,true +list.value = [null, 'string', undefined] +// result.value: ,string, +``` + +### Use with reactive separator + +```js +import { useArrayJoin } from '@vueuse/core' +const list = ref(['string', 0, { prop: 'val' }]) +const separator = ref() +const result = useArrayJoin(list, separator) +// result.value: string,0,[object Object] +separator.value = '' +// result.value: string0[object Object] +separator.value = '--' +// result.value: string--0--[object Object] +``` diff --git a/packages/shared/useArrayJoin/index.test.ts b/packages/shared/useArrayJoin/index.test.ts new file mode 100644 index 00000000000..d4567d8586f --- /dev/null +++ b/packages/shared/useArrayJoin/index.test.ts @@ -0,0 +1,40 @@ +import { ref } from 'vue-demi' +import { useArrayJoin } from '../useArrayJoin' + +describe('useArrayJoin', () => { + it('should be defined', () => { + expect(useArrayJoin).toBeDefined() + }) + + it('should work with array of refs', () => { + const item1 = ref('foo') + const item2 = ref(0) + const item3 = ref({ prop: 'val' }) + const list = [item1, item2, item3] + const result = useArrayJoin(list) + expect(result.value).toBe('foo,0,[object Object]') + item1.value = 'bar' + expect(result.value).toBe('bar,0,[object Object]') + }) + + it('should work with reactive array', () => { + const list = ref(['string', 0, { prop: 'val' }, false, [1], [[2]], null, undefined, []]) + const result = useArrayJoin(list) + expect(result.value).toBe('string,0,[object Object],false,1,2,,,') + list.value.push(true) + expect(result.value).toBe('string,0,[object Object],false,1,2,,,,true') + list.value = [null, 'string', undefined, 0, [], [1], [[2]], { prop: 'val' }] + expect(result.value).toBe(',string,,0,,1,2,[object Object]') + }) + + it('should work with reactive separator', () => { + const list = ref(['string', 0, { prop: 'val' }, [1], [[2]], null, undefined, []]) + const separator = ref() + const result = useArrayJoin(list, separator) + expect(result.value).toBe('string,0,[object Object],1,2,,,') + separator.value = '' + expect(result.value).toBe('string0[object Object]12') + separator.value = '-' + expect(result.value).toBe('string-0-[object Object]-1-2---') + }) +}) diff --git a/packages/shared/useArrayJoin/index.ts b/packages/shared/useArrayJoin/index.ts new file mode 100644 index 00000000000..1f4f84f1791 --- /dev/null +++ b/packages/shared/useArrayJoin/index.ts @@ -0,0 +1,11 @@ +import type { MaybeComputedRef } from '@vueuse/shared' +import { resolveUnref } from '@vueuse/shared' +import type { ComputedRef } from 'vue-demi' +import { computed } from 'vue-demi' + +export function useArrayJoin( + list: MaybeComputedRef[]>, + separator?: MaybeComputedRef, +): ComputedRef { + return computed(() => resolveUnref(list).map(i => resolveUnref(i)).join(resolveUnref(separator))) +}