;
}
```
## DevTools
```typescript
import { useAtomsDebugValue } from 'jotai-devtools';
function App(): React.ReactElement {
useAtomsDebugValue(); // Shows atoms in React DevTools
return ;
}
```
## Best Practices
1. **Start with primitive atoms** - Build complex from simple
2. **Use derived atoms** - Avoid duplicating state
3. **Keep atoms small** - One concern per atom
4. **Use atom families** - For dynamic/collection state
5. **Prefer useAtomValue/useSetAtom** - When only reading or writing
## Jotai vs Zustand
| Feature | Jotai | Zustand |
|---------|-------|---------|
| Model | Bottom-up (atoms) | Top-down (store) |
| Subscriptions | Automatic (fine-grained) | Manual (selectors) |
| Provider | Optional | Not needed |
| Async | Built-in | Manual |
| DevTools | Separate package | Middleware |
| Best for | Complex dependencies | Simple global state |
## When to Use Jotai
- Complex state dependencies
- Fine-grained re-render control
- Derived state calculations
- Code splitting state
- When you think in "atoms"
## Notes
- Atoms are not stored in a single object
- Each atom can be code-split
- No provider needed (uses React context internally)
- Works great with React Suspense