Skip to content
On this page

Getting started

A store is a plain JavaScript module. Components only read it.

Terminal window
npm install nanostores

atom keeps one value. Actions that change it are plain functions next to the store.

stores/users.ts
import { atom } from 'nanostores'
export interface User {
name: string
isAdmin: boolean
}
export const $users = atom<User[]>([])
export function addUser(user: User) {
$users.set([...$users.get(), user])
}

computed recalculates when the stores it depends on change.

stores/admins.ts
import { computed } from 'nanostores'
import { $users } from './users'
export const $admins = computed($users, (users) =>
users.filter((user) => user.isAdmin),
)

Install the adapter for your framework. The component re-renders when $admins changes.

Terminal window
npm install @nanostores/react
components/Admins.tsx
import { useStore } from '@nanostores/react'
import { $admins } from '../stores/admins'
export function Admins() {
const admins = useStore($admins)
return (
<ul>
{admins.map((user) => (
<li key={user.name}>{user.name}</li>
))}
</ul>
)
}

Svelte, Solid, Lit, Angular, Alpine.js and Web Components: see Frameworks.