2016-06-17 30 views
7

Un modo per creare un TextInput "ricco" in React Native? Forse non è un vero e proprio wysiwyg, ma forse basta cambiare il colore del testo di vari pezzi di testo; come la funzione @mention su Twitter o Facebook.Rich ReactNative TextInput

+0

Hai capire una soluzione? Sto cercando di fare qualcosa di simile (più simile a un editor di testo avanzato con ** bolding **, _italics_, ecc.). – chapeljuice

+0

No. Non ho mai trovato una soluzione. Nel mio caso stavo cercando di definire @menti con qualche tipo di contenitore o colore di sfondo nell'input. Finì solo rimuovendo quel testo dall'input e mettendolo in un'altra vista sopra. Non era l'ideale, ma ha funzionato. – nicholas

+1

@chapeljuice solution found - https://stackoverflow.com/a/49082641/1828637 – Noitidart

risposta

1

Per ottenere questo comportamento, è necessario utilizzare espressioni regolari. Qualcuno ha già creato un pacchetto per dare un'occhiata a react-native-parsed-text

Questa libreria consente di analizzare un testo ed estrarre parti utilizzando un RegExp o pattern predefiniti. Attualmente ci sono 3 tipi predefiniti: url, telefono ed e-mail.

Esempio dal loro 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

Questo aiuterà a far corrispondere i pattern digitati nel testo, ma la domanda era: come potrei cambiare lo stile di quel testo nell'input del testo? Come il modo in cui Facebook evidenzierà il nome della tua citazione con uno sfondo blu nel campo di testo stesso. – nicholas

+1

Puoi farlo mettendo 'ParsedText' all'interno del componente' TextInput' e rimuovendo il valore '' '' 'di' TextInput', dopo che il figlio di 'ParsedText' deve solo essere impostato sul valore che hai impostato in' TextInput ', come quella: ' '' this.setState ({text})}> {} this.state.text '' ' –

2

Date un'occhiata alla TokenizedTextExample dalla documentazione reagire nativi. Penso che ti avvicineremo a quello che stai cercando di fare. Il codice in questione segue:

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

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia – slfan

+1

Grazie per il feedback. Ho aggiornato la risposta come suggerito. – jopecko

+0

Whoa Non ho mai saputo che potresti mettere '' come bambini in un ''! Questo è fantastico! Questo esempio non sembra più esistere nei documenti RN, hai qualche posto in cui posso trovarlo? – Noitidart

1

soluzione è che è possibile utilizzare <Text> elementi come bambini in un <TextInput> come questo:

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

Whoa! Ce la puoi fare? Dovrò fare una prova. – nicholas

+0

@nicholas hahaha yeah uomo anche la mia mente è stata soffiata. Ho fatto RN per un anno e non ne avevo idea! – Noitidart