Home

Awesome

<p align="center"> <img src="https://avatars1.githubusercontent.com/u/32093464?s=400&u=d360e449a9d59cf7422100349711ab0e0389d06a&v=4" height=100/> <h2 align="center">Dob</h2> <p align="center"> <i> Dob is a tool for monitoring object changes. Using <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy">Proxy</a>. <a target="_blank" href="https://dobjs.github.io/dob-docs/">Online Docs</a>. </i> <p> <p align="center"> <i> <a href="https://travis-ci.org/dobjs/dob"> <img src="https://img.shields.io/travis/dobjs/dob/master.svg?style=flat" alt="CircleCI Status"> </a> <a href="https://www.npmjs.com/package/dob"> <img src="https://img.shields.io/npm/v/dob.svg?style=flat" alt="NPM Version"> </a> <a href="https://codecov.io/github/dobjs/dob"> <img src="https://img.shields.io/codecov/c/github/dobjs/dob/master.svg" alt="Code Coverage"> </a> </i> </p> </p>

Examples

There are some demo on fiddle. Here's the simplest:

import { observable, observe } from "dob";

const obj = observable({ a: 1 });

observe(() => {
  console.log("obj.a has changed to", obj.a);
}); // <· obj.a has changed to 1

obj.a = 2; // <· obj.a has changed to 2

You can enjoy the benefits of proxy, for example obj.a = { b: 5 } is effective.

Use in react component

import { Action, observable, combineStores, inject } from "dob";
import { Connect } from "dob-react";

@observable
export class UserStore {
  name = "bob";
}

export class UserAction {
  @inject(UserStore) userStore: UserStore;

  @Action
  setName() {
    this.userStore.name = "lucy";
  }
}

@Connect(
  combineStores({
    UserStore,
    UserAction
  })
)
class App extends React.Component {
  render() {
    return (
      <span onClick={this.props.UserAction.setName}>
        {this.props.UserStore.name}
      </span>
    );
  }
}

Use inject to pick stores in action, do not new UserStore(), it's terrible for later maintenance.

Use in react project

import { Action, observable, combineStores, inject } from "dob";
import { Provider, Connect } from "dob-react";

@observable
export class UserStore {
  name = "bob";
}

export class UserAction {
  @inject(UserStore) userStore: UserStore;

  @Action
  setName() {
    this.userStore.name = "lucy";
  }
}

@Connect
class App extends React.Component {
  render() {
    return (
      <span onClick={this.props.UserAction.setName}>
        {this.props.UserStore.name}
      </span>
    );
  }
}

ReactDOM.render(
  <Provider
    {...combineStores({
      UserStore,
      UserAction
    })}
  >
    <App />
  </Provider>,
  document.getElementById("react-dom")
);

Project Examples

Ecosystem

Communication

Talk to us about dob using DingDing.

<img src="https://user-images.githubusercontent.com/7970947/40582019-39bdd16e-619b-11e8-8e82-43cf529a9fff.JPG" width=500/>

Note

Dependency injection does not support circular references

Do not allow circular dependencies between store and action, It's impossible to do like this:

class A {
  @inject(B) b;
}
class B {
  @inject(A) a;
}

Do not deconstruct to the last level on dynamic object

const obj = observable({ a: 1 });

// good
obj.a = 5;
// bad
let { a } = obj;
a = 5;

Inspired