2014-02-08 13 views
17

Die Website, die ich entwickle, nutzt Microdata (mit schema.org). Während wir die Entwicklung verschieben, um React zu verwenden, um unsere Ansichten zu rendern, habe ich einen Blocker gefunden, in dem React nur Attribute in der HTML-Spezifikation darstellt. Microdata spezifiziert jedoch benutzerdefinierte Attribute wie itemscope.Wahre benutzerdefinierte Attribute (z. B. Mikrodaten) in React

Da ich relativ neu in React bin und noch keine Chance hatte, den Kern vollständig zu verstehen, ist meine Frage, was wäre der beste Weg, um die Funktionalität von react.js zu erweitern, um definierte benutzerdefinierte Attribute zu ermöglichen, zB Mikrodaten?

Gibt es eine Möglichkeit, den Attributs-/Requisiten-Parser zu erweitern, oder ist es ein Job für einen Mix, der alle übergebenen Requisiten überprüft und das DOM-Element direkt verändert?

(Hoffentlich werden wir in der Lage sein, zusammen einen Rückgang der Erweiterung zu setzen für alle Unterstützung dafür zu sorgen, wenn eine Lösung klar ist.)

+0

Beachten Sie, dass diese ('itemscope', ...) Attribute sind, die von Microdata definiert werden, nicht schema.org. (schema.org ist "nur" ein Vokabular, d.h. es definiert Werte, die für diese Attribute verwendet werden können). – unor

+0

Um anderen etwas Zeit zu sparen - https://github.com/facebook/react/issues/140 –

Antwort

10

sollten Sie in der Lage sein, es zu tun mit componentDidMount:

... 
componentDidMount: function() { 
    if (this.props.itemtype) { 
    this.getDOMNode().setAttribute('itemscope', true) 
    this.getDOMNode().setAttribute('itemtype', this.props.itemtype) 
    } 

    if (this.props.itemprop) { 
    this.getDOMNode().setAttribute('itemprop', this.props.itemprop) 
    } 
} 
... 

Die ganze Überprüfung für Microdata-Attribute können in ein Mixin für bequem verpackt werden. Das Problem mit diesem Ansatz ist, dass es nicht für integrierte React-Komponente (Komponenten erstellt von React.DOM) funktioniert. Update: Bei näherer Betrachtung React.DOM, komme ich mit dieser http://plnkr.co/edit/UjXSveVHdj8T3xnyhmKb?p=preview. Grundsätzlich wickeln wir die eingebauten Komponenten in einer benutzerdefinierten Komponente mit unserem Mixin. Da Ihre Komponenten auf den integrierten DOM-Komponenten von React basieren, würde dies funktionieren, ohne dass Sie das Mixin in die Komponenten aufnehmen müssen.

Die wirkliche Lösung würde sein, eine benutzerdefinierte Konfiguration anstelle von React DefaultDOMPropertyConfig zu injizieren, aber ich finde keine Möglichkeit, dies in einer Drop-in-Weise zu tun (DOMProperty ist durch das Modulsystem verborgen).

+10

Wir (Reaktion Team) suchen nach Optionen, um dies zur Laufzeit injizierbar zu machen, damit Leute benutzerdefinierte DOM-Eigenschaften verwenden können. In der Zwischenzeit ist dies die beste Option, es sei denn, Sie möchten einen benutzerdefinierten Build verwenden. –

+0

Paul Ich nehme an, du könntest uns über Fortschritte auf dem Laufenden halten, die du in dieser Hinsicht gemacht hast? Danke –

+2

Sie haben nicht. https://github.com/facebook/react/issues/140 –

8

Es sieht aus wie diese Nicht-Standard-Eigenschaften

itemProp: MUST_USE_ATTRIBUTE, // Microdata: http://schema.org/docs/gs.html 
itemScope: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, // Microdata: http://schema.org/docs/gs.html 
itemType: MUST_USE_ATTRIBUTE, // Microdata: http://schema.org/docs/gs.html 
+0

Wie verwenden wir diese in reagieren? Kann ich einfach das Tag '

{this.props.data.question} - on dialectic.sg
' in den react render() einfügen? – GK79

+1

Hi @ reggie-pharkle - Ich würde gerne wissen, wo ich mehr darüber lernen kann, wie man diese Nicht-Standard-Eigenschaften verwendet. Vielen Dank! – GK79

+2

Nur um klar zu sein itemScope und ItemType sind cammelCase –

44

Sie können auch Verwenden Sie "ist" Attribut. Es deaktiviert die Attribut-Whitelist von React und lässt jedes Attribut zu. Aber Sie müssen class anstelle von className und for anstelle von htmlFor schreiben, wenn Sie is verwenden.

<div is my-custom-attribute="here" class="instead-of-className"></div> 

aktualisieren React 16 benutzerdefinierte Attribute jetzt möglich sind

In reagieren 16 benutzerdefinierte Attribute sind jetzt möglich

React 16 custom attributes

+3

Tolle Infos - wo hast du das in den Dokumenten gesehen? – ragebiswas

+1

Dies sollte die richtige Antwort sein, da die akzeptierte Antwort nicht für Elemente funktioniert, die keine React-Komponenten sind, wie _' '_ oder _WebComponents_. –

+0

Kann in einer Funktion namens isCustomComponent gefunden werden https://github.com/facebook/react/blob/27c844905fcbb64ca0ba7c0a6b0fa0e121f9c429/src/renderers/dom/stack/client/ReactDOMComponent.js#L371 –

0

Bisher ist die beste Methode, die ich‘ ve gefunden ist basiert auf some Amp interop code verbunden von a comment auf dem Bug-Tracker-Thread von reac zum Thema.Ich habe es leicht modifiziert, um mit einer neueren Version von React (15.5.4) und TypeScript zu arbeiten.

Für reguläre ES6 können Sie einfach die Typannotation für attributeName entfernen. Die Verwendung von require wurde in TS benötigt, da DOMProperty in der index.d.ts von react nicht verfügbar ist, aber wiederum könnte der Import in regulären ES6 verwendet werden.

// tslint:disable-next-line:no-var-requires 
const DOMProperty = require("react-dom/lib/DOMProperty"); 
if (typeof DOMProperty.properties.zz === "undefined") { 
    DOMProperty.injection.injectDOMPropertyConfig({ 
     Properties: { zz: DOMProperty.MUST_USE_ATTRIBUTE }, 
     isCustomAttribute: (attributeName: string) => attributeName.startsWith("zz-") 
    }); 
} 

Jetzt können Sie beliebige Attribute verwenden, beginnend mit ZZ-

<div zz-context="foo" /> 

Normalerweise wäre es eine schlechte Idee, Innenteile zu verwenden, der wie diese reagieren, aber ich denke, es ist besser, als alle die anderen Methoden. Es funktioniert genauso wie existierende offene Attribute wie Daten und JSX ist sogar typsicher in TS. Ich glaube, die nächste Hauptversion von react wird sowieso die Whitelist wegnehmen, also werden hoffentlich keine Änderungen nötig sein, bevor wir dieses Shim komplett entfernen können.

+0

Ich habe das versucht, aber keinen Erfolg. Funktioniert das noch für dich? – Nico