2016-02-07 5 views
31

Gibt es in React Native ein Äquivalent zu diesem CSS, sodass die App überall dieselbe Schriftart verwendet?Wie Standard-Schriftfamilie in React Native festlegen?

body { 
    font-family: 'Open Sans'; 
} 

Anwenden manuell auf jedem Text-Knoten scheint übermäßig kompliziert.

+0

Haben Sie eine perfekte Antwort für diese Frage ??? Ich möchte keine styles.text oder ähnliches nennen. –

Antwort

23

Die empfohlene Methode besteht darin, eine eigene Komponente wie MyAppText zu erstellen. MyAppText wäre eine einfache Komponente, die eine Textkomponente mit Ihrem Universal-Stil macht und durch andere Requisiten passieren kann, usw.

https://facebook.github.io/react-native/docs/text.html#limited-style-inheritance

+2

Danke, genau das habe ich gebraucht. Scheint so, als hätte ich den Komponenten-Ansatz noch nicht tief genug verstanden :) –

+1

Eine Sache, die in den Dokumenten nicht besonders klar ist, ist, wie man Eigenschaften in der Komponente durchläuft und Stile in der Komponente respektiert. Sie können dies folgendermaßen tun: https://gist.github.com/neilsarkar/c9b5fc7e67bbbe4c407eec17deb7311e –

34

kürzlich ein Knotenmodul war, die gemacht wurde, das dieses Problem, so dass Sie don löst 't müssen eine andere Komponente erstellen.

https://github.com/Ajackster/react-native-global-props

https://www.npmjs.com/package/react-native-global-props

Die Dokumentation besagt, dass die wie so setCustomText Funktion in höchstem Niveau Komponente importieren.

import { setCustomText } from 'react-native-global-props'; 

Erstellen Sie dann die benutzerdefinierten Styling/Requisiten Sie für die reagieren-native Text Komponente wollen. In Ihrem Fall möchten Sie fontFamily auf jeder Komponente arbeiten.

const customTextProps = { 
    style: { 
    fontFamily: yourFont 
    } 
} 

Rufen Sie die setCustomText Funktion und Ihre Requisiten/Stile in die Funktion übergeben.

setCustomText(customTextProps); 

Und dann reagieren-native Text Komponenten Ihre erklärt family zusammen mit anderen Requisiten/Stile, die Sie bieten haben werden.

+0

Die idiomatische Methode, Komponentenkomposition zu verwenden, scheint eine bessere Wahl zu sein, obwohl dies ein cooler Hack ist. –

+0

Wenn die Textkomponente das standardmäßige Ändern von Standardschriftarten nicht unterstützt, wird diese Lösung viel besser.Ich würde viel lieber ein globales Steuerelement an einem Ort hinzufügen und die nativen Komponenten verwenden, als eine Wrapper-Komponente für jedes Detail zu erstellen, das echte native Apps bieten. – mienaikoe

+0

Ich zögerte zwischen oben 2 Lösungen, eigentlich hasse ich es, inoffizielle Plugins zu installieren, denn react-native selbst ändert sich weiter, aber schließlich wähle ich dieses, weil es mir wirklich viel Zeit sparen kann. Vielen Dank! –

1

können Sie Text Verhalten außer Kraft setzen, indem diese in einem Ihrer Komponente das Hinzufügen von Text mit:

let oldRender = Text.prototype.render; 
Text.prototype.render = function (...args) { 
    let origin = oldRender.call(this, ...args); 
    return React.cloneElement(origin, { 
     style: [origin.props.style, {color: 'red', fontFamily: 'Arial'}] 
    }); 
}; 
8

hinzufügen Text.defaultProps.style = { fontFamily: 'some-font' } im Konstruktor der App.js-Datei (oder jede Wurzelkomponente Sie haben).

+1

Vielleicht existierten die 'defaultProps' nicht, als alle anderen Antworten geschrieben wurden, aber das scheint jetzt der richtige Weg zu sein. – freeall

0

Fügen Sie diese Funktion zu Ihrer Root-Komponente App hinzu und führen Sie sie dann aus Ihrem Konstruktor aus, nachdem Sie Ihre Schriftart mithilfe dieser Anweisungen hinzugefügt haben. https://medium.com/react-native-training/react-native-custom-fonts-ccc9aacf9e5e

import {Text, TextInput} from 'react-native' 

SetDefaultFontFamily =() => { 
    let components = [Text, TextInput] 

    const customProps = { 
     style: { 
      fontFamily: "Rubik" 
     } 
    } 

    for(let i = 0; i < components.length; i++) { 
     const TextRender = components[i].prototype.render; 
     const initialDefaultProps = components[i].prototype.constructor.defaultProps; 
     components[i].prototype.constructor.defaultProps = { 
      ...initialDefaultProps, 
      ...customProps, 
     } 
     components[i].prototype.render = function render() { 
      let oldProps = this.props; 
      this.props = { ...this.props, style: [customProps.style, this.props.style] }; 
      try { 
       return TextRender.apply(this, arguments); 
      } finally { 
       this.props = oldProps; 
      } 
     }; 
    } 
}