当前位置: 首页 > 面试题库 >

使用mobx创建多个商店并将其注入到组件的正确方法-ReactJs

弓磊
2023-03-14
问题内容

如Mobx 文档中的建议,我以以下方式创建了多个商店:

class bankAccountStore {
  constructor(rootStore){
    this.rootStore = rootStore;
  }
...

class authStore {
  constructor(rootStore){
    this.rootStore = rootStore;
  }
...

最后以以下方式 创建根存储
。另外,我更喜欢在master商店构造函数中构造子商店。此外,我发现有时我的子存储必须观察父存储的一些数据,因此我将其传递给子构造函数

class RootStore {
  constructor() {
    this.bankAccountStore = new bankAccountStore(this);
    this.authStore = new authStore(this);
  }
}

通过 以下方式 提供给应用程序

<Provider rootStore={new RootStore()}>
  <App />
</Provider>

然后像这样 注入组件

@inject('rootStore') 
@observer
class User extends React.Component{
  constructor(props) {
    super(props);
    //Accessing the individual store with the help of root store
    this.authStore = this.props.rootStore.authStore;
  }
}

即使它需要一部分根存储库,还是每次都将根存储库注入组件的正确有效的方法吗? 如果不是,如何将auth Store注入用户组件?

编辑:我已经做出了结束github讨论的答案。 答案中提供的讨论链接


问题答案:

这个答案可能是有道理的,但可以间接地帮助社区。
经过大量研究,我看到许多人在实践中使用以下方法。常规方法具有一个根存储,该根存储可以充当存储之间的通信通道。

问题1:如何组织商店并将其注入到组件中?

方法1:

App.js

// Root Store Declaration
class RootStore {
    constructor() {
      this.userStore = new UserStore(this);
      this.authStore = new AuthStore(this);
    }
}    
const rootStore = new RootStore()

// Provide the store to the children
<Provider 
    rootStore={rootStore}
    userStore={rootStore.userStore}
    authStore={rootStore.authStore}
>
  <App />
</Provider>

Component.js

// Injecting into the component and using it as shown below
@inject('authStore', 'userStore')
@observer
class User extends React.Component {
    // only this.props.userStore.userVariable
}

方法二:

App.js

class RootStore {
    constructor() {
      this.userStore = new UserStore(this);
      this.authStore = new AuthStore(this);
    }
} 
const rootStore = new RootStore()

<Provider rootStore={rootStore}>
  <App />
</Provider>

Component.js

// Injecting into the component and using it as shown below
@inject(stores => ({
    userStore: stores.userStore,
    authStore: stores.authStore,
    })
)
@observer
class User extends React.Component {
    // no this.props.rootStore.userStore,userVariable here, 
    // only this.props.userStore.userVariable
}

方法1和方法2除了语法差异外没有其他差异。好的!那是注射部分!

问题2:如何进行店间交流? (尽量避免)

现在,我知道一个好的设计可以使商店保持独立,并减少耦合。 但是以某种方式考虑一种情况,UserStore如果某个变量in AuthStore
发生变化,我希望变量in 发生变化。使用Computed。这两种方法都通用

AuthStore.js

export class AuthStore {    
    constructor(rootStore) {
        this.rootStore = rootStore
        @computed get dependentVariable() {
          return this.rootStore.userStore.changeableUserVariable;                                      
        }
    }
}

我希望这对社区有所帮助。有关更详细的讨论,您可以参考我在Github上提出的问题



 类似资料:
  • 嗨,我已经完成了hybris的初始设置,现在我看到了服装店。现在请你回答我应该如何进一步完全定制服装店网站。我想删除所有的产品,我想添加我自己的产品和类别。此外,我应该在哪里将apparelstore的URL更改为我自己的自定义URL?

  • 本文向大家介绍Powershell创建数组正确、更快的方法,包括了Powershell创建数组正确、更快的方法的使用技巧和注意事项,需要的朋友参考一下 通常当新的对象添加到一个数组中,根据经验你最担心其性能问题。下面第一个例子将告诉你一个错误的操作方法: 在这个循环中,这个数组通过符号“+=”增加了许多新的对象。这样做会需要很长时间,因为在你改变其大小时Powershell每次需要去创造一个新的数

  • 问题内容: 我正在学习有关Android应用程序开发的课程,并尝试创建xml文件并将其写入android的内部存储中。就方法而言,我在最初设置时遇到问题。我已经写了大部分,但有我无法弄清的错误。也许因为我整天都在工作,所以不知道。这是我本节课的代码。我遇到的错误是公共String宝藏和FileOutputStream上的非法修饰符。任何帮助,将不胜感激。 好的,我找出了最初的问题,需要使用try

  • 我有一个包含数百个csv文件的文件夹。每个文件都有日期作为它的名称,因为我的目录中的数据每天都在创建,例如2020-01-15.csv、2020-01-16.csv、2020-01-17.csv等。我正在寻找一个最好的方法来每天导入我的文件到mysql数据库中,并为每个文件创建表(不需要创建表,如果表的文件名已经存在)。 到目前为止,为了将文件导入到mysql数据库中,我使用了,但我当时使用它导入

  • 在这个项目中,我的目标是对一个有理数数组进行排序(我已经创建了一个允许这样做的有理数类)。要对数组进行排序,我必须为该类编写一个comareto方法(我的类扩展了可比较的接口)。但是当我检查我的comareto方法时,它总是返回一个0值。此外,当我创建一个有理数类元素数组时,程序只是在那个点上继续运行而没有输出任何结果。我不明白为什么?下面是我的代码,其中还包括方法和部分: 更新——此代码已修复C

  • 问题内容: 我想知道使用Node.js将大量插入Mongodb(尽管可能是任何其他数据库)的正确方法是什么 我以下面的代码为例,尽管我相信它是底层的,因为db.close()可以在所有异步collection.insert调用完成之前运行。 问题答案: 如果您的MongoDB服务器是2.6或更高版本,最好利用写命令 Bulk API 来执行大容量插入操作,这些操作只是服务器顶部的抽象,以便于构建大