Ich habe eine Card
Komponente und eine CardGroup
Komponente, und ich möchte einen Fehler zu werfen, wenn CardGroup
Kinder hat, die nicht Card
Komponenten sind. Ist das möglich, oder versuche ich das falsche Problem zu lösen?nur Kinder eines bestimmten Typs in einer Reaktionskomponente erlauben
Antwort
Sie können die display für jedes Kind verwenden, über Art zugegriffen:
for (child in this.props.children){
if (this.props.children[child].type.displayName != 'Card'){
console.log("Warning CardGroup has children that aren't Card components");
}
}
Sie eine benutzerdefinierte PropType Funktion können Kinder validieren, da Kinder nur Requisiten sind. Ich habe auch ein article auf diesem geschrieben, wenn Sie mehr Details wollen.
var CardGroup = React.createClass({
propTypes: {
children: function (props, propName, componentName) {
var error;
var prop = props[propName];
React.Children.forEach(prop, function (child) {
if (child.type.displayName !== 'Card') {
error = new Error(
'`' + componentName + '` only accepts children of type `Card`.'
);
}
});
return error;
}
},
render: function() {
return (
<div>{this.props.children}</div>
);
}
});
Ist diese Syntax noch gültig mit ES2015 und React 0.14.x +? –
@Con: siehe http://stackoverflow.com/a/36424582/1385678. –
Danke, @DiegoV. Ich denke, Sie können auch 'static propTypes = {}' in der Klassendefinition deklarieren. –
Für 0.14+ Reagieren und ES6 Klassen verwenden, wird die Lösung wie folgt aussehen:
class CardGroup extends Component {
render() {
return (
<div>{this.props.children}</div>
)
}
}
CardGroup.propTypes = {
children: function (props, propName, componentName) {
const prop = props[propName]
let error = null
React.Children.forEach(prop, function (child) {
if (child.type !== Card) {
error = new Error('`' + componentName + '` children should be of type `Card`.');
}
})
return error
}
}
Ich weiß nicht warum, aber' '' child.type === Karte '' 'funktioniert nicht in meinem Setup. Aber ich habe es funktioniert mit '' 'child.type.prototype instanceof Card'''. Meine React-Version ist 15.5.4 –
Warum werfen Sie es nicht einfach dort und dort, anstatt einen Fehlerwert zurückzugeben. – user2167582
@ user2167582 Da dies die erwartete API für Prop-Validierungsfunktionen ist. [Offizielle Dokumente] (https://github.com/facebook/prop-types/blob/master/README.md) enthalten den folgenden Kommentar im Beispielcode: _Sie können auch einen benutzerdefinierten Validator angeben. Es sollte ein Fehler-Objekt zurückgeben, wenn die Validierung fehlschlägt. Nicht "console.warn" oder throw, da dies nicht in 'oneOfType'_ funktioniert. –
ich eine benutzerdefinierte PropType dafür gemacht, dass ich equalTo
nennen. Sie können es so verwenden ...
class MyChildComponent extends React.Component { ... }
class MyParentComponent extends React.Component {
static propTypes = {
children: PropTypes.arrayOf(PropTypes.equalTo(MyChildComponent))
}
}
Nun MyParentComponent
akzeptiert nur Kinder, die MyChildComponent
sind. Sie können, wie dies für HTML-Elemente prüfen ...
PropTypes.equalTo('h1')
PropTypes.equalTo('div')
PropTypes.equalTo('img')
...
Hier ist die Implementierung ...
React.PropTypes.equalTo = function (component) {
return function validate(propValue, key, componentName, location, propFullName) {
const prop = propValue[key]
if (prop.type !== component) {
return new Error(
'Invalid prop `' + propFullName + '` supplied to' +
' `' + componentName + '`. Validation failed.'
);
}
};
}
Schnell dies eine von vielen möglichen Arten zu akzeptieren erstrecken. Vielleicht so etwas wie ...
React.PropTypes.equalToOneOf = function (arrayOfAcceptedComponents) {
...
}
veröffentlichte ich das Paket, das die Typen von React Elemente https://www.npmjs.com/package/react-element-proptypes validieren können:
const ElementPropTypes = require('react-element-proptypes');
const Modal = ({ header, items }) => (
<div>
<div>{header}</div>
<div>{items}</div>
</div>
);
Modal.propTypes = {
header: ElementPropTypes.elementOfType(Header).isRequired,
items: React.PropTypes.arrayOf(ElementPropTypes.elementOfType(Item))
};
// render Modal
React.render(
<Modal
header={<Header title="This is modal" />}
items={[
<Item/>,
<Item/>,
<Item/>
]}
/>,
rootElement
);
static propTypes = {
children : (props, propName, componentName) => {
const prop = props[propName];
return React.Children
.toArray(prop)
.find(child => child.type !== Card) && new Error(`${componentName} only accepts "<Card />" elements`);
},
}
Sie hinzufügen können, eine Stütze zu Ihrem Card
Komponente und dann prüfen, für diese Stütze in Ihrer CardGroup
Komponente. Dies ist der sicherste Weg, dies in React zu erreichen.
Diese Stütze kann als defaultProp hinzugefügt werden, so dass sie immer da ist.
class Card extends Component {
static defaultProps = {
isCard: true,
}
render() {
return (
<div>A Card</div>
)
}
}
class CardGroup extends Component {
render() {
for (child in this.props.children) {
if (!this.props.children[child].props.isCard){
console.error("Warning CardGroup has a child which isn't a Card component");
}
}
return (
<div>{this.props.children}</div>
)
}
}
zu prüfen, ob die Kartenkomponente ist in der Tat eine Kartenkomponente von type
oder displayName
verwendet, ist nicht sicher, da es während der Produktion nicht Gebrauch arbeiten kann wie hier angegeben: https://github.com/facebook/react/issues/6167#issuecomment-191243709
Dies scheint der einzige Weg zu sein, wie ich das in einem ** Produktions-Build ** arbeiten lassen kann. Ich habe eine Komponente, die ihre Kinder klont, während sie zusätzliche Requisiten nur denen eines bestimmten Typs hinzufügt. – Palisand
Für diejenigen, die wie ich die Verwendung von TypeScript-Version. Sie können Filter/ändern Komponenten wie folgt aus:
this.modifiedChildren = React.Children.map(children, child => {
if (React.isValidElement(child) && (child as React.ReactElement<any>).type === Card) {
let modifiedChild = child as React.ReactElement<any>;
// Modifying here
return modifiedChild;
}
// Returning other components/string.
// Delete next line in case you dont need them.
return child;
});
- 1. Finde Kinder eines bestimmten Typs
- 2. XPath Knoten erhalten, die nur Knoten eines bestimmten Typs enthält
- 3. Erlauben Anfrage nur von bestimmten IP
- 4. Sicherstellung eines bestimmten Typs Ergebnis in SML
- 5. Filter-Funktionalität in einer Reaktionskomponente
- 6. Zugriff auf alle Frühlingsbohnen eines bestimmten Typs
- 7. Sitecore Regeln einfügen, um höchstens (1) Kinder eines bestimmten Typs zu gewährleisten
- 8. Python: Operator Überladen eines bestimmten Typs
- 9. Div Anker Tag in einer Reaktionskomponente
- 10. Wie Kommentar Code mit einer generischen Klasse eines bestimmten Typs
- 11. Variadic Template-Parameter eines bestimmten Typs
- 12. Finden Sie alle Methoden eines bestimmten Typs
- 13. Erzwingen variadic Vorlage eines bestimmten Typs
- 14. Android: Liste aller Dateien eines bestimmten Typs
- 15. Karte aus Objekten eines bestimmten Typs generieren?
- 16. LINQ und wie eine Liste eines bestimmten Typs zurück
- 17. erlauben nur ein bestimmtes Kind
- 18. nur alphanumerische erlauben Werte
- 19. NHibernate: Wie ordne ich mehrere Kinder eines gemeinsamen Typs mehrerer Eltern in einer einzigen Tabelle?
- 20. UITabBarController - Wie zu Registerkarte eines bestimmten Typs wechseln
- 21. Regex nur erlauben alphanumerische
- 22. Rette alle Fehler eines bestimmten Typs in einem Modul
- 23. Wie Vektor in Zeichenfolge eines bestimmten Typs konvertieren
- 24. Platzierung Beratung zu jedem Parameter eines bestimmten Typs in AspectJ
- 25. Lose Dokumente eines bestimmten Typs in elasticsearch löschen
- 26. Nur einem bestimmten Benutzertyp erlauben, ein Feld in einer Bearbeitungsansicht zu sehen
- 27. Ruft den aktuellen Pfad in einer Reaktionskomponente ab
- 28. dplyr - wie man Spalten eines bestimmten Typs auswählt
- 29. Wie wählt man Notes Dokumente eines bestimmten Typs aus?
- 30. Force Generics nicht vom gleichen Typ sein? Erzwingen Generic, nur Subtyp eines bestimmten Typs zu sein?
Achten Sie darauf, zu prüfen, ob die aktuelle Umgebung Entwicklung oder Produktion. Die PropTypes-Validierung wird in der Produktion nicht für die Leistung ausgelöst. Die Verwendung von customProp in propTypes wird hilfreich sein. –
Sie sollten dies nicht tun, weil 'props.children' ein [undurchsichtiger Datentyp] ist (https://en.wikipedia.org/wiki/Opaque_data_type). Bessere 'React.Children' Dienstprogramme wie hier gezeigt [http://stackoverflow.com/a/36424582/1385678]. –
Denken Sie jedoch daran, wenn Sie Dinge wie Uglify verwenden, wird dies brechen – MoeSattler