Skip to content

useLookup()

Creates a reactive lookup function that maps an array to an object for efficient key-based access.

tsx
const lookup = useLookup(getArray, key);

Parameters

  • getArray: () => T[] - A function that returns the array to create a lookup from
  • key: keyof T - The property name to use as the lookup key

Returns

A lookup function (key: T[U]) => T | undefined that returns the item with the matching key, or undefined if not found.

Example

tsx
import { useLookup, useState } from "rask-ui";

function UserList() {
  const state = useState({
    users: [
      { id: 1, name: "Alice", role: "Admin" },
      { id: 2, name: "Bob", role: "User" },
      { id: 3, name: "Charlie", role: "User" },
    ],
    selectedId: 1,
  });

  const getUserById = useLookup(() => state.users, "id");

  return () => {
    const selectedUser = getUserById(state.selectedId);

    return (
      <div>
        <h2>Users</h2>
        {state.users.map((user) => (
          <button key={user.id} onClick={() => (state.selectedId = user.id)}>
            {user.name}
          </button>
        ))}

        {selectedUser && (
          <div>
            <h3>Selected User</h3>
            <p>Name: {selectedUser.name}</p>
            <p>Role: {selectedUser.role}</p>
          </div>
        )}
      </div>
    );
  };
}

Features

  • Efficient lookups - O(1) lookup time instead of O(n) array search
  • Reactive - Automatically updates when the array structure changes
  • Type-safe - Full TypeScript inference for keys and return types

Important Notes

WARNING

The lookup will only update when the array structure changes (items added, removed, or reordered). Changes to properties of items within the array will not trigger a lookup rebuild.

tsx
// These will trigger a lookup update:
state.users.push({ id: 4, name: "Dave", role: "User" });
state.users = state.users.filter((u) => u.id !== 2);

// This will NOT trigger a lookup update:
state.users[0].name = "Alicia";

Released under the MIT License.