【问题标题】:Using Redux to display a notification in response to a network request使用 Redux 显示通知以响应网络请求
【发布时间】:2018-08-18 00:28:51
【问题描述】:

我的 Web 应用程序使用 React、Redux 和 UIKit。 它由屏幕 A 和 B 组成。

屏幕 A 包含一个按钮 - 按下该按钮后 - 将发送异步网络请求以将一些数据发布到服务器。

如果用户在服务器返回响应之前一直停留在屏幕 A 上,他们将收到有关请求是否成功的确认信息。

我使用 React 和 Redux 实现这一点的方式是拥有一个负责显示确认横幅的组件。这个组件监听我的 Redux 存储中名为 postStatus 的状态的变化。当用户单击按钮时,可能会分派 3 个状态为 PENDINGSUCCESSERROR 的 Redux 操作。在它们被调度之后 - 它们被减速器捕获,相应地改变 postStatus 状态。然后,此状态会映射到我的组件属性并重新渲染以显示相关横幅。

但是,如果用户在从服务器返回响应并导航到屏幕 B 之前没有停留在屏幕 A 上 - 我希望显示 notification,以便用户仍然知道请求的状态.

我的问题是,实现这种行为最明智的方法是什么?

我能想到以下几点:

  1. 创建一个实际上不渲染任何东西的反应组件——它只是监听postState 和一些额外的状态,代表用户在哪个屏幕上。实现 componentWillReceiveProps react 生命周期方法,如果 postStateSUCCESSERROR 并且其他状态表示用户不在屏幕 A 上 - 然后调用 UIKit.notify() 以显示通知。
  2. 如果用户不在屏幕 A 上,则在调度 SUCCESSERROR 操作时调用 UIKit.notify()
  3. 如果用户不在屏幕 A 上,则在调度 SUCCESSERROR 操作后减少状态时调用 UIKit.notify()

很可能还有很多其他解决方案,所以我很想听听一些。

【问题讨论】:

  • 方法1似乎更好!
  • 我同意方法 1。更好地处理组件中的所有 UI 渲染,无论它们是否在 render() 上返回 html。
  • 是的,但是经过一些研究,我发现不渲染任何东西的 React 组件可以被认为是对 React 库的滥用,所以我不确定是否使用方法 1...

标签: reactjs redux getuikit


【解决方案1】:

我知道我迟到了,但我自己偶然发现了这个,所以这就是我所做的。

我的看法是临时通知是应用程序的副作用。 在我的项目中,我使用redux-saga,但您可以使用任何其他副作用库来实现这一点。

代码(以删除用户为例):

...
function* deleteUserSuccess(action) {
    yield call(message.success, 'Successful deletion!');
}

const watchDeleteUserSuccess = function* () {
    yield takeEvery(types.DELETE_USER_SUCCESS, deleteUserSuccess);
}
...

优点:可读且有效。

缺点:我看到的唯一缺点是您让您的 sagas 了解您的 UI 库。但是您可以将其包装在单独的函数/文件/模块中以从中抽象出 saga。

【讨论】:

    猜你喜欢
    • 2016-12-01
    • 2016-11-01
    • 1970-01-01
    • 2015-06-08
    • 2020-12-18
    • 1970-01-01
    • 2018-08-01
    • 2021-10-26
    • 2018-04-23
    相关资源
    最近更新 更多