Этот ответ может быть самоуверенным, но может косвенно помочь сообществу.После долгих исследований я увидел следующие подходы, используемые на практике многими.Общие методы Иметь корневое хранилище, которое может выступать в качестве канала связи между магазинами.
Вопрос 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
}
Подход 2:
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
изменилась, если изменилась определенная переменная в AuthStore
.Используйте Computed
.Этот подход является общим для обоих вышеуказанных подходов
AuthStore.js
export class AuthStore {
constructor(rootStore) {
this.rootStore = rootStore
@computed get dependentVariable() {
return this.rootStore.userStore.changeableUserVariable;
}
}
}
Надеюсь, это поможет сообществу.Для более подробного обсуждения вы можете обратиться к проблеме , поднятой мной на Github