网站搜索

reactjs - 在 MobX 中如何从 StoreA 中引用 StoreB 的可观察对象


我只想将 StoreA 的一个 observable 传递给 StoreB,而不传递整个 StoreA。

这里有一个例子,我在 TodoStore 的构造函数中传入了来自 UserStore 的 user 可观察对象,但显然当我改变该可观察对象时,它不会更新。

所以问题是如何以最干净、最简短的方式来做,而不传递完整的 UserStore 引用?

import * as React from "react";
import { render } from "react-dom";
import { observer } from "mobx-react";
import { observable, computed, action } from "mobx";

export class TodoStore {
  @observable public todos: string[] = [ "default" ];
  private user:string;

  constructor(user:string) {
    this.user = user;
  }

  @action.bound
  public addTodo = (todo: string) => {
    this.todos.push(this.user + ": " + todo);
  };
}

export class UserStore {
  @observable public user: string = "zubi";

  @action.bound
  public change = (name: string) => {
    this.user = name;
  };
}

var userStore = new UserStore();
var todoStore = new TodoStore(userStore.user);

@observer
class App extends React.PureComponent {
  public render() {
    return (
      <div>
        <button onClick={e => {todoStore.addTodo("hello" + Math.floor(Math.random() * 1000));}}>
          add message
        </button>
        <button onClick={e => { userStore.change("Eve" + Math.floor(Math.random() * 100),);}}>
          change name
        </button>
        <div>
          {todoStore.todos.map(todo => { return <div key={todo}>{todo}</div>;})}
        </div>
      </div>
    );
  }
}

render(<App />, document.getElementById("root"));

您可以在这里查看完整代码:https://codesandbox.io/s/mobx-test-zubi-pf1qn

非常感谢!

答案#1

到目前为止,我发现最简单的方法大概是这样的:

export class TodoStore {

  @computed get user(): string {return this._user()};

  constructor(private _user: () => string) { }

  // ...

}

// ...

var todoStore = new TodoStore( () => userStore.user );

// ...

答案#2

这是一个好决定,来自 mobx 文档的推荐