У меня есть приложение со многими объектами, которые запрашиваются из API. Я хочу добавить общий способ для получения любой сущности, потому что мне не нужно будет создавать сотни файлов, также я могу сделать некоторые общие компоненты (например, таблица, которая показывает значения сущности). Какая была бы лучшая практика? что в redux или, возможно, для этого есть несколько пакетов npm. Чтобы было ясно, я расскажу, как я это сделал в потоке:
мой общий магазин:
var Api = require('../utils/api');
var Reflux = require('reflux');
var Actions = require('../actions');
module.exports = Reflux.createStore({
listenables: [Actions],
getEntities: function (entityName) {
var url = "api/generic/" + entityName;
return Api.get(url)
.then(function (json) {
this.triggerChange(entityName, json);
}.bind(this));
},
triggerChange: function (entityName, json) {
this.trigger('change', {entity: entityName, value: json});
},
updateEntity: function (body, entityName) {
var url = "api/generic/" + entityName + "/edit";
return Api.post(url, body)
.then(function (json) {
this.getEntities(entityName);
}.bind(this)).catch(this.getEntities(entityName));
},
deleteEntity: function (id, entityName) {
var url = "api/generic/" + entityName + "/" + id;
return Api.delete(url)
.then(function (json) {
this.getEntities(entityName);
}.bind(this)).catch(this.getEntities(entityName));
}
});
And my listener:
onChangeEntities: function (event, result) {
if (event == "change"){
var entityName = result.entity;
var setState = this.setState;
var dataContext = this.state.dataContext;
var arr = [];
dataContext.map(function (element) {
arr.push(element);
});
var state = this.state;
Entities.map(function (entity) {
if (entity.name == entityName)
{
if (dataContext.filter(function (entity) {
return entity.entityName && entity.entityName == entityName;
}).length == 0)
{
arr.push({entityName: entityName, value: result.value});
}
else{
var entity = dataContext.filter(function (entity) {
return entity.name && entity.name == entityName;
})[0];
var keys = Object.keys(dataContext);
keys.map(function (key) {
if (dataContext[key].entityName == entityName)
{
arr.splice(key, 1);
}
});
arr.push({entityName: entityName, value: result.value});
}
}
});
this.setState({dataContext: arr});
}
Вам нужно написать собственное промежуточное программное обеспечение, чтобы упростить выборку данных из api.
Этот подход описан в реальном примере из редукционного репо.
Или вы можете использовать пакет redux-api-middleware.