使用 React、Redux 和 TypeScript 来更短地实现 mapDispatchToProps 的方法?

2024-02-26

我正在尝试找出一起使用 React、Redux 和 TypeScript 时如何减少样板文件的数量。在这种情况下你可能不能,但想看看是否有人有想法。

我目前有一个组件,它调度一个切换菜单的操作,在显示和隐藏菜单之间交替。为此,我定义了我的类,如下所示(省略与状态相关的代码,重点关注操作的调度):

import {Action, toggleMenu} from "../../actions/index";    

interface IConnectedDispatch {
  toggleMenu: (isActive: boolean) => Action;
}

class HeaderMenu extends React.Component<IOwnProps & IConnectedState & IConnectedDispatch, any> {

  constructor(props: IOwnProps & IConnectedState & IConnectedDispatch) {
    super(props);
    this.toggleMenuState = this.toggleMenuState.bind(this);
  }

  public render() {        
    return (
      <button className={buttonClass} onClick={this.props.toggleMenu(this.props.isActive)} type="button">
      </button>
    );
  }
}

const mapDispatchToProps = (dispatch: redux.Dispatch<Store.All>): IConnectedDispatch => ({
  toggleMenu: (isActive: boolean) => dispatch(toggleMenu(isActive))});

该动作定义为

export function toggleMenu(isActive: boolean): Dispatch<Action> {
  return (dispatch: Dispatch<Action>) => {
    dispatch({
      isActive,
      type: "TOGGLE_MENU",
    });
  };
}

感觉应该可以减少实现我的目标所需的代码量。作为 React、Redux 和 TypeScript 的新手,我无法确切地了解如何做到这一点。具体来说,一遍又一遍地写动作名称、toggleMenu,感觉非常重复。例如本部分两次:

const mapDispatchToProps = (dispatch: redux.Dispatch<Store.All>): IConnectedDispatch => ({
  toggleMenu: (isActive: boolean) => dispatch(toggleMenu(isActive))});

任何建议表示赞赏!


有一个更短的方法。您可以简化很多代码。

动作 - 原创

export function toggleMenu(isActive: boolean): Dispatch<Action> {
  return (dispatch: Dispatch<Action>) => {
    dispatch({
      isActive,
      type: "TOGGLE_MENU",
    });
  };
}

行动 - 减少

export const toggleMenu = (isActive: boolean) => ({
  isActive,
  type: "TOGGLE_MENU"
})

属性界面 - 原始

interface IConnectedDispatch {
  toggleMenu: (isActive: boolean) => Action;
}

属性接口 - 简化

import { toggleMenu } from "./actions"
interface IConnectedDispatch {
  toggleMenu: typeof toggleMenu
}

MapDispatch - 原始

const mapDispatchToProps = (dispatch: redux.Dispatch<Store.All>): IConnectedDispatch => ({
  toggleMenu: (isActive: boolean) => dispatch(toggleMenu(isActive))});

MapDispatch - 减少

const mapDispatchToProps = { 
  toggleMenu 
};

我可以推荐这个图书馆typescript-fsa https://github.com/aikoven/typescript-fsa。它有助于减少由操作(尤其是异步操作)创建的大量样板。

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

使用 React、Redux 和 TypeScript 来更短地实现 mapDispatchToProps 的方法? 的相关文章

