Я использую React с mobx для обработки состояния приложения.
Я использую компоненты дампа, которые изменяют данные через внешнее хранилище (вызов ajax, фильтр или массив карт и т.д. ...)
Вместо этого в формах, когда вам приходится обрабатывать изменение ввода с помощью события onChange, в настоящее время я использую наблюдаемые и действия внутри самого компонента.
Это плохая практика?Или я должен поместить все действия и наблюдаемые данные во внешнее состояние?
Если вместо этого эта практика приемлема, как я могу обратиться к случаю, когда мне нужно сбросить локальное наблюдаемое состояние (например, ввод текста)в ответ на действие вызова ajax, выполненное во внешнем хранилище?Могу ли я использовать обратный вызов в хранилище действий, чтобы передать управление действию внутри компонента, как в следующем примере:
import React from 'react';
import { observer, inject } from "mobx-react";
import { observable, action } from "mobx";
@inject("rootStore")
@observer
class ContactForm extends React.Component {
constructor(props) {
super(props);
this.externaStore = this.props.rootStore.contactStore
this.onChangeInput = this.onChangeInput.bind(this)
}
@observable text = ''
@action
onChangeInput(event) {
this.text = event.target.value
}
@action
resetForm() {
this.text = ''
}
render() {
return (
<form>
<div className="form-group">
<label htmlFor="input-text" className="control-label">Text input:
</label>
<input onChange={this.onChangeInput} type="text" value={this.text} id="input-text" name="input-text" className="form-control" />
</div>
<button onClick={() => this.externaStore.submitForm(this.text, this.resetForm)} className="btn btn-danger btn-xs" type="button" title="Aggiungi">
<i className="fa fa-save"></i> Aggiungi
</button>
</form>
)
}
}
class ExternalStore {
constructor(rootStore) {
this.rootStore = rootStore
this.service = rootStore.service
}
@observable textList = []
@action
submitForm(text, cb) {
this.service.doAjax('POST', '/api/text', JSON.stringify(text)).then(data => {
this.textList.push(text)
cb()
})
}
}
Есть ли еще один лучший метод для обработки подобных случаев?