diff --git a/src/collection.ts b/src/collection.ts index 4eb10c4..f1dfb9f 100644 --- a/src/collection.ts +++ b/src/collection.ts @@ -1,15 +1,15 @@ -import {computed, ComputedRef, ref, Ref, ShallowRef, shallowRef, triggerRef} from 'vue' +import {computed, ComputedRef, markRaw, Raw, Ref, ref} from 'vue' import {TrackedInstance, useTrackedInstance} from './tracked-instance' -export interface CollectionItem { +export type CollectionItem = Raw<{ instance: TrackedInstance meta: Meta isRemoved: Ref isNew: Ref -} +}> export interface Collection { - items: ShallowRef[]> + items: Ref[]> isDirty: ComputedRef add: (item: Item, afterIndex?: number) => CollectionItem remove: (index: number, isHardRemove?: boolean) => void @@ -20,26 +20,31 @@ export interface Collection { export const useCollection = ( createItemMeta: (instance: TrackedInstance) => Meta = () => undefined as Meta ): Collection => { - const items = shallowRef[]>([]) + const items = ref[]>([]) const isDirty = computed(() => - items.value.some(({instance, isRemoved, isNew}) => instance.isDirty.value || isNew.value || isRemoved.value) + items.value.some(( + { + instance, + isRemoved, + isNew + } + ) => instance.isDirty.value || isNew.value || isRemoved.value) ) const createItem = (item: Item, isNew: boolean): CollectionItem => { const instance = useTrackedInstance(item) - return { + return markRaw({ isRemoved: ref(false), isNew: ref(isNew), instance, meta: createItemMeta(instance) - } + }) } const add = (item: Item, index: number = items.value.length) => { const newItem = createItem(item, true) items.value.splice(index, 0, newItem) - triggerRef(items) return newItem } @@ -47,7 +52,6 @@ export const useCollection = ( const item = items.value[index] if (item.isNew.value || isHardRemove) { items.value.splice(index, 1) - triggerRef(items) } else { items.value[index].isRemoved.value = true } @@ -55,7 +59,6 @@ export const useCollection = ( const loadData = (loadedItems: Item[]) => { items.value = loadedItems.map(item => createItem(item, false)) - triggerRef(items) } const reset = () => { @@ -64,7 +67,6 @@ export const useCollection = ( item.isRemoved.value = false item.instance.reset() } - triggerRef(items) } return {