Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/lostpebble/pullstate
Simple state stores using immer and React hooks - re-use parts of your state by pulling it anywhere you like!
https://github.com/lostpebble/pullstate
hooks immer react reactjs server-side-rendering state state-management
Last synced: 28 days ago
JSON representation
Simple state stores using immer and React hooks - re-use parts of your state by pulling it anywhere you like!
- Host: GitHub
- URL: https://github.com/lostpebble/pullstate
- Owner: lostpebble
- License: mit
- Created: 2019-02-16T23:02:06.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2023-06-07T17:51:30.000Z (over 1 year ago)
- Last Synced: 2024-10-01T20:43:36.898Z (about 1 month ago)
- Topics: hooks, immer, react, reactjs, server-side-rendering, state, state-management
- Language: TypeScript
- Homepage: https://lostpebble.github.io/pullstate
- Size: 4.35 MB
- Stars: 1,075
- Watchers: 14
- Forks: 23
- Open Issues: 46
-
Metadata Files:
- Readme: README.md
- Changelog: Changelog.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
- awesome-star-libs - lostpebble / pullstate - -通过在任意位置提取状态,重复使用状态的一部分! (目录)
README
### pullstate
> Ridiculously simple state stores with performant retrieval anywhere
> in your React tree using the wonderful concept of React hooks!* ~7KB minified and gzipped! (excluding Immer and React)
* Built with Typescript, providing a great dev experience if you're using it too
* Uses [immer](https://github.com/mweststrate/immer) for state updates - easily and safely mutate your state directly!
* **NEW** - [Create async actions](https://lostpebble.github.io/pullstate/docs/async-actions-introduction) and use React hooks or `` to have complete control over their UI states!_Originally inspired by the now seemingly abandoned library - [bey](https://github.com/jamiebuilds/bey). Although substantially
different now- with Server-side rendering and Async Actions built in! Bey was in turn inspired by
[react-copy-write](https://github.com/aweary/react-copy-write)._Try out a quick example:
[![Edit Pullstate Client-only Example](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/myvj8zzypp)
### 🎉 **[New documentation site is live!](https://lostpebble.github.io/pullstate/)**
* [Installation](https://lostpebble.github.io/pullstate/docs/installation)
* [Quick example](https://lostpebble.github.io/pullstate/docs/quick-example)
* [Quick example - Server rendering](https://lostpebble.github.io/pullstate/docs/quick-example-server-rendered)
* [Async Actions](https://lostpebble.github.io/pullstate/docs/async-actions-introduction)
* [Creation](https://lostpebble.github.io/pullstate/docs/async-actions-creating)
* [Usage](https://lostpebble.github.io/pullstate/docs/async-action-use)
* [Async action hooks](https://lostpebble.github.io/pullstate/docs/async-hooks-overview)---
# **Let's dive right in**
> This is taken directly from [the documentation site](https://lostpebble.github.io/pullstate/docs/quick-example), to give you a quick overview of Pullstate here on github. Be sure to check out the site to learn more.
To start off, install `pullstate`.
```bash
yarn add pullstate
```## Create a store
Define the first **state store**, by passing an initial state to `new Store()`:
```jsx
import { Store } from "pullstate";export const UIStore = new Store({
isDarkMode: true,
});
```## Read our store's state
Then, in React, we can start using the state of that store using a simple hook `useState()`:
```tsx
import * as React from "react";
import { UIStore } from "./UIStore";export const App = () => {
const isDarkMode = UIStore.useState(s => s.isDarkMode);return (
Hello Pullstate
);
};
```The argument to `useState()` over here (`s => s.isDarkMode`), is a selection function that ensures we select only the state that we actually need for this component. This is a big performance booster, as we only listen for changes (and if changed, re-render the component) on the exact returned values - in this case, simply the value of `isDarkMode`.
---
## Add interaction (update state)
Great, so we are able to pull our state from `UIStore` into our App. Now lets add some basic interaction with a ``:
```tsx
return (
Hello Pullstate
UIStore.update(s => {
s.isDarkMode = !isDarkMode;
})
}>
Toggle Dark Mode
);
```Notice how we call `update()` on `UIStore`, inside which we directly mutate the store's state. This is all thanks to the power of `immer`, which you can check out [here](https://github.com/immerjs/immer).
Another pattern, which helps to illustrate this further, would be to actually define the action of toggling dark mode to a function on its own:
```tsx
function toggleMode(s) {
s.isDarkMode = !s.isDarkMode;
}// ...in our code
UIStore.update(toggleMode)}>Toggle Dark Mode
```Basically, to update our app's state all we need to do is create a function (inline arrow function or regular) which takes the current store's state and mutates it to whatever we'd like the next state to be.
## Omnipresent state updating
Something interesting to notice at this point is that we are just importing `UIStore` directly and running `update()` on it:
```tsx
import { UIStore } from "./UIStore";// ...in our code
UIStore.update(toggleMode)}>Toggle Dark Mode
```And our components are being updated accordingly. We have freed our app's state from the confines of the component! This is one of the main advantages of Pullstate - allowing us to separate our state concerns from being locked in at the component level and manage things easily at a more global level from which our components listen and react (through our `useStoreState()` hooks).