State management for REACT hooks Apps.
Features:
- Minimal bounder size(less than 1kb)
- Typescript oriented
- Easy to get or update states OUTSIDE the react context and rerender the components they depend on
- Supports to use in component development
npm install clodx
npm run test
- clod
import { clod } from "clodx";
const a = clod(123);
- pickClod((get: ClodGetter) => T) : T
Common usage
import { clod, pickClod } from "clodx";
const a = clod(123);
const b = pickClod((get) => get(a) + 2);
const c = pickClod((get) => get(a) + get(b));
const d = pickClod(async (get) => {
await new Promise((res) => setTimeout(res, 1000, true));
return get(a) + get(b);
});
const e = pickClod(async (get) => {
return await get(d);
});
Update clod with customized equal
const a = clod(123, (prev, next) => next - prev > 100);
const b = pickClod(
(get) => get(a),
(prev, next) => next - prev > 100
);
- makeClod(fn: (value: T, get: ClodGetter, set: ClodSetter): MaybePromise):((value: T) => maybePromise<void>)
import { makeClod } from "clodx";
const a = makeClod((value: number, _get, set) => set(a, value));
const b = makeClod(async (value: number, _get, set) => {
await new Promise((res) => setTimeout(res, 1000, true));
set(a, value);
});
- setClodValue<T extends StateClod | MakeClod>(clod: T, value: ClodValueTypeForSet): MaybePromise<void>
import { clod, makeClod, setClodValue } from "clodx";
const a = clod(123);
const b = makeClod((value: number, _get, set) => set(a, value));
function example() {
setClodValue(456);
}
- updatePickClod(clod: PickClod): void
import { clod, pickClod, updatePickClod, setClodValue, exportClod } from "clodx";
const a = clod(123);
const b = pickClod((get) => get(a));
function example() {
updatePickClod(b);
}
- exportClod<T extends StateClod | PickClod>(clod: T): ClodValueTypeForGet
import { clod, setClodValue, updatePickClod, exportClod } from "clodx";
const a = clod(123);
const b = pickClod((get) => get(a));
const c = makeClod((value: number, _get, set) => set(a, value));
function example() {
exportClod(a); // 123
exportClod(b); // undefined
updatePickClod(b);
exportClod(b); // 123
setClodValue(c, 456);
exportClod(a); // 456
exportClod(b); // 456
}
- useClod(value: Clod): [T, (value: T) => void]
import { clod, useClod } from "clodx";
const countState = clod(0);
function Component() {
const [count, setCount] = useClod(countState);
const onClick = () => {
setCount(count++);
};
//...
}
- usePickClod(value: Clod<Picker>): T
import { clod, pickClod, useClod, usePickClod } from "clodx";
const countState = clod(0);
const countPlusState = pickClod((get) => get(countState) + 1);
function ComponentA() {
const [count, setCount] = useClod(countState);
const onClick = () => {
setCount(count++);
};
// render...
}
function ComponentB() {
const countPlus = usePickClod(countPlusState);
/// render...
}
- useMakeClod(value: Clod<Maker>): (value: T) => void
import { clod, makeClod, useClod, useMakeClod } from "clodx";
const countState = clod(0);
const setCountState = makeClod((value: number, get, set) => {
set(countState, value);
});
function ComponentA() {
const [count, setCount] = useClod(countState);
const onClick = () => {
setCount(count++);
};
// render...
}
function ComponentB() {
const setCount = useMakeClod(setCountState);
const onClick = () => {
setCount(count++);
};
/// render...
}
The Earth
component supports us to use clod simplify in our react component development.
The following methods have the same effect as Methods except for specifying earthName
.
-
updatePickClodByEarthName(earthName: string, clod: StateClod, value: T)
-
setClodValueByEarthName<T extends StateClod | MakeClod>(earthName: string, clod: T, value: ClodValueTypeForSet)
-
exportClodByEarthName<T extends StateClod | PickClod>(earthName: string, clod: T)
import { clod, useClodValue, useClod } from 'clodx'
const inputValueState = clod('hello world.')
function MySubmit () {
const value = useClodValue(inputValueState)
const onClick = () => {
// ...
}
return (
<button onClick={onClick}>submit</button>
)
}
function MyInput () {
const [value, setValue] = useClod(inputValueState)
return (
<input value={value} onChange={(e) => setValue(e.target.value)} />
)
}
function MyComponent () {
return (
<Earth>
<MyInput />
<MySubmit />
<Earth />
)
}
function MyComponentAssignEarthKey () {
return (
<Earth name="input">
<MyInput />
<MySubmit />
<Earth />
)
}
function App() {
return (
<>
<div>
{/** all their clod value are managed independently */}
<MyComponent />
<MyComponent />
<MyComponent />
</div>
<div>
{/** all their clod value are managed by same clod */}
<MyComponentAssignEarthKey />
<MyComponentAssignEarthKey />
</div>
</>
)
}
- More tests for clodx
- Classic component SUPPORT
- Clodx plugin mechanism