Я создаю приложение React + Reflux, которое, помимо прочего, позволяет создавать/удалять/редактировать категории. Пока я могу отображать все категории и обрабатывать создание/удаление категорий в компоненте React через связанные магазины и действия. Все это отлично работает, обновляет базу данных и повторно отображает компонент, как ожидалось. Моя точка приклеивания заключается в том, чтобы попытаться перейти к определенной существующей категории, чтобы ее отредактировать.React + Reflux: Передача переменных в хранилища данных
I думаю Мне нужно передать идентификатор категории в хранилище, который затем передаст его в запрос php/Если я вообще обойду магазин и поставлю вызов ajax внутри самого компонента, я смогу заставить его работать с параметром url с помощью React-router (без автоматического повторного рендеринга, конечно), но я не смог выяснить как это сделать через магазин.
Другими словами, это более или менее работает:
- «ManageCategories» Реагировать компонент, который использует CategoryStore перечислить все категории каждый завернутые в якорной тег, который передает идентификатор категории вместе с «ManageCategory» маршрут/компонент
- «ManageCategory» компонент использует категорию Id паров непосредственно в Ajax вызова в его методе getInitialState отображать данные, относящиеся к категории
Однако, я думаю, что ниже является более правильным рефлюксом в у сделать это, но я не знаю, как заставить его работать:
- «ManageCategories» компонент же, как и выше
- «ManageCategory» компонент, который каким-то образом передает его идентификатор категории параметров в CategoryStore (или, может быть, другой «IndividualCategoryStore»?), которая возвращает только данные, относящиеся к этой категории и обрабатывает обновления/редактирует к этой категории
Я был в состоянии получить вид неуклюжей версии этой работы, добавив новый метод ("getCategoryData ») в CategoryStore, который вызывается в методе getInitialState компонента« ManageCategory »и передается категоризация ryId param. Это приводит к появлению вспышки всех категорий (из getDefaultData в CategoryStore), за которой следует правильный список отдельных категорий (из getInitialState компонента).
Я чувствую себя довольно комфортно с концепциями, лежащими в основе React + Reflux, но на данный момент я думаю, что, вероятно, я не понимаю что-то фундаментальное. Работала над этой конкретной проблемой более недели, но ни один из примеров/учебников/документов, которые я нашел, не адресует конкретный вопрос о передаче переменной в хранилище данных.
Действия:
var Actions = Reflux.createActions([
"createCategory",
"deleteCategory",
"editCategory"
]);
CategoryStore:
var CategoryStore = Reflux.createStore({
listenables: [Actions],
onCreateCategory: function(catName) {
// ajax call to create new category that calls updateCategories on success
},
onDeleteCategory: function(catId) {
// ajax call to delete category that calls updateCategories on success
},
updateCategories: function(){
$.ajax({
url: url + '?action=getAllCategories',
async: false,
dataType: 'json',
success: function(categoryData) {
this.categories = categoryData;
}.bind(this),
error: function(xhr, status, err) {
console.error(url, status, err.toString());
}.bind(this)
});
this.trigger(this.categories);
},
getDefaultData: function() {
$.ajax({
url: url + '?action=getAllCategories',
async: false,
dataType: 'json',
success: function(categoryData) {
this.categories = categoryData;
}.bind(this),
error: function(xhr, status, err) {
console.error(url, status, err.toString());
}.bind(this)
});
return this.categories;
}
});
Категория Компонент:
var Category = React.createClass({
handleDeleteCategory: function() {
Actions.deleteCategory(this.props.id);
},
render: function() {
return (
<li className="category">
<IconButton icon="action-highlight-remove" onClick={this.handleDeleteCategory} />
<h5><a href={"/#/manage-category/" + this.props.id}>{this.props.name} ({this.props.id})</a></h5>
</li>
);
}
});
ManageCategories Компонент:
var ManageCategories = React.createClass({
mixins: [
Reflux.connect(CategoryStore, "categories")
],
getInitialState: function() {
return {
categories: []
};
},
handleCreateCategory: function() {
// category creation code
},
render: function() {
var categoryNodes = this.state.categories.map(function(category) {
return (
<Category name={category.name} id={category.id} />
)
});
return (
<div className="dev-tools-container">
<h1>Developer Tools</h1>
<div className="categories">
<h3>Categories</h3>
<ul>
{categoryNodes}
</ul>
<h4>Create New Category:</h4>
<form>
<label htmlFor="new-category-name">Category Name</label> <input type="text" id="new-category-name" /><br />
<PaperButton label="Create" primary={true} onClick={this.handleCreateCategory} />
</form>
</div>
</div>
);
}
});
Заранее благодарим за понимание или помощь.
Эти манипуляции с данными кажутся неуместными внутри компонента. Вы можете разгрузить эту ответственность в хранилище, и ваш компонент запускает действие с данным 'catId'. В хранилище может использоваться «catId» для извлечения данных, которые ваш компонент будет обрабатывать на основе ... тогда ваш код компонента не будет столь тесно связан с форматом данных. –
Или, может быть, даже просто вспомогательный метод в вашем магазине, чтобы получить эти данные для вас. Похоже, вы хотите поместить буфер между маршрутизатором и представлениями вашего контроллера, чтобы вы могли справиться с этим манипулированием данными, потому что вам нужно будет делать такие вещи для каждой страницы/просмотра контроллера в приложении. –
Но что, если разные компоненты ожидают данные по-другому из магазина? Я думаю, что это очень плохой дизайн. –