2016-03-09 11 views
5

pisałem składniki z wielokrotnej konfiguracji Na przykład:Jak deklarują React PropTypes XOR

ResponsiveTable.PropTypes = { 
    width: React.PropTypes.number, //used if widthOffset and minWidth are undefined 
    widthOffset: React.PropTypes.number, //used if width is undefined 
    minWidth: React.PropTypes.number, //used if width is undefined 
}; 

Jak mogę zadeklarować rekwizytów, które mogą być stosowane tylko wtedy, gdy ja snot ustawić już inne rekwizyty?

Przydałaby się opcja XOR. Czytam https://facebook.github.io/react/docs/reusable-components.html, ale to nie pomogło.

Wszelkie pomysły?

Odpowiedz

2

Solution:

React.PropTypes.oneOfType([ 
    React.PropTypes.shape({ 
     width: React.PropTypes.number.isRequired 
    }), 
    React.PropTypes.shape({ 
     widthOffset: React.PropTypes.number, 
     minWidth: React.PropTypes.number.isRequired 
    }), 
]) 
+0

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

+0

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. –

2

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

Powiązane problemy