resso
Version:
The simplest React state manager
159 lines (114 loc) • 3.26 kB
Markdown
<div align="center">
Link in bio to **widgets**,
your online **home screen**. ➫ [🔗 kee.so](https://kee.so/)
</div>
---
<div align="center">
<h1>🪢 resso</h1>
最简单的 React 状态管理器。_自动按需 re-render ⚡️_
**R**eactive **E**legant **S**hared **S**tore **O**bject
(支持 React 18、React Native、SSR、小程序等)
[](https://www.npmjs.com/package/resso)
[](https://github.com/nanxiaobei/resso/actions/workflows/test.yml)
[](https://bundlephobia.com/result?p=resso)
[](https://github.com/nanxiaobei/resso/blob/main/src/index.ts)
[](https://github.com/nanxiaobei/resso/blob/main/LICENSE)
[](./README.md) · 简体中文
</div>
[](https://zhuanlan.zhihu.com/p/468417292)
- 非常简单 🪩
- 非常聪明 🫙
- 非常小巧 🫧
```sh
pnpm add resso
yarn add resso
npm i resso
```
```jsx
import resso from 'resso';
const store = resso({
count: 0,
text: 'hello',
inc() {
const { count } = store; // 须在顶层解构(若在方法中用到)
store.count = count + 1;
},
});
function App() {
const { count } = store; // 须在顶层解构(若在 UI 中用到)
return (
<>
{count}
<button onClick={() => (store.count += 1)}>+</button>
</>
);
}
```
\* 顶部解构其实是调用 `useState`(Hooks 规则,否则将有 React 报错)
[](https://codesandbox.io/s/resso-ol8dn?file=/src/App.jsx)
**更新单个**
```jsx
store.count = 60;
store('count', (c) => c + 1);
```
**更新多个**
```jsx
store({
count: 60,
text: 'world',
});
store((s) => ({
count: s.count + 1,
text: s.text === 'hello' ? 'world' : 'hello',
}));
```
**非 state 共享变量 (Refs)**
事实上它与 resso 无关,只是 JavaScript。你可以这样做:
```jsx
// store.js
export const refs = {
total: 0,
};
// App.js
import store, { refs } from './store';
function App() {
refs.total = 100;
return <div />;
}
```
---
**\* `react<18` 批量更新**
```jsx
resso.config({ batch: ReactDOM.unstable_batchedUpdates }); // 在项目入口
```
```jsx
// 没有 text 更新,绝不 re-render
function Text() {
const { text } = store;
return <p>{text}</p>;
}
// 只在 count 更新时 re-render
function Count() {
const { count } = store;
return <p>{count}</p>;
}
// 没有 state 在 UI 中,绝不 re-render
function Control() {
return (
<>
<button onClick={store.inc}>+</button>
<button onClick={() => (store.count -= 1)}>-</button>
</>
);
}
```
[](https://github.com/nanxiaobei/resso/blob/main/LICENSE) (c) [nanxiaobei](https://lee.so/)