ReactJS PropType 检查关联数组的值

ReactJS PropType to check values of associative arrays

我正在传递一个对象,它是一个关联数组,作为道具。我事先不知道键(属性 名称),我只知道值应该是字符串或布尔值(例如)。我如何使用 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>
}

如果你想在验证失败时停止渲染,那么就不需要上面的函数了,你可以使用下面的函数

shouldComponentUpdate(nextProps, nextState){
  if(validate()){
    return true
  }
  return false;
}

好的,这是我能想到的唯一答案,我不知道它是否适合 React,但可以按您的预期工作:

想法是在运行时从父组件创建对象(如果没有,则创建一个)并将其导出。然后将其导入到您的实际组件中并从中构造 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() 支持。

参见https://reactjs.org/docs/typechecking-with-proptypes.html

// An object with property values of a certain type
optionalObjectOf: PropTypes.objectOf(PropTypes.number)