UNPKG

@tanstack/solid-table

Version:

Headless UI for building powerful tables & datagrids for Solid.

54 lines (52 loc) 1.58 kB
import { FlexRender } from "./FlexRender.js"; import { solidReactivity } from "./reactivity.js"; import { constructTable } from "@tanstack/table-core"; import { createComputed, getOwner, mergeProps, onCleanup, untrack } from "solid-js"; //#region src/createTable.ts /** * Creates a Solid table instance backed by Solid-aware TanStack Store atoms. * * Table APIs and atom reads participate in Solid dependency tracking, so * computations that read a specific slice can update without invalidating * unrelated UI. Use `table.Subscribe` to create atom-tracked render boundaries. * * @example * ```tsx * const table = createTable( * { * features, * columns, * data, * }, * ) * ``` */ function createTable(tableOptions) { const owner = getOwner(); const reactivity = solidReactivity(owner); const mergedOptions = mergeProps(tableOptions, { features: { coreReactivityFeature: reactivity, ...tableOptions.features } }); const resolvedOptions = mergeProps({ mergeOptions: (defaultOptions, options) => { return mergeProps(defaultOptions, options); } }, mergedOptions); const table = constructTable(resolvedOptions); createComputed(() => { const userState = tableOptions.state; if (userState) for (const key in userState) userState[key]; untrack(() => { table.setOptions((prev) => { return mergeProps(prev, mergedOptions); }); }); }); onCleanup(() => reactivity.unmount?.()); table.Subscribe = (props) => { return props.children(table.atoms); }; table.FlexRender = FlexRender; return table; } //#endregion export { createTable };