examples/example-logger.md

code

<div id="react-content"></div>
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import Rcf from 'index.js';

class A extends Component {
  handleClick = () => {
    this.props.store1.minus(2);
  }
  render() {
    return <div>

      A:

      {this.props.store1.a}

      <button onClick={this.handleClick}>
        click
      </button>

    </div>;
  }

}


class B extends Component {
  render() {
    return <div>

      B:

      {this.props.store1.a} 

    </div>;
  }

}


const logger = store => {
  const map = {};
  for (const name in store) {
    map[name] = {};
    const obj = store[name];
    for (const key in obj){
      const item = obj[key];
      map[name][key] = typeof item === 'function' ? function() {
          const e = arguments[arguments.length - 1];
          const setStore = e.setStore;   
          if (!e.setStore.logger) {
            e.setStore = obj => {
              console.log(name + ' ' + key);
              console.log(e.store);
              setStore(obj);
              console.log(e.store);
            };
            e.setStore.logger = true;
          }
          return item(...arguments);
        } : item;
    }
  }
  return map;
}

let store = {
  store1: {
    a: 1,
    minus: (step, e) => ({
      a: e.store.a - step,
    }),
  },
};

store = logger(store);

ReactDOM.render(<div>

  <Rcf store={store}>
    <A />
    <B />
  </Rcf>

  <Rcf store={store}>
    <B />
  </Rcf>

</div>, 

document.getElementById('react-content'));