Redux:与 DOM 交互的位置,由操作触发,但在 React 应用程序之外发生变化

Posted

技术标签:

【中文标题】Redux:与 DOM 交互的位置,由操作触发,但在 React 应用程序之外发生变化【英文标题】:Redux: where to place interaction with the DOM, that is triggered by an action but changes outside of the React app 【发布时间】:2016-10-26 09:16:39 【问题描述】:

我有一个 React/Redux 应用程序,它负责处理实时销售(拍卖)的交互式项目列表。我的<div id='app'></div> 只负责列表。

问题是何时出售商品,我需要将其添加到另一个列表中,该列表不在 React 应用程序中。由于列表是在服务器上呈现的,唯一需要的交互就是添加那些已售出的物品。

现在我正在做这样的事情

// redux thunk action
export const sellItem = (item) => (dispatch) => 
  dispatch(requestSellItem(item)); // set loading state

  return fetch('api/sell_item/' + item.id)
    .then(response => response.json())
    .then(json => 
      // remove the item from the React list
      dispatch(sellItemSuccess(item.id));
      // append the item to the sold items list
      // this is the function that puts the sold item in the 
      // list outside of the React app
      appendSoldItem(item);
    )
    .catch(err => 
      // do fallback here
      dispatch(sellItemError(err));
    );
;

我想知道这是否是正确的地方,还是应该把它放在其他地方?

【问题讨论】:

【参考方案1】:

如果您没有设想可以在不“将商品添加到另一个列表”的情况下销售商品的场景,那么这是完全可以接受的。如果没有,您可能希望通过通知外部服务来decouple 出售物品的行为。

无论如何,由于我们正在处理外部服务,我想说这是middleware layer 的完美示例。这是一个例子:

import  ITEM_SOLD_SUCCESS  from ... // Import same action created by sellItemSuccess()

let itemSoldNotifier = store => next => action => 
  if (action.type === ITEM_SOLD_SUCCESS) 
    // Notify the external service that the item was sold
    appendSoldItem(action.item); // Assuming that the action contains the item sold itself
  
  return next(action);

以下是在商店中应用该层的方法:

let store = createStore(
  combineReducers(reducers),
  applyMiddleware(
    itemSoldNotifier
  )
)

【讨论】:

redux-saga 也是处理这个问题的好地方(但它实际上也是一个中间件)

以上是关于Redux:与 DOM 交互的位置,由操作触发,但在 React 应用程序之外发生变化的主要内容,如果未能解决你的问题,请参考以下文章

在 React / Redux 中了解 UI 何时准备就绪

Redux与前端表格施展“组合拳”,实现大屏展示应用的交互增强

Redux与前端表格施展“组合拳”,实现大屏展示应用的交互增强

使用 react-router-dom v4 在 redux 操作中重定向

JavaScript&jQuery.DOM事件

Redux动作已触发,但无法导航(React-Navigation)