【问题标题】:Redux generic reducerRedux 通用减速器
【发布时间】:2016-04-15 12:34:03
【问题描述】:

我有一个应用程序,其中包含许多从 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});
    }

【问题讨论】:

    标签: reactjs redux react-redux


    【解决方案1】:

    您需要编写一个自定义中间件来简化从 api 获取数据的过程。
    这种方法在 redux repo 的 real-world 示例中进行了描述。
    或者你可以使用redux-api-middleware 包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多