Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 道具的默认类型取决于另一道具的值_Javascript_Reactjs_React Proptypes - Fatal编程技术网

Javascript 道具的默认类型取决于另一道具的值

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为true,则initialValue应为空数组。否则,它应该是一个空对象。在这种情况下,设置defaultProps看起来有点复杂。是否有任何方法可以根据
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,这很奇怪,不是吗?这绝对有道理。