在 React.js 应用程序中,API 调用在商店中失败,我如何将其传回视图?

In a React.js app, an API calls fails in the store, how do I transmit that back to the view?

https://cask.scotch.io/2014/10/V70cSEC.png

^ 根据这个流程,我必须在商店中进行更改,然后由视图拾取。

更具体地说,我正在尝试删除一个用户,但是当商店从数据库中收到错误时,我想显示一个模式来说明发生了错误。传输消息的正确方法是通过存储变量完成,然后在 getStateFromFlux 方法的视图中获取吗?

userStore = {
initialize: function(options) {
    // other variables
    this.userDeletionError = false;
},
deleteUser: function(payload) {
    Axios.delete(DBURL)
      .then((response) => {
        // succeeds
      })
      .catch((error) => {
        // other error handling
        this.userDeletionError = true;
      });
  }
}

如果我很清楚您在商店中使用 ajax 调用,那么这是一种反模式。正确的做法是在操作文件中调用,然后在商店中传输。

要回答您的问题,通量模式应该是这样的(不确定它是否与您的用例 100% 匹配)。

  1. 查看 => 用户想要删除一个 'user',他点击了删除按钮
  2. 查看触发操作。
  3. 操作触发 ajax 调用 'delete this user'
  4. Action 接收答案并将其传输到 store(这里您使用的是 react dispatcher,示例如下:

    MyAjaxCall.then(function(answer) {  
        Dispatcher.handleViewAction({
            actionType: Constants.ActionTypes.DELETE_USER,
            result: answer
        });
    });
    

5.Your 商店仍在通过调度程序捕获 ajax 答案(以下示例:

MyStore.dispatcherIndex = Dispatcher.register(function(payload) {
    var action = payload.action;
    var result;

    switch(action.actionType) {
         case Constants.ActionTypes.USER_DELETE:    
            registerAnswer(action.result);
            MyStore.emitChange();       
            break;
    }
    return true;
});
  1. 你可以看到你的商店会触发registerAnswer(),在这个函数中你可以检查ajax调用是否已经执行(我的意思是用户是否被删除)和相应地构建对象。这里有两种方法可以告诉您关于答案状态的视图 1. 例如,您构建一个带有字段消息的 dataAnswer 对象,然后您的视图可以检查它 2. 您发出一个特殊事件。 如果觉得第一种方式更通用,我更喜欢它。

  2. 存储 emitChange 并且您的视图捕获事件(以下示例:

    componentDidMount: function() {
        MyStore.addChangeListener(address, this._onDeleteUser;
    },
    
  3. 然后你的视图根据答案检查你在商店中填写的'message'字段,你可以渲染任何合适的东西。

我希望一切都清楚。这是商店的示例,以备不时之需。 https://facebook.github.io/flux/docs/todo-list.html#creating-stores

要恢复,除了在商店中进行 ajax 调用外,您的方法很好。不要那样做真的很糟糕。 希望对你有帮助