Próbowałem customProp. Mam coś takiego:
/**
* Configure a React type to be usable only if including ot exclufing other props from component
* @param {React.PropTypes} propType current prop type
* @param {Array} excludedProps names of the props to exclude
* @param {Array} includedProps name of the props to include
*/
function propTypeXOR(propType,excludedProps,includedProps){
return(props, propName, componentName) =>{
if(props[propName]){
if(typeof props[propName] !== propType){
return new Error("Failed propType: Invalid prop `"+propName+"` of type `"+propType+"` supplied to `"+componentName+"`, expected `number`");
}else{
excludedProps.map((excludedPropName) =>{
if(props[excludedPropName]){
return new Error("forbidden prop `"+excludedPropName+"` was specified in `"+componentName+"` when using the prop `"+propName+"`");
}
})
if(includedProps){
includedProps.map((includedPropName) =>{
if(props[includedPropName]){
return new Error("required prop `"+includedPropName+"` was not specified in `"+componentName+"` when using the prop `"+propName+"`");
}
})
}
}
}else{
if(excludedProps){
var error = "";
excludedProps.map((excludedPropName) =>{
if(!props[excludedPropName]){
error+="`"+excludedPropName+"`,";
}
})
if(error!=""){
return new Error("required prop `"+propName+"` was not specified in `"+componentName+"`.It is required when props ["+error+"] are not defined.");
}
}
}
}
}
ResponsiveTable.propTypes = {
width: propTypeXOR("number",["widthOffset","minWidth"]),
widthOffset: propTypeXOR("number",["width"],["minWidth"]),
minWidth: propTypeXOR("number",["width"],["widthOffset"])
};
To działa: użytkownik musi zadeklarować z lub widthOffset i MinWidth. Ale myślę, że bardziej wbudowane rozwiązanie ułatwi deklarację i poprawi popełniony błąd.
zamieścić zapotrzebowanie na react github
Wydaje się, że to będzie działać tylko jako walidacji XOR właściwości, powiedzmy, obiekt były przekazywane do komponentu, w przeciwieństwie do zatwierdzenia XOR rekwizytów przekazanych do twojego komponentu. Czy nie rozumiem tego i czy masz więcej szczegółów na temat tego, jak użyłeś tego rozwiązania, aby rozwiązać pierwotne pytanie? – aarontam
Tak, to prostsze rozwiązanie wymaga przetestowania konkretnego rekwizytu zawierającego etiher 'width' lub' minWidth' oraz opcjonalnie 'widthOffset'. Zmusza cię do owinięcia właściwości do przetestowania w konkretnym rekwiycie. –