Stencil Redux

A simple redux connector for Stencil-built web components inspired by react-redux.

Usage

Stencil Redux uses the official redux library underneath, so much of the creation and configuration of the store, along with specifying reducers and middleware, is identical.

Configure store

// src/store/index.ts
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk'; // Add-on you might want
import logger from 'redux-logger'; // Add-on you might want
import rootReducer from '../reducers/index';

const configureStore = (preloadedState: any) =>
  createStore(rootReducer, preloadedState, applyMiddleware(thunk, logger));

export { configureStore };

Configure reducers

// src/reducers/index.ts
import myReducer from './myReducer';

import { combineReducers } from 'redux';

const rootReducer = (combineReducers as any)({
  myReducer
});

export default rootReducer;

Configure Store in Root Component

import { Store } from '@stencil/redux';
import { configureStore } from '../../store/index'; // index required due to bug

@Component({
  tag: 'my-app',
  styleUrl: 'my-app.scss'
})
export class MyApp {
  @Prop({ context: 'store' }) store: Store;

  componentWillLoad() {
    this.store.setStore(configureStore({}));
  }
}

Map state and dispatch to props

import { Store, Action } from '@stencil/redux';

@Component({
  tag: 'my-component',
  styleUrl: 'my-component.scss'
})
export class MyComponent {
  @Prop({ context: 'store' }) store: Store;

  @State() name: string;

  changeName: Action;

  componentWillLoad() {
    this.store.mapStateToProps(this, (state) => {
      const {
        myReducer: { name }
      } = state;
      return {
        name
      }
    });

    this.store.mapDispatchToProps(this, {
      changeName
    })
  }

  doNameChange(newName: string) {
    this.changeName(newName);
  }
}
Back Next
Contributors