Link in bio to widgets, your online home screen. ➫ 🔗 kee.so
Features
- Gorgeous auto optimized re-render
- Automatic request loading
- Extremely simple API
Install
pnpm add flooks
# or
yarn add flooks
# or
npm i flooks
Usage
import create from 'flooks';
const useCounter = create((store) => ({
count: 0,
add() {
const { count } = store();
store({ count: count + 1 });
},
async addAsync() {
await new Promise((resolve) => setTimeout(resolve, 1000));
const { add } = store();
add();
},
}));
function Counter() {
const { count, add, addAsync } = useCounter();
return (
<div>
<p>{count}</p>
<button onClick={add}>+</button>
<button onClick={addAsync}>+~ {addAsync.loading && '...'}</button>
</div>
);
}
* Automatic request loading - if a function is async, asyncFn.loading
is its loading state. If asyncFn.loading
is not used, no extra re-render.
Demo
Auto optimization
flooks realizes a gorgeous auto optimization, only actually used data will be injected into the component, re-render completely on demand, when React is truly "react".
Why flooks over zustand?
// zustand, need a selector
const { nuts, honey } = useStore((state) => ({
nuts: state.nuts,
honey: state.honey,
}));
// flooks, not need a selector
// but also only `nuts` or `honey` update trigger re-render, it's automatic
const { nuts, honey } = useStore();
Only functions, no re-render
const { a } = useStore(); // A component, update `a`
const { fn } = useStore(); // B component, only functions, no re-render
No updated state, no re-render
const { a } = useStore(); // A component, update `a`
const { b } = useStore(); // B component, no `a`, no re-render
No fn.loading, no extra re-render
const { asyncFn } = useStore(); // A component, call `asyncFn`
asyncFn(); // No `asyncFn.loading`, no extra re-render
// With normal loading solutions, even `asyncFn.loading` is not used,
// it will re-render at least twice (turn `true` then `false`).
API
create()
import create from 'flooks';
const useStore = create((store) => obj);
// For `react<=17`, you can use `create.config()` to pass
// `ReactDOM.unstable_batchedUpdates` for batch updating in async updates.
//
// create.config({ batch: ReactDOM.unstable_batchedUpdates }); // at app entry
store()
import create from 'flooks';
const useStore = create((store) => ({
fn() {
const { a, b } = store(); // get state
store({ a: a + b }); // update state by data
// or
store((state) => ({ a: state.a + state.b })); // update state by function
},
}));