UNPKG

hyperapp-dot-notation-reducer

Version:

Hyperapp mixin to use dot.notations return objects in actions.

104 lines (81 loc) 2.42 kB
Dot.notation reducer mixin ========================== 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 Installation ------------ You can import the mixin and use it in the app like so: ```javascript 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: {} }) ``` Usage ----- ### Setting a deep property ```javascript actions: { setName: (state, actions, value) => ({ 'login.name': value }) } ``` ```json { "login": { "name": "value" } } ``` ### Deep object with spread 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 ```javascript actions: { setName: (state, actions, { name, email }) => ({ '...login': { name, email }) } ``` before ```json { "login": { "prop": "value" } } ``` after ```json { "login": { "prop": "value", "name": "name", "email": "email" } } ``` ### Replacing the state 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. ```javascript actions: { setState: (state, actions, newState) => ({ '...': { prop: 'value' } }) } ``` before ```json { "login": { "prop": "value" } } ``` after ```json { "prop": "value" } ``` Author notes ------------ This is my first official contribution to anything public. Any comments are welcome. Further improvements: - array index manipulation through path `{ 'app.counters[0].value': 10 } `