Events
Each component in ComponentsRepo could emit special events: AutoChangeEvent and AutoClickEvent. Those events contains original event and in addition has schemaPointer and pointer properties which helps understand where is the source of the event.
AutoChangeEvent
When component emits AutoChangeEvent it adds JSONPatch to it. With it is super easy to handle the state.
Check out the Basic Usage example.
AutoClickEvent
This event, besides schemaPointer and pointer provides data field.
Construcing AutoEventHandler
changeEventHandler
AutoViews provides utilities that can create AutoEventHandler that contains JSONPatch.
In this example we are using changeEventHandler utility to construct onChange with JSONPatch
import {changeEventHandler} from '@autoviews/core';
const myRepo = new ComponentsRepo('myRepo');
myRepo.register('string', {
name: 'myInput',
component: props => (
<input
value={props.data}
onChange={changeEventHandler(props, e => e.currentTarget.value)}
/>
)
});
addItemEventHandler
Helper to create JSONPatch that adds item to the array.
const myRepo = new ComponentsRepo('MyRepo');
myRepo.register('array', {
name: 'MyArray',
component: props => {
return (
<button onClick={addItemEventHandler(props, () => 'new item')}>
Add item
</button>
);
}
});
addFieldEventHandler
Helper to create JSONPatch that adds field to the object.
const myRepo = new ComponentsRepo('MyRepo');
myRepo.register('object', {
name: 'MyObject',
component: props => {
return (
<button
onClick={addFieldEventHandler(
props,
() => 10,
() => 'age'
)}
>
Add field 'age' with value 10
</button>
);
}
});
removeFieldEventHandler
Helper to create JSONPatch that removes field from the object.
const myRepo = new ComponentsRepo('MyRepo');
// ... register object
myRepo.register('string', {
name: 'MyStringComponent',
component: props =>
props.data ? (
<span>
{props.data}
<button onClick={removeEventHandler(props)}>remove me</button>
</span>
) : null
});
clickEventHandler
Helper to create AutoClickEvent with any data.
const myRepo = new ComponentsRepo('MyRepo');
myRepo.register('string', {
name: 'MyStringComponent',
component: props => (
<span>
{props.data}
<button
onClick={clickEventHandler({
...props,
data: "hey I've been clicked"
})}
>
Click me
</button>
</span>
)
});