随机推荐

  • 在其模板中使用 Angular Directive 属性

    如何在指令中使用属性的值 我的元素如下所示 div class tooltip icon div 我想在我的指令模板中使用它 如下所示 mainApp directive myTooltip function allowed event l
  • 重复文本查找

    我的主要问题是试图找到一个合适的解决方案来自动转动这个 例如 d c d f d c d f d c d f d c d f 进入这个 d c d f 4 即查找彼此相邻的重复项 然后从这些重复项中制作一个较短的 循环 目前我还没有找到合适
  • 在python中评估Xpath2.0

    我有一个 XPath 表达式 如下所示 if replace p 1 text H h hello then p 1 text else if p 1 text world then p 2 text else notFound 我想显示哪
  • 这2个背包算法一样吗? (他们总是输出相同的东西吗)

    在我的代码中 假设C是容量 N是物品数量 w j 是物品j的重量 v j 是物品j的值 它与0 做同样的事情吗 1 背包算法 我一直在一些数据集上尝试我的代码 情况似乎确实如此 我想知道这一点的原因是因为我们学过的 0 1 背包算法是二维的
  • 使用串扰将多个图表与同一张表连接起来而不会相互影响

    我在下面创建了 Flexdashboard 最初在其中创建了四个数据框 然后其中三个数据帧显示为图表 dcross2 store supplier 和一个 dcross1 如表 我想要实现的是将所有这四个对象连接在一起crosstalk封装
  • 为什么在 T-SQL 中执行循环如此困难

    好的 我知道可以做到 我经常这样做 但是为什么在 T SQL 中做循环这么难 我可以想到很多原因 我想要解析查询结果集并做一些没有循环就无法完成的事情 但设置和执行循环的代码超过 20 行 我确信其他人也有类似的观点 那么为什么我们仍然没有
  • 格式化 XML 的十进制值

    我目前遇到一个问题 我们连接的系统期望接收 XML 其中包含三个格式化为小数点后一位的双精度字段 就我个人而言 我认为我们的系统应该能够以默认格式发送值 然后由其他系统根据需要格式化自己的表示形式 但可惜这似乎不是一个选项 我的基于 Jav
  • 当各个函数返回 inf 值时估计两个 gamma 函数的比率

    我正在估计两个伽玛函数的比率 两者的估计gamma x and gamma y 非常大 gt 10 300 但两者的比例应该相当小 from scipy special import gamma gamma x gamma y 不幸的是 有
  • C++ 正则表达式:哪个组匹配?

    我有一个正则表达式 其中包含通过 or 条件连接的各种子组 alpha digit 当我匹配字符串时1 a 2 我得到三个匹配项 1 a and 2 C 中有没有办法确定哪些子模式匹配 不直接 与std regex图书馆 匹配结果类负责子比
  • memcached 中的最大密钥长度和最大值大小是多少?

    我正在使用最新的 memcached 我可以知道最大密钥长度是多少 以及我们可以存储在 memcached 中的值的最大大小吗 如何将memcached与spring集成 有什么想法吗 如果你看一下source https github c
  • 参数字典包含不可为空类型的参数“id”的空条目

    我正在尝试通过以下方式从我的数据库检索数据id我的默认路由中的参数 routes MapRoute Default Route name controller action id URL with parameters new contro
  • 使用 SSL 联系 Active Directory

    我有一种根据 Active Directory 验证用户凭据的方法 我想将此方法与 SSL 结合使用 但无法使其工作 主要问题是我有一台服务器位于我们的网络之外 它称为 DMZ 吗 从那里我想联系我的活动目录 这就是我想使用 SSL 的原因
  • 导入 android.support 无法解决[重复]

    这个问题在这里已经有答案了 我收到一条错误消息 无法在该行解析 import android support import android support v4 app NotificationCompat 有没有人以前见过这个或者知道我能
  • MYSQL - 检索日期之间的时间戳

    All 我有一个 MYSQL 表 其中有一列称为时间戳 它是属于DATETIME数据类型 具有诸如 10 1 2009 3 25 08 PM 10 1 2009 3 30 05 PM 10 4 2009 3 40 01 PM 等值 我想编写
  • 使用选项“ -Xinject-code -extension ”插入 XJC+xsd+jxb 代码

    我正在尝试使用扩展程序 Xinject 代码 of xjc将一些代码添加到我生成的类中 对于以下简单的 xsd 架构
  • Pandas Dataframes.to_csv 截断长值

    Problem 我正在尝试在 python 中使用 Pandas 数据框存储大数据集 我的问题是 当我尝试将其保存到 csv 时 我的数据块被截断 如下所示 e 12 and 值1 值2 值3 值1853 值1854 解释 我需要将大量数据
  • C++/SQLite只输出一行数据

    我遇到一个问题 即我的 5 个测试行中只有一个会以 C 输出 我的代码是 include
  • Spring REST 模板 POST

    我正在使用 Spring 框架并尝试执行发布请求 我的 post 方法采用 url HttpMethod 和进入请求正文的参数 注意 network POSTRequest URL 中传递的 var URL 对于每次调用都是不同的 现在 如
  • 如何在 Kubernetes 中创建 post-init 容器?

    我正在尝试在 K8s 上创建一个 redis 集群 我需要一个 sidecar 容器来在所需数量的 redis 容器上线后创建集群 我有2个容器 redis和一辆边车 我正在运行它们statefulset有 6 个副本 我需要边车容器为每个
  • 使用 React、Redux 和 TypeScript 来更短地实现 mapDispatchToProps 的方法?

    我正在尝试找出一起使用 React Redux 和 TypeScript 时如何减少样板文件的数量 在这种情况下你可能不能 但想看看是否有人有想法 我目前有一个组件 它调度一个切换菜单的操作 在显示和隐藏菜单之间交替 为此 我定义了我的类