监听 redux 动作

2024-05-14

我想创建一个可重用的 redux 表模块,它将存储和更新页码、显示的总页数等,我可以在所有页面之间共享这些模块。

但是,我需要更新操作来触发刷新数据操作,该操作将根据页面到达不同的端点。

因此,可能类似于页面特定的监听“RefreshData”操作,然后触发另一个操作。实现这一目标的最佳方法是什么?我目前正在使用 redux-thunk 作为我的中间件,但一直在寻找 redux-saga。

实现这一目标的最佳方法是什么?

** 澄清 **

我在多个页面/项目上有表格,我想尽量减少代码重复。我想我也许可以制作一个可删除的 redux 模块(操作 + 减速器),然后只需单独指定 REFRESH_DATA 操作的处理程序,这样我就不需要在这个文件中放置开关。我认为使用 redux-saga 我可以监听 REFRESH_DATA 操作并根据当前页面进行切换?或者有什么更好的建议。

export const ITEMS_PER_PAGE_UPDATED = 'ITEMS_PER_PAGE_UPDATED'
export const CURRENT_PAGE_UPDATED = 'CURRENT_PAGE_UPDATED'
export const REFRESH_DATA = 'REFRESHDATA'
export const DATA_REFRESHED = 'REFRESHDATA'

export function currentPageUpdated(value) {
    return function (dispatch) {
        dispatch({
            type: CURRENT_PAGE_UPDATED,
            value
        })
        dispatch({type:REFRESH_DATA})
    }
}

export function itemsPerPageUpdated(value) {
    return function (dispatch) {
        dispatch({
            type: ITEMS_PER_PAGE_UPDATED,
            value
        })
        dispatch({type:REFRESH_DATA})
    }
}

function reducer(state={ pageNumber:1, pageSize:10, totalItems:0, totalPages:1, sortColumn:null, sortAscending:true }, action) {
    switch(action.type) {
        case ITEMS_PER_PAGE_UPDATED:
            return Object.assign({}, state, {pageSize: action.value, pageNumber:1})
        case CURRENT_PAGE_UPDATED:
            return Object.assign({}, state, {pageNumber: action.value})
        case DATA_REFRESHED:
            return Object.assign({}, state, {totalPages: action.values.totalPages, totalItems:action.values.totalItems})
        default:
            return state
    }
}

export default reducer

如果我理解正确的话,听起来像是REFRESH_DATA动作主要是副作用,这意味着动作仅作为另一个动作的结果而被调度。如果是这种情况,那么我会说 redux saga 将是一个不错的选择,因为它可以坐在后台“监听”操作,然后触发其他操作。但是,您也许能够在定制方面走得更远中间件 http://redux.js.org/docs/advanced/Middleware.html.

使用自定义中间件,您可以在操作到达减速器之前拦截它们的调度。如果您要执行一系列与更新表和刷新数据相关的操作,那么为所有这些类型的操作创建一个通用的操作形状可能是有意义的,以便您的中间件可以侦听并分派它特殊的副作用行动。

一个简单的实现可能如下所示:

中间件/table.js

import fetchData from '../somewhere';
import { DATA_REFRESHED } from '../actions';

// Make a unique identifier that you're actions can send so you're
// middleware can intercept it
export const UPDATE_TABLE = Symbol('UPDATE_TABLE');

export default store => next => action => {
  const tableUpdate = action[UPDATE_TABLE];

  // If the action doesn't have the symbol identifier, just move on
  if (typeof tableUpdate === 'undefined') {
    return next(action);
  }

  // At this point, you know that the action that's been dispatched 
  // is one that involves updating the table, so you can do a fetch
  // for data

  // Get whatever data you need to fetch 
  const { id, type, data } = tableUpdate;

  // Dispatch the actual type of action to the store
  next({ type, data });

  // Go and fetch the data as a side-effect
  return fetchData(id)
    .then(response => next({ type: DATA_REFRESHED, data: response }));
}

动作.js

import { UPDATE_TABLE } from '../middleware/table.js';

// An action creator to dispatch the special table update action
// This is a simple example, but you'd probably want to be consistent
// about how the table update actions are shaped.  The middleware 
// should be able to pick out all of the data it needs to fetch data
// from whatever is sent with the action
function updateTable(action) {
    return {
        [UPDATE_TABLE]: action
    };
}

export function currentPageUpdated(value) {
    return updateTable({
        type: CURRENT_PAGE_UPDATE,
        value
    });
}

我从现实世界中汲取了很多例子:https://github.com/rackt/redux/blob/master/examples/real-world/middleware/api.js https://github.com/rackt/redux/blob/master/examples/real-world/middleware/api.js.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

监听 redux 动作 的相关文章

