Collection

Efficient collection state management for React with TypeScript support

Quick Start

import { createCollection } from 'finalstore';
 
type User = {
  name: string;
  age: number;
  active: boolean;
};
 
// Create collection
const users = createCollection({
  states: {
    name: '',
    age: 0,
    active: true
  } as User,
  actions: {
    updateName: (state, name: string) => {
      state.name = name;
    },
    toggleActive: (state) => {
      state.active = !state.active;
    }
  },
  selectors: {
    displayName: (state) => `${state.name} (${state.age})`,
    isAdult: (state) => state.age >= 18
  },
  config: {
    name: 'Users',
    devtools: true
  }
});
 
// Use in components
function UserList() {
  const userIds = users.useKeys(); // Get all user IDs
  const totalUsers = users.useSize(); // Get collection size
 
  return (
    <div>
      <h2>Users ({totalUsers})</h2>
      <button
        onClick={() => {
          users.key(`user-${totalUsers + 1}`).set({
            name: 'New User',
            age: 0,
            active: true
          });
        }}
      >
        Add User
      </button>
      <ul>
        {userIds.map((id) => (
          <UserItem key={id} id={id} />
        ))}
      </ul>
    </div>
  );
}
 
function UserItem({ id }: { id: string }) {
  const name = users.key(id).useSelector.displayName(); // Predefined selector
  const isActive = users.key(id).use((s) => s.active); // Custom selector
 
  return (
    <li>
      <input
        type="checkbox"
        checked={isActive}
        onChange={() => users.key(id).dispatch.toggleActive()}
      />
      <span>{name}</span>
      <button onClick={() => users.key(id).remove()}>Delete</button>
    </li>
  );
}

Key Features

  • Map-based collection management
  • Individual item subscriptions
  • Collection size and keys tracking
  • Predefined selectors
  • Custom selectors
  • TypeScript-first
  • Redux DevTools support
  • Deep equality checks for performance
  • Sync/async actions
  • Scoped collections for component isolation

On this page