Я пытаюсь настроить архитектуру проекта с использованием MobX и React, и мне было интересно, будет ли выполнение следующих действий считаться «неплохим». Я не хочу, чтобы этот вопрос превратился в другой: «это вопрос личных предпочтений, поэтому этот вопрос здесь не к месту ... Мы все можем согласиться с тем, что некоторые вещи действительно плохие.
Итак, я думаю о том, чтобы иметь только один Store.js
файл, который выглядит примерно так:
import { observable, action, useStrict } from 'mobx';
useStrict(true);
export const state = observable({
title: ''
});
export const actions = {
setTitle: action((title) => {
state.title = title;
})
};
Примечание: все состояние приложения будет в state
, будет только одно хранилище.
Затем я использую state
в моем корневом компоненте, также известном как App.js
, вот так:
import React, { Component } from 'react';
import { observer } from 'mobx-react';
import { state } from './Store';
import DisplayTitle from './components/DisplayTitle/DisplayTitle';
import SetTitle from './components/SetTitle/SetTitle';
class App extends Component {
render() {
return (
<div className="App">
<DisplayTitle title={state.title}/>
<SetTitle />
</div>
);
}
}
export default observer(App);
Очевидно, что в моем приложении будет целая куча компонентов, но ни один из компонентов никогда не будет читать state
напрямую из Store.js
. Только мой App.js
будет импортировать состояние и передавать его по дереву компонентов.
Еще одно замечание: я больше не уверен, почему другие компоненты не могут считывать состояние напрямую из _10 _...
Так обстоит дело с компонентом DisplayTitle
:
import React, { Component } from 'react';
class DisplayTitle extends Component {
render () {
return (
<h1>{this.props.title}</h1>
);
}
}
export default DisplayTitle;
Но, несмотря на то, что никакие другие компоненты не могут напрямую импортировать state
(кроме App.js
), любой компонент может импортировать actions
из Store.js
, чтобы изменить state
.
Например, в компоненте SetTitle
:
import React, { Component } from 'react';
import { actions } from './../../Store';
class SetTitle extends Component {
updateTitle (e) {
actions.setTitle(e.currentTarget.value);
}
render () {
return (
<input onChange={this.updateTitle} type='text'/>
);
}
}
export default SetTitle;
Есть ли какие-либо недостатки или другие очевидные причины, по которым этот подход не лучший вариант? Я хотел бы получить любую обратную связь!