Javascript ReactJS PropType检查关联数组的值

Javascript ReactJS PropType检查关联数组的值,javascript,reactjs,react-proptypes,Javascript,Reactjs,React Proptypes,我传入一个对象,它是一个关联数组,作为道具。我事先不知道键(属性名),我只知道值应该是字符串或布尔值(例如)。如何使用PropTypes验证这一点 编辑: 例如: { "20161001": true, "20161002": true, "20161003": true, "20161004": false, "20161005": true, "20161006": false } 我认为您无法使用React.PropTypes进行验证。 但

我传入一个对象,它是一个关联数组,作为道具。我事先不知道键(属性名),我只知道值应该是字符串或布尔值(例如)。如何使用PropTypes验证这一点

编辑: 例如:

{
    "20161001": true,
    "20161002": true,
    "20161003": true,
    "20161004": false,
    "20161005": true,
    "20161006": false
}

我认为您无法使用React.PropTypes进行验证。 但是您可以做的是在函数中验证它

componentWillReceiveProps(nextProps){
  <write your logic with what ever you want to validate or check or compute>
}

好吧,这是我能想到的唯一答案,我不知道这是否正确,但它的工作原理与您的预期一致:

其思想是在运行时从父组件创建对象(如果没有,则创建一个)并将其导出。然后将其导入实际组件并从中构造
propTypes
静态对象:

在父零部件文件中,在实际零部件之外:

function generateMyObject() {
    const myObj = {};
    [0, 1, 2, 3, 4, 5].forEach(i =>
        myObj[`2016010${i}`] = Math.random() > 0.5
    );

    return myObj;
}
export const myObj = generateMyObject();
这将导出名为
myObj
的命名对象。当然,你可以添加任何逻辑。关键是要表明我们不需要知道密钥的名称就可以进行验证

在子组件文件中:

import { myObj } from './ParentComponent';

export default class ChildComponent extends Component {
    static propTypes = Object.keys(myObj).reduce((key0, key1) => ({
        ...key0,
        [key1]: PropTypes.bool,
    }), {})

    // rest of the component logic
}

第一个位从您的对象中获取关键点,然后它将它们缩减为一个对象,正如您所希望的那样。

我今天再次需要它,并发现使用
PropTypes.objectOf()可以支持它

见:


请给你的关联数组举一个例子,因为关键是你是声明性的,所以你不允许写动态道具类型。您最好的选择是需要
PropTypes.arrayOf(PropTypes.object)
,然后在非常必要的情况下进行手动验证。@ZekeDroid
PropTypes.arrayOf
不起作用,因为它不是真正的数组,它是一个简单的对象,用作具有命名索引的数组。密钥是在运行时创建的。即使在生产模式下也会执行reduce操作,对吗?我不希望这样,因为只在调试模式下检查proptype。这听起来不正确。为什么只在“开发”中检查道具类型?当您缩小生产代码时,react可能会进行优化,可能不会进行检查,但在我看来,选择性验证不是一个好主意。您显然可以使用三元代码进行选择性验证,但我强烈建议您不要这样做。react就是这样工作的。在生产模式下(
NODE_ENV==“production”
),不会记录任何开发警告(包括PropType冲突)。为什么?当然是表演。但事实上,我不想把这些标志放在我自己的代码中,那么我不明白它们为什么会出现在生产模式中。reduce函数只生成
propTypes
对象
import { myObj } from './ParentComponent';

export default class ChildComponent extends Component {
    static propTypes = Object.keys(myObj).reduce((key0, key1) => ({
        ...key0,
        [key1]: PropTypes.bool,
    }), {})

    // rest of the component logic
}
// An object with property values of a certain type
optionalObjectOf: PropTypes.objectOf(PropTypes.number)