Javascript 道具的默认类型取决于另一道具的值
我有这个组件,可以满足单选或多选功能。如果multiselect为true,则initialValue应为空数组。否则,它应该是一个空对象。在这种情况下,设置defaultProps看起来有点复杂。是否有任何方法可以根据Javascript 道具的默认类型取决于另一道具的值,javascript,reactjs,react-proptypes,Javascript,Reactjs,React Proptypes,我有这个组件,可以满足单选或多选功能。如果multiselect为true,则initialValue应为空数组。否则,它应该是一个空对象。在这种情况下,设置defaultProps看起来有点复杂。是否有任何方法可以根据multiselect的值设置initialValue的默认属性 const wrap = compose( setPropTypes({ initialValue: PropTypes.oneOfType([PropTypes.object, PropTypes.a
multiselect
的值设置initialValue
的默认属性
const wrap = compose(
setPropTypes({
initialValue: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
multiselect: PropTypes.bool,
}),
defaultProps({
initialValue: // [] or {} or ((otherProps) => otherProps.multiselect ? [] : {}) ??? , if there is such thing
multiselect: false,
})
);
如果我将其设置为{}
,用户仍然可以传递multiselect={true}
,而不传递defaultValue。在这种情况下,多个函数将通过defaultValue映射,而它不是数组,从而导致数据处理不当和大量错误
如果我只是漫不经心地假设其他情况,同样的情况也会发生。有什么完美的方法吗?提前感谢。简单地说,这是不可能的。我在我的一些部件上也有同样的问题。我的建议是使用两个属性,每个选择类型一个。此外,您可以删除multiselect属性并检查它,查看我提到的两个属性中的哪一个不是null。简言之:
const wrap = compose(
setPropTypes({
initialSingleValue: PropTypes.object,
initialMultiValue: PropTypes.array,
}),
defaultProps({
initialSingleValue: {}
initialMultiValue: nil,
})
);
我希望这对您有所帮助。小旁注,但我认为您应该使用PropTypes.oneOfType
而不是oneOf
也许您不应该使用multiselect
属性。因为您已经拥有此信息(如果initialValue
类型为array,则它将是一个multiselect组件,否则它将不是multiselect)。因此,multiselect
属性似乎是多余的。@抱歉。它应该是PropTypes,类型之一
。我的错。然而,我不能接受你的建议。我认为阅读文档时会发现组件的多选功能依赖于initialValue
prop,这很奇怪,不是吗?这绝对有道理。