随机推荐

  • OSX/Mac 中的插件持久设置

    我无法找到在 Mac 上存储 Office js 加载项的持久设置的方法 在 Windows 上 localStorage 工作得非常完美 因为它可以保存关闭和打开 Word 时仍保留的设置 在 Mac 上 localStorage 不会持
  • Cordova - 启动后出现白屏,控制台中没有例外

    我已经离开我的 Cordova 应用程序一段时间了 但昨天刚刚进行了一次新的克隆 发现它出现了 死机白屏 症状 启动画面显示 程序加载 然后我就得到一个空白屏幕 更多细节 CLI 科尔多瓦 6 1 1 安卓 5 1 1 ios 4 1 1
  • 为什么 { } 初始化需要 Add 方法?

    要使用这样的初始化语法 var contacts new ContactList Dan email protected cdn cgi l email protection Eric email protected cdn cgi l e
  • 将对象的值插入到span标签中

    我有一个对象 message text Here is some text 我想将它插入到一个跨度标签中 如下所示 span message text span 这不会打印 这是一些文本 而是只会在网页上显示 message text 我怎
  • 虚拟回调接口

    在 Eclipse 为您创建的来自 Google 的示例主从流代码中 片段中包含以下内容 private Callbacks mCallbacks sDummyCallbacks public interface Callbacks pub
  • 连接数组时合并两个 yaml 文档

    我想合并两个 yaml 文档 结果包含 所有映射值 最后一个优先 串联数组 例如给定这个文件 file1 yml animals elephant donkey flavours sour lemon sweet chocolate str
  • 仅当环境变量具有特定值时如何设置 Apache 标头

    我想在我的 Apache 2 4 配置中设置标头 但前提是环境变量具有特定值 SetEnv ENV NAME prod 我如何仅在以下情况下设置此标头ENV NAME is not prod Header set X Robots Tag
  • 如何使用放心的方式在正文中发送 JsonObject 以进行 post 请求?

    我有一个使用 Google Gson 创建的 JsonObject JsonObject jsonObj gson fromJson response1 json JsonElement class getAsJsonObject 我还对现
  • 设置 IRQ 映射

    我正在遵循一些教程和参考文献来尝试设置我的内核 我在教程中遇到了一些不熟悉的代码 但根本没有解释它 这是我被告知映射的代码16 IRQs 0 15 到 ISR 地点32 47 void irq remap void outportb 0x2
  • 哪里可以找到可靠的 K-medoid(不是 k-means)开源软件/工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在学习 K medoids 算法 所以如果我提出不恰当的问题 我很抱歉 据我所知 K medoid
  • 我怎么知道我的所有 goroutine 确实正在使用 golang 的同步包等待一个条件

    我有一个应用程序 我正在创建多个 goroutine 来同时执行某个任务 所有工作协程都会等待条件 事件发生 一旦事件被触发 它们就会开始执行 创建完所有goroutines后 主线程在发送广播信号之前应该知道所有goroutines确实处
  • Paypal 付款标准默认输入卡详细信息

    我确信这个主题已经在这里了 但我刚刚与 Paypal 通电话 试图查明他们的帐户上是否有一个设置 可以让客户看到 输入卡详细信息区域 而不是自动 默认设置 引导您登录 注册您的 PayPal 帐户 Paypal 表示没有一个设置可以在他们这
  • 有很多数据库视图可以吗?

    我很少 每月 每季度 使用 Microsoft SQL Server 2005 数据库视图生成数百份 Crystal Reports 报告 在我不读取这些视图的所有时间里 这些视图是否会浪费 CPU 周期和 RAM 因为我很少从视图中读取数
  • IE 中的 Javascript 第 1 行语法错误 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有人能找出这个第 1 行语法错误是什么吗 我正在尝试在 IE6 和 IE7 中进行调试 但找不到问题的根源 http ci elfster
  • WF 和分层状态机

    搜索 bing 和 google 我发现了一些关于与 Windows 工作流程相关的状态图的信息 但令人惊讶的是很少 我得出的唯一明确的答案是 是的 它可以处理状态图 这里有一个教程 但我想确定的是 Does it support hier
  • 循环中的knitr模板和子文档

    圣诞节前我之前问过跨多个 knitr 文档的单一样式表 https stackoverflow com questions 20370584 single style sheet across multiple knitr document
  • 使用 R 读取和转换二进制原始数据

    我有一个file https drive google com file d 0BxMpk0nhnJy6SFhxd2xuMzJYYlk edit usp sharing其中包含原始 二进制数据和 ascii 它包含一个时间戳和一个代表速度的
  • 如何使用特定版本的NPM?

    如何切换我正在使用的 npm 版本 现在 npm v 1 1 65 但我需要 1 0 x 我尝试过 但出现错误 npm version 1 0 npm ERR version No package json found 有人知道如何使用不同
  • C 静态代码分析器

    您使用哪种静态代码分析器 如果有 我一直在 Python 中使用 PyLint 我对它非常满意 现在我需要类似的 C 代码 为了正常的日常使用 您需要抑制多少输出 维基百科维护着一个静态代码分析工具列表 http en wikipedia
  • 监听 redux 动作

    我想创建一个可重用的 redux 表模块 它将存储和更新页码 显示的总页数等 我可以在所有页面之间共享这些模块 但是 我需要更新操作来触发刷新数据操作 该操作将根据页面到达不同的端点 因此 可能类似于页面特定的监听 RefreshData