This widget demonstrates how to provide your own Redux store,action, and reducer to share state between widgets.
Clone the sample repo and copy this widget's folder (within widgets
) to the client/your-extensions/widgets
folder of your Experience Builder installation.
Create an extension class to implement the ReduxStoreExtension
interface in the my-store.ts
file.
import { extensionSpec, ImmutableObject, IMState } from 'jimu-core';
export default class MyReduxStoreExtension implements extensionSpec.ReduxStoreExtension {
id = 'my-local-redux-store-extension';
// Returns your redux actions
getActions() {
return Object.keys(MyActionKeys).map(k => MyActionKeys[k]);
}
//This returns the local state
getInitLocalState() {
return {
a: null,
b: null
}
}
//This is the reducer and specifies how the application state changes in response to the actions.
getReducer() {
return (localState: IMMyState, action: ActionTypes, appState: IMState): IMMyState => {
switch (action.type) {
case MyActionKeys.MyAction1:
return localState.set('a', action.val);
case MyActionKeys.MyAction2:
return localState.set('b', action.val);
default:
return localState;
}
}
}
//Return the local key for myState
getStoreKey() {
return 'myState';
}
}
In the manifest.json
there is an extensions
property that provides the location and information for the redux store extension.
"extensions": [
{
"name": "My store",
"point": "REDUX_STORE",
"uri": "extensions/my-store"
}
],
In the widget.tsx
the onChange
function dispatches the action type based on the change in the value.
onChange = (evt) => {
this.props.dispatch({
type: 'MY_ACTION_1',
val: evt.target.value
});
}