2016-06-17 19 views
7

Jede Möglichkeit zum Erstellen eines "reichen" TextInput in React Native? Vielleicht kein ausgewachsener Wysiwyg, aber vielleicht nur die Textfarbe verschiedener Textstücke ändern; wie die @ Mention-Funktion auf Twitter oder Facebook.Rich ReactNative TextInput

+0

Haben Sie eine Lösung herausgefunden? Ich versuche, etwas Ähnliches zu tun (nur mehr wie ein Rich-Text-Editor mit ** Fettschrift **, _italics_, etc). – chapeljuice

+0

Nein. Ich habe nie eine Lösung gefunden. In meinem Fall habe ich versucht @mentions mit einer Art Container oder Hintergrundfarbe in der Eingabe zu stylen. Am Ende wurde nur der Text von der Eingabe entfernt und in eine andere Ansicht eingefügt. War nicht ideal, aber es hat funktioniert. – nicholas

+1

@ chapeljuice Lösung gefunden - https://Stackoverflow.com/a/49082641/1828637 – Noitidart

Antwort

1

Sie müssen regex verwenden, um dieses Verhalten zu erreichen. Jemand hat bereits ein Paket dafür erstellt. Werfen Sie einen Blick auf react-native-parsed-text

Diese Bibliothek ermöglicht es Ihnen, einen Text zu analysieren und Teile mit einer RegExp oder vordefinierten Mustern zu extrahieren. Derzeit gibt es 3 vordefinierte Typen: URL, Telefon und E-Mail.

Beispiel aus ihrer Github

<ParsedText 
      style={styles.text} 
      parse={ 
      [ 
       {type: 'url',      style: styles.url, onPress: this.handleUrlPress}, 
       {type: 'phone',      style: styles.phone, onPress: this.handlePhonePress}, 
       {type: 'email',      style: styles.email, onPress: this.handleEmailPress}, 
       {pattern: /Bob|David/,    style: styles.name, onPress: this.handleNamePress}, 
       {pattern: /\[(@[^:]+):([^\]]+)\]/i, style: styles.username, onPress: this.handleNamePress, renderText: this.renderText}, 
       {pattern: /42/,      style: styles.magicNumber}, 
       {pattern: /#(\w+)/,     style: styles.hashTag}, 
      ] 
      } 
     > 
      Hello this is an example of the ParsedText, links like http://www.google.com or http://www.facebook.com are clickable and phone number 444-555-6666 can call too. 
      But you can also do more with this package, for example Bob will change style and David too. [email protected] 
      And the magic number is 42! 
      #react #react-native 
</ParsedText> 
+1

Das wird helfen, Muster im Text eingegeben, aber die Frage war, wie könnte ich dann den Stil dieses Textes in der Texteingabe ändern? So wie Facebook den Namen Ihrer Erwähnung mit einem blauen Hintergrund im Textfeld selbst hervorhebt. – nicholas

+1

Sie können dies tun, indem Sie 'ParsedText' in die' TextInput'-Komponente einfügen und den Requisiten 'Wert' von' TextInput' entfernen, danach muss das Kind von 'ParsedText' einfach auf den Wert gesetzt werden, den Sie in' TextInput gesetzt haben ', wie folgt aus: ' '' this.setState ({text})}> {this.state.text} '' ' –

2

Werfen Sie einen Blick auf den TokenizedTextExample aus der reagieren-native docs. Ich denke, das wird dich nah an das bringen, was du machen willst. Der entsprechende Code folgt:

class TokenizedTextExample extends React.Component { 
    state: any; 

    constructor(props) { 
    super(props); 
    this.state = {text: 'Hello #World'}; 
    } 
    render() { 

    //define delimiter 
    let delimiter = /\s+/; 

    //split string 
    let _text = this.state.text; 
    let token, index, parts = []; 
    while (_text) { 
     delimiter.lastIndex = 0; 
     token = delimiter.exec(_text); 
     if (token === null) { 
     break; 
     } 
     index = token.index; 
     if (token[0].length === 0) { 
     index = 1; 
     } 
     parts.push(_text.substr(0, index)); 
     parts.push(token[0]); 
     index = index + token[0].length; 
     _text = _text.slice(index); 
    } 
    parts.push(_text); 

    //highlight hashtags 
    parts = parts.map((text) => { 
     if (/^#/.test(text)) { 
     return <Text key={text} style={styles.hashtag}>{text}</Text>; 
     } else { 
     return text; 
     } 
    }); 

    return (
     <View> 
     <TextInput 
      multiline={true} 
      style={styles.multiline} 
      onChangeText={(text) => { 
      this.setState({text}); 
      }}> 
      <Text>{parts}</Text> 
     </TextInput> 
     </View> 
    ); 
    } 
} 
+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Link-Only-Antworten können ungültig werden, wenn die verlinkte Seite sich ändert – slfan

+1

Danke für die Rückmeldung. Ich habe die Antwort wie vorgeschlagen aktualisiert. – jopecko

+0

Whoa, ich wusste nie, dass Sie '' als Kinder in eine '' setzen konnten! Das ist super cool! Dieses Beispiel scheint in den RN-Dokumenten nicht mehr zu existieren. Gibt es einen Platz, den ich hier finden kann? – Noitidart

1

Lösung ist, dass Sie <Text> Elemente wie Kinder in einem <TextInput> wie diese verwenden:

<TextInput> 
    whoa no way <Text style={{color:'red'}}>rawr</Text> 
</TextInput> 
+0

Whoa! Das kannst du machen? Ich werde es versuchen müssen. – nicholas

+0

@ Nicholas hahaha yeah Mann mein Verstand wurde auch geblasen. Ich mache RN seit einem Jahr und ich hatte keine Ahnung! – Noitidart