You know that feeling when you write Vue code? Everything just clicks. computed values update automatically, watch lets you react to changes elegantly, and ref.value gives you a consistent way to access everything.
Then you switch to React and... where did all that magic go?
ZenBox = Code in React like Vue π + Manage state like Zustand π»
- πͺ Powerful - All of Zustand's benefits + more
- β‘οΈ Easy to Use - Where Vue's simplicity meets React's power
- π¦ Lightweight - 100 lines of core code, no bloat, just the good stuff
// Types are automatically inferred from initial state
const userStore = createStore({
name: "Del Wang",
posts: ["Hello World!"],
});
// Computed values that just work
const greeting = useComputed(() => `Hey ${userStore.value.name}!`);
// Watch changes like Vue
useWatch(
() => userStore.value.posts.length,
(count) => console.log(`${count} posts now`)
);If you squint, this could be Vue code. But it's React, and it works exactly like you'd expect.
This is ZenBox - where Zustand's simplicity meets Vue's joyful developer experience.
π Visit https://zenbox.del.wang to view the full documentation.
npm install zenbox- π Documentation: zenbox.del.wang
- π Issues: GitHub Issues
- π¬ Discussions: GitHub Discussions
| Feature | ZenBox | Zustand |
|---|---|---|
| Learning Curve | β As easy as Vue | β Low |
| Vue-like Hooks | β
useComputed / useWatch |
β Not supported |
| TypeScript | β Auto-inference | |
| Cross-Store | β Auto tracking | β Not supported |
| State Access | β
Unified store.value |
get() / set() |
| Scoping | β Built-in Provider | β Global by default |
| Immer | β Built-in | |
| Bundle Size | < 3KB gzipped (without Immer) | < 1KB gzipped |
MIT License Β© 2025-PRESENT Del Wang