Wie zu verwenden FormattedMessage innerhalb eines option-Tags in Reagieren 0.14?
Ich versuche zu migrieren, die meiner Anwendung aus Reagieren 0.12 Reagieren 0,14 und habe Probleme mit der option-Elementen, die reagieren-intl FormattedMessage Objekte platziert wählen Sie tags.
Hier ist ein Beispiel JSX-code:
<select>
<option value="value1"><FormattedMessage message={this.getIntlMessage('key1')}/></option>
<option value="value2"><FormattedMessage message={this.getIntlMessage('key2')}/></option>
</select>
Dieser code funktioniert in Reagieren 0,12 und ich sehe meine übersetzten option-Elemente.
In reagieren 0.14, bekam ich diese Fehlermeldung:
Only strings and numbers are supported as <option> children.
Ich verfolgte die Nachricht an diesen änderungssatz in Reagieren, was früher passiert in diesem Jahr:
https://github.com/facebook/react/pull/3847/files
Wie kann ich dieses Problem lösen? Ich kann nicht die einzige sein, die versuchen, zu verwenden internationalisiert option-Elemente?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser war schon immer ein Problem. Reagieren < 0.14 verwendet, um schweigend hinnehmen ungültig DOM-Struktur, in Ihrem Fall
<span>
Elemente innerhalb<option>
Elemente. Der browser würde dann korrigieren Sie die DOM-Struktur, und verursachen die virtuellen DOM verwaltet Reagieren synchron mit der realen Sache. Würden Sie nicht die Fehler sehen, bis Sie versucht, re-Rendern vorhandenen Komponenten statt nur re-Montage.react-intl
V2.0.0, die ausgeliefert wird mit Unterstützung Reagieren 0.14, können Sie die Funktion verwenden-Als-Kind-Muster-Anpassung der Art und Weise IhrerFormatted*
Komponenten machen. Siehe "Funktion-Als-Kind Support" Absatz auf dieses Problem.In deinem Fall tun würde:
Ich glaube nicht, dass es einen Weg gibt, um dies zu erreichen, die auf die aktuelle stabile version, 1.2.1.
this.getIntlMessage('key1')
im inneren der option? Bisschen ein versehen nicht aussetzen den vollen zugrunde liegenden übersetzungs-Methode imothis.getIntlMessage('key1')
zurückkehren würde, die richtige Nachricht. Beachten Sie, dass die V2.0.0 API setzen-übersetzung-Methoden auf den Kontext.Ich hatte das gleiche problem und löste es über die injectIntl().
Das bedeutet, daß alle Sie tun müssen ist, wickeln Sie die Komponente mit der injectIntl Funktion, so:
Hoffe, das hilft...
Als eine etwas bessere alternative zu @Alexandre Kirszenberg Antwort, es ist auch möglich, zu injizieren
intl
- Objekt in eine Komponente und verwendetformatMessage
- Funktion direktVerwenden
injectIntl
zu wickeln Sie die Komponente, die Sie möchten, verwenden Sie die API-innen ,so können Sie die API verwenden, wieformattedMessage
und so weiter. Sehen reagieren-intl/wiki/API