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 notnew 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
- dob-react simple example
- dob-react hackernews
- dob-react todoMVC
- dob-react complex online web editor
- dob-redux todoMVC
Ecosystem
- dob-react - Connect dob to react! Here is a basic demo, and here is a demo with fractal. Quick start.
- dob-react-devtools - Devtools for dob-react, with action and ui two way binding.
- dob-redux - You can use both dob and Redux by using it! Enjoy the type and convenience of dob, and the ecology of Redux.
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;