Mixin to allow actions to return state like `{ '...login': { name: 'John', password: 'Doeh' } }` and edit deep-state
MIT License
This package is deprecated since events were removed from Hyperapp 0.x and didn't come back in 1.x.
This mixin allows Hyperapp-actions to return an object with a path as property: { '...deep.path': { deep: 'variable' } }
.
The mixin is uses update
event to modify the newState
.
Make sure you include this as the first mixin, as other mixins might want to use the 'normalized' state.
An example can be found here: https://codepen.io/alber70g/pen/dzKvYB?editors=0010
You can import the mixin and use it in the app like so:
import { DotNotationReducer } from 'hyperapp-dot-notation-reducer';
// umd
// const { DotNotationReducer } = hyperappDotNotationReducer;
// pre es6
// var DotNotationReducer = hyperappDotNotationReducer.DotNotationReducer;
app({
state: { something: { counter: 0 } },
view: (state, actions) =>
<main>
{state.something.counter}
<button onclick={actions.up}>up</button>
</main>,
actions: {
up: (state, actions) =>
({ 'something.counter': state.something.counter + 1 })
}
mixins: [DotNotationReducer],
events: {}
})
actions: {
setName: (state, actions, value) =>
({ 'login.name': value })
}
{ "login": { "name": "value" } }
Set an the properties of a deep path, while retaining the other properties. This means that you can send an object, and it's properties will be set instead of the new object replaces the existing one
actions: {
setName: (state, actions, { name, email }) =>
({ '...login': { name, email })
}
before
{ "login": { "prop": "value" } }
after
{ "login": { "prop": "value", "name": "name", "email": "email" } }
Since you cannot replace the full state in Hyperapp (it's always a merge of existing properties overwriting the new ones in the root of the state),
you can now do so using the spread ...
operator without a property.
actions: {
setState: (state, actions, newState) =>
({ '...': { prop: 'value' } })
}
before
{ "login": { "prop": "value" } }
after
{ "prop": "value" }
This is my first official contribution to anything public. Any comments are welcome.
Further improvements:
{ 'app.counters[0].value': 10 }