useListState
Manage array state with convenient handlers.
Import
import { useListState } from '@tidbcloud/uikit'Usage
useListState provides an API to work with list state:
import { useListState } from '@tidbcloud/uikit'
const [values, handlers] = useListState([{ a: 1 }])
// Add items to the end
handlers.append({ a: 2 })
// values -> [{ a: 1 }, { a: 2 }]
// Add items to the start
handlers.prepend({ a: 3 }, { a: 4 })
// values -> [{ a: 3 }, { a: 4 }, { a: 1 }, { a: 2 }]
// Remove items at given positions
handlers.remove(0, 2)
// values -> [{ a: 4 }, { a: 2 }]
// Insert items at given position
handlers.insert(1, { a: 5 })
// values -> [{ a: 4 }, { a: 5 }, { a: 2 }]
// Apply function to all items
handlers.apply((item, index) => ({ a: item.a * index }))
// values -> [{ a: 0 }, { a: 5 }, { a: 4 }]
// Move item from one position to another
handlers.reorder({ from: 2, to: 0 })
// values -> [{ a: 4 }, { a: 0 }, { a: 5 }]
// Swap items positions
handlers.swap({ from: 0, to: 2 })
// values -> [{ a: 5 }, { a: 0 }, { a: 4 }]
// Apply function to items matching condition
handlers.applyWhere(
(item) => item.a > 0,
(item) => ({ a: item.a + 2 })
)
// values -> [{ a: 7 }, { a: 0 }, { a: 6 }]
// Set new state
handlers.setState([{ a: 6 }, { a: 7 }])
// values -> [{ a: 6 }, { a: 7 }]
// Set item at position
handlers.setItem(0, { a: 8 })
// values -> [{ a: 8 }, { a: 7 }]
// Set item property at position
handlers.setItemProp(1, 'a', 'new-prop')
// values -> [{ a: 8 }, { a: 'new-prop' }]
// Filter items
handlers.filter((item) => item.a === 'new-prop')
// values -> [{ a: 'new-prop' }]Available Handlers
append– add items to the end of the listprepend– add items to the start of the listpop– remove last itemshift– remove first iteminsert– insert items at given indexremove– remove items at given indicesreorder– move item from one position to anotherswap– swap items positionsapply– apply given function to all itemsapplyWhere– apply given function to items matching conditionsetItem– replace item at given indexsetItemProp– set item property at given indexsetState– set list state with react actionfilter– filter values with callback function
Set Item Type
By default, the hook will use type from initialValues. If you call the hook with an empty array, specify the item type:
import { useListState } from '@tidbcloud/uikit'
useListState(['hello']) // ok, item type is string
useListState([]) // not ok, item type is any
useListState<string>([]) // ok, item type is stringDefinition
interface UseListStateHandlers<T> {
setState: React.Dispatch<React.SetStateAction<T[]>>
append: (...items: T[]) => void
prepend: (...items: T[]) => void
insert: (index: number, ...items: T[]) => void
pop: () => void
shift: () => void
apply: (fn: (item: T, index?: number) => T) => void
applyWhere: (condition: (item: T, index: number) => boolean, fn: (item: T, index?: number) => T) => void
remove: (...indices: number[]) => void
reorder: ({ from, to }: { from: number; to: number }) => void
swap: ({ from, to }: { from: number; to: number }) => void
setItem: (index: number, item: T) => void
setItemProp: <K extends keyof T, U extends T[K]>(index: number, prop: K, value: U) => void
filter: (fn: (item: T, i: number) => boolean) => void
}
function useListState<T>(initialValue?: T[]): [T[], UseListStateHandlers<T>]