【问题标题】:React PropTypes - shape with numbers as keysReact PropTypes - 以数字为键的形状
【发布时间】:2016-02-12 08:42:13
【问题描述】:

我正在尝试为我的 React 组件之一指定 PropTypes,但遇到了一些问题。我试图描述的对象将如下所示(数组将包含多个对象):

rounds: {
  1: [
       {
         date: 1429354800000,
         arena: 'Arena name',
         scoreHome: 3,
         scoreAway: 2,
         teamHome: 'Home team name',
         teamAway: 'Away team name',
         spectators: 10
       }
     ]
}

我不会提前知道会有多少轮。所以我最终可以得到

rounds: { 1: [..], 2: [..], 3: [..] }

这是我目前拥有的(不工作):

RoundsTable.propTypes = {
  rounds: PropTypes.shape({
    PropTypes.arrayOf(PropTypes.shape({
      date: PropTypes.number.isRequired,
      arena: PropTypes.string.isRequired,
      scoreHome: PropTypes.number.isRequired,
      scoreAway: PropTypes.number.isRequired,
      teamHome: PropTypes.string.isRequired,
      teamAway: PropTypes.string.isRequired,
      spectators: PropTypes.number.isRequired
    }).isRequired).isRequired
  }).isRequired
}

我不确定如何指定包含对象数组的数字。是我这边的数据设计问题,还是有指定这些道具的简单解决方案?

【问题讨论】:

  • 您使用带编号键的对象而不是数组是否有原因?

标签: javascript validation reactjs react-proptypes


【解决方案1】:

这是一个数据设计问题。您正在使用 Object 作为数组。例如,如果您相应地更改数据,这将起作用:

RoundsTable.propTypes = {
  rounds: PropTypes.arrayOf(PropTypes.shape({
      date: PropTypes.number.isRequired,
      arena: PropTypes.string.isRequired,
      scoreHome: PropTypes.number.isRequired,
      scoreAway: PropTypes.number.isRequired,
      teamHome: PropTypes.string.isRequired,
      teamAway: PropTypes.string.isRequired,
      spectators: PropTypes.number.isRequired
    }).isRequired).isRequired
}

数据如下所示:

rounds: [
       {
         date: 1429354800000,
         arena: 'Arena name',
         scoreHome: 3,
         scoreAway: 2,
         teamHome: 'Home team name',
         teamAway: 'Away team name',
         spectators: 10
       },
       {...}
]

您丢失了索引,但数组已经有了这些。如果您想要更多类似地图的功能,您需要决定使用哪种地图并以此为基础您的 PropTypes。 Javascript 没有原生地图,尽管人们经常将 Object 用于相同目的,但它有许多限制,例如您遇到的限制。

【讨论】:

  • 这解决了我的问题。仍然很好奇是否可以使用 PropTypes 来描述我的初始结构。谢谢。
  • 你的初始结构的问题是你没有正确使用{}。那是一个对象字面量,而不是一个映射,您将它用作映射。您应该在脑海中进行的测试是:我可以提前定义所有键吗?如果没有,那么您需要一个数组或映射(例如 ES6 Map 类)。在您的情况下,轮数没有限制,因此您不能使用 Object 文字。您这样做的原因可能是因为您有时会看到将 Javascript 对象“滥用”为类似地图的代码,因为它们非常灵活。这有意义吗?
  • 这不是一个好的答案。并非所有整数都是索引。我有同样的问题,我的键可能是:126、8654、65683。这不是数组而是字典键
  • @DeGoltz 您可以使用ES6 Map。 Javascript Object 并非旨在用作字典。它的键被设计为只是字符串,即使这样当你像地图一样使用它们时也会有很多问题。
  • @EugeneZ 使用动态键(字符串或整数)的对象仍然存在问题。如果这些值具有固定的结构,您会希望强制执行该结构,而不仅仅是使用 PropTypes.object。例如,当您从 API 中按原样获取时
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
相关资源
最近更新 更多