Javascript ReactJS PropType检查关联数组的值
我传入一个对象,它是一个关联数组,作为道具。我事先不知道键(属性名),我只知道值应该是字符串或布尔值(例如)。如何使用PropTypes验证这一点 编辑: 例如: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进行验证。 但
{
"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)
,然后在非常必要的情况下进行手动验证。@ZekeDroidPropTypes.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)