为什么要使用导出的常量设置redux动作类型?

时间:2019-06-03 06:31:41

标签: javascript reactjs redux react-redux

我正在尝试学习对redux的反应,我已经阅读了redux的主要文档,我们应该将动作类型存储到一个js文件中,然后导出所有常量并将其用作类型,例如,它是简单模式:

export function itemsAction(items) {
    return {
        type: 'ITEMS',
        data: items
    }
}

但是显然我应该采用这种格式:

import { types } from './Types';

export function itemsAction(items) {
    return {
        type: types.ITEMS,
        data: items
    }
}

但是这个技巧的主要好处是什么?操作是固定的,永远不会改变,为什么我应该从变量设置操作类型并导入所有类型?

谢谢

3 个答案:

答案 0 :(得分:6)

因为很高兴知道您使用的是对象属性而不是原始字符串,因为原始字符串容易出现错字。举个例子:

export function itemsAction(items) {
    return {
        type: 'ITEMS',
        data: items
    }
}

现在让我们说我有一个reducer来处理也使用原始字符串的动作:

const todos = (state = [], action) => {
  switch (action.type) {
    case 'ITESM':
      return state.map(item => item.something = "potato")
    default:
      return state
  }
}

在化简器中,我针对其大小写拼写错误。但是由于Javascript和Redux的工作方式,它不会在IDE lint中作为错误被注意到,在执行代码时也不会产生任何错误。您将分派该操作,它将以静默方式失败。什么都不会发生,没有行动,没有错误,什么也没有。调试起来很痛苦。

此外,如果要更改动作名称该怎么办。最好只是更改对象中的值,而不是在整个项目中进行较大的查找和替换,以免您覆盖过程中不必要的内容。

另外,将所有动作类型放在一个地方也很好,因此您可以浏览并查看可用的内容,而不用查看所有动作文件。一旦您的项目发展壮大,您一定会很高兴。

此外,在Typescript上它特别有用,因为如果您尝试使用尚未定义的操作,则它甚至都不会构建,因此您可以获得一定的构建时间安全性。

答案 1 :(得分:1)

这可能是duplicate of this question

虽然我的答案

动作类型将在您的代码中多次引用。例如,在减速器中,您还可以引用操作类型:

import {
  types
} from './actions'

...

function exampleReducer(state, action) {
  switch (action.type) {
    case types.ITEMS:
       // do something here
    default:
      return state
  }
}

然后,您不想在此处再次写入type: 'ITEMS'。您想写types.ITEMS以避免重复自己。 引用常量变量而不是用纯字符串再次写入常量始终是一个好习惯。

当多个类型和多个文件中的用法一起使用时,类型尤其难以记住。因此,将操作类型作为常量对您来说真的很好。

一个好习惯是,将您的操作类型整理到一个文件中,以便您始终可以查看并根据需要进行更改(与将'ITEMS'更改为'ITEM'相对)如果要更改操作类型的名称,则为4个文件。

ETC

您通常会做类似的事情

import {
  ITEMS,
  ...more action types
} from './actions'

并直接引用它(更为简洁):

export function itemsAction(items) {
    return {
        type: ITEMS,
        data: items
    }
}

答案 2 :(得分:0)

将动作保存在单独的文件中是有益的,因为它可以减少代码重复。您的动作名称在动作,化简(可能是多个化简)和史诗(如果您使用redux-observable)中是必需的。始终复制粘贴动作名称字符串容易出错,您很容易以错字结尾。

如果将动作名称放在单独的文件中,则由于有一个事实点,因此您可以更有信心在系统中使用它们并在以后进行重构。

如果您决定使用TypeScript,请尝试类似typesafe-actions的操作。 TypeScript消除了在单独的常量文件中使用动作名称的需要,因为动作名称可以变成实类型。这开辟了很多事情,例如在化简版和史诗中编写动作时具有智识