Define your async methods. Use them synchronously in React. Instantly mutate the data and automatically update all usages.
For REST, GraphQL, Websockets+SSE and more
๐ Website
๐Read The Docs ย |ย ๐Getting Started ย |ย ๐ฎTodo Demo ย |ย ๐ฎGithub Demo ย |ย ๐ฎNextJS SSR Demo
npm install @rest-hooks/react @rest-hooks/rest @rest-hooks/test
For more details, see the Installation docs page.
Simple TypeScript definition
class User extends Entity {
id = '';
username = '';
pk() {
return this.id;
}
}
class Article extends Entity {
id = '';
title = '';
body = '';
author = User.fromJS();
pk() {
return this.id;
}
static schema = {
author: User,
}
}
Create collection of API Endpoints
const UserResource = createResource({
path: '/users/:id',
schema: User,
});
const ArticleResource = createResource({
path: '/articles/:id',
schema: Article,
});
One line data binding
const article = useSuspense(ArticleResource.get, { id });
return (
<>
<h2>{article.title} by {article.author.username}</h2>
<p>{article.body}</p>
</>
);
const ctrl = useController();
return (
<ProfileForm
onSubmit={data => ctrl.fetch(UserResource.update, { id }, data)}
/>
);
const price = useLive(PriceResource.get, { symbol });
return price.value;
const sortedArticles = new Query(
new schema.All(Article),
(entries, { asc } = { asc: false }) => {
const sorted = [...entries].sort((a, b) => a.title.localeCompare(b.title));
if (asc) return sorted;
return sorted.reverse();
}
);
const articlesUnsorted = useCache(sortedArticles);
const articlesAscending = useCache(sortedArticles, { asc: true });
const articlesDescending = useCache(sortedArticles, { asc: false });
For the small price of 9kb gziped. ย ย ๐Get started now | ๐ฅComparison
- Strong Typescript inference
- ๐ React Suspense support
- ๐งต React 18 Concurrent mode compatible
- ๐ฆ Partial Hydration Server Side Rendering
- ๐ฃ Declarative API
- ๐ Composition over configuration
- ๐ฐ Normalized caching
- ๐ฅ Tiny bundle footprint
- ๐ Automatic overfetching elimination
- โจ Optimistic updates
- ๐ง Flexible to fit any API design (one size fits all)
- ๐ง Debugging and inspection via browser extension
- ๐ณ Tree-shakable (only use what you need)
- ๐ Subscriptions
- โป๏ธ Optional redux integration
- ๐ Storybook mocking
- ๐ฑ React Native support
- โ๏ธ NextJS support
- ๐ฏ Declarative cache lifetime policy
- ๐ง Composable middlewares
- ๐ฝ Global data consistency guarantees
- ๐ Automatic race condition elimination
- ๐ฏ Global referential equality guarantees