easy-peasy-classes v0.0.2
easy-peasy-classes
easy-peasy-classes is a simple package that gives you the abiliy to write your easy-peasy models with typescript classes and decorators. Giving you an easy and concise way to build your store and getting code autocompletion + type safety. easy-peasy-classes is heavily inspired by erencay's easy-peasy-decorators package. The approach slithy differs in order to add some new features.
Disclaimer
This package (and its documentation) is still under development and is not suitable for use yet.
| easy-peasy-classes | easy-peasy-decorators | |
|---|---|---|
| No need for a duplicate definition of the model and its interface | ✓ | ✓ |
| Autocompletion when accessing state and actions, even for reusable store models | ✓ | ✓ |
| No need to import/export your models throughout your project | - | ✓ |
| No need to extend every model from a base class | - | ✓ |
| Ability to mix with classic easy-peasy model definitions | ✓ | - |
| Convenient for deeply nested store structure | ✓ | - |
| Ability to define resusable models | ✓ | - |
| Class inheritence for models / Definition | ✓ | - |
| this.getStoreState() and this.getStoreActions() helpers | ✓ | - |
| Possibilty to define a this.resetState() helper | ✓ | - |
Installation
npm install easy-peasy easy-peasy-classes
# or
yarn add easy-peasy easy-peasy-classesBasic usage
easy-peasy-classes comes with 7 decorators
| @Model | Required on top of every class model |
| @Property | State value or sub-model |
| @Child | Same as @Property but enforce that useStoreState hook will get every @Property or @Child individually. More details here |
| @Action | |
| @Thunk | |
| @Computed | |
| @Listener() |
Reusable models
In classic easy-peasy, a reusable models is a model wrapped in a function. This way you can duplicate it. This is usefull if you have multiple components that have the same behaviour but not the same state values.
With classic easy-peasy syntax
//Reusable model definition
const CheckboxReusable = ()=>({
isChecked: false,
toggle: action((state, payload) => {
state.isChecked = !state.isChecked);
}),
})
//Usage in a parent model
export const ListModel = {
consentmentCheckbox: CheckboxReusable(),
newsletterCheckbox: CheckboxReusable()
}//Reusable model definition
@Model
class CheckboxReusable extends BaseModel {
@Property
isChecked: boolean = false
@Action
toggle(){
this.isChecked = !this.isChecked
}
}
//Usage in a parent model
@Model
export class ListModel extends BaseModel{
@Child
consentmentCheckbox: CheckboxReusable = CheckboxReusable.obj
@Child
newsletterCheckbox: CheckboxReusable = CheckboxReusable.obj
}
//or with classic easy-peasy
export const ListModel = {
consentmentCheckbox: CheckboxReusable.obj as CheckboxReusable,
newsletterCheckbox: CheckboxReusable.obj as CheckboxReusable
}