React Native ajoute du gras ou de l'italique à des mots uniques dans le champ <Text>

113

Comment mettre un seul mot dans un champ de texte en gras ou en italique? Un peu comme ça:

<Text>This is a sentence <b>with</b> one word in bold</Text>

Si je crée un nouveau champ de texte pour le caractère gras, il le séparera sur une autre ligne, donc ce n'est sûrement pas la façon de le faire. Ce serait comme créer une balise <p> dans une balise <p> juste pour mettre un mot en gras.

Hasen
la source

Réponses:

210

Vous pouvez utiliser <Text>comme un conteneur pour vos autres composants de texte. Voici un exemple:

...
<Text>
  <Text>This is a sentence</Text>
  <Text style={{fontWeight: "bold"}}> with</Text>
  <Text> one word in bold</Text>
</Text>
...

Voici un exemple .

Slowyn
la source
1
Oui mais comme je l'ai dit, cela ne fonctionnerait pas car chaque élément de texte est séparé sur différentes lignes.
Hasen
1
Si vous divisez votre <Text style={{fontWeight: 'bold'}}> with</Text>en trois lignes distinctes, vous perdrez l'espace de premier plan, vous voudrez peut-être l'utiliser {' with'}pour être sûr de toujours l'avoir.
Christoffer Karlsson
1
Je veux juste souligner que si styled-componentsvous pouvez passer un gras property.
Crazy Barney
2
@KonstantinYakushin Link est cassé, pour info
kevlarjacket
@kevlarjacket Oui. Malheureusement, le service rnplay est fermé. Je vais essayer de mettre à jour l'exemple.
Slowyn
60

Pour une sensation plus Web:

const B = (props) => <Text style={{fontWeight: 'bold'}}>{props.children}</Text>
<Text>I am in <B>bold</B> yo.</Text>
pseudo
la source
2
cela ne fonctionne pas pour les variables qui ont une valeur de chaîne
Ismail Iqbal
4
comme un Web, je dirais - utiliser <Strong>au lieu de <B>:)
pie6k
Ce sera un crash sur Ios et Android, vous ne pouvez pas utiliser la balise <Text> dans <Text>
Hakan
Pourriez-vous ajouter const B = this.Baurender
Idan
@Hakan - reactnative.dev/docs/text - Je voulais juste souligner que les balises <Text> imbriquées font actuellement partie de la spécification.
ejb
8

vous pouvez utiliser https://www.npmjs.com/package/react-native-parsed-text

import ParsedText from 'react-native-parsed-text';
 
class Example extends React.Component {
  static displayName = 'Example';
 
  handleUrlPress(url) {
    LinkingIOS.openURL(url);
  }
 
  handlePhonePress(phone) {
    AlertIOS.alert(`${phone} has been pressed!`);
  }
 
  handleNamePress(name) {
    AlertIOS.alert(`Hello ${name}`);
  }
 
  handleEmailPress(email) {
    AlertIOS.alert(`send email to ${email}`);
  }
 
  renderText(matchingString, matches) {
    // matches => ["[@michel:5455345]", "@michel", "5455345"]
    let pattern = /\[(@[^:]+):([^\]]+)\]/i;
    let match = matchingString.match(pattern);
    return `^^${match[1]}^^`;
  }
 
  render() {
    return (
      <View style={styles.container}>
        <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},
            ]
          }
          childrenProps={{allowFontScaling: false}}
        >
          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. foo@gmail.com
          And the magic number is 42!
          #react #react-native
        </ParsedText>
      </View>
    );
  }
}
 
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
 
  url: {
    color: 'red',
    textDecorationLine: 'underline',
  },
 
  email: {
    textDecorationLine: 'underline',
  },
 
  text: {
    color: 'black',
    fontSize: 15,
  },
 
  phone: {
    color: 'blue',
    textDecorationLine: 'underline',
  },
 
  name: {
    color: 'red',
  },
 
  username: {
    color: 'green',
    fontWeight: 'bold'
  },
 
  magicNumber: {
    fontSize: 42,
    color: 'pink',
  },
 
  hashTag: {
    fontStyle: 'italic',
  },
 
});

Ahmad Moussa
la source
1
Merci d'avoir partagé ParsedText! Brilliant
Monero Jeanniton
Bienvenue les gars. Happy coding
Ahmad Moussa
5

Utilisez cette bibliothèque native React

À installer

npm install react-native-htmlview --save

Utilisation de base

 import React from 'react';
 import HTMLView from 'react-native-htmlview';

  class App extends React.Component {
  render() {
   const htmlContent = 'This is a sentence <b>with</b> one word in bold';

  return (
   <HTMLView
     value={htmlContent}
   />    );
  }
}

Prend en charge presque toutes les balises html.

Pour une utilisation plus avancée comme

  1. Gestion des liens
  2. Rendu d'élément personnalisé

Afficher ce Lisez - moi

Ismail Iqbal
la source
3

Ce n'est pas dans un champ de texte comme demandé, mais encapsuler des éléments de texte séparés dans une vue donnerait le résultat souhaité. Cela peut être utilisé si vous ne souhaitez pas ajouter une autre bibliothèque à votre projet uniquement pour styliser quelques textes.

<View style={{flexDirection: 'row'}}>
 <Text style={{fontWeight: '700', marginRight: 5}}>Contact Type:</Text>
 <Text>{data.type}</Text>
</View>

Cela résulterait comme suit

entrez la description de l'image ici

Céa
la source
1

entrez la description de l'image ici

Je suis un mainteneur de react-native-spannable-string

Le <Text/>composant imbriqué avec un style personnalisé fonctionne bien mais la maintenabilité est faible.

Je vous suggère de créer une chaîne spannable comme celle-ci avec cette bibliothèque.

SpannableBuilder.getInstance({ fontSize: 24 })
    .append('Using ')
    .appendItalic('Italic')
    .append(' in Text')
    .build()
Studio MJ
la source
0

Vous pouvez simplement imbriquer les composants Texte avec le style requis. Le style sera appliqué avec le style déjà défini dans le premier composant Texte.

Exemple:

 <Text style={styles.paragraph}>
   Trouble singing in. <Text style={{fontWeight: "bold"}}> Resolve</Text>
 </Text>
Sidharth V
la source
0

L'imbrication de composants de texte n'est pas possible pour le moment, mais vous pouvez envelopper votre texte dans une vue comme celle-ci:

<View style={{flexDirection: 'row', flexWrap: 'wrap'}}>
    <Text>
        {'Hello '}
    </Text>
    <Text style={{fontWeight: 'bold'}}>
        {'this is a bold text '}
    </Text>
    <Text>
        and this is not
    </Text>
</View>

J'ai utilisé les chaînes entre crochets pour forcer l'espace entre les mots, mais vous pouvez également y parvenir avec marginRight ou marginLeft. J'espère que ça aide.

Esteban Dib
la source
0

par exemple!

const TextBold = (props) => <Text style={{fontWeight: 'bold'}}>Text bold</Text>

<Text> 123<TextBold/> </Text>

Anh Tuấn Lê
la source
0
<Text>
    <Text style={{fontWeight: "bold"}}>bold</Text>
    normal text
    <Text style={{fontStyle: "italic"}}> italic</Text>
</Text>
Naveen Jadala
la source
Ajoutez une explication pour votre code serait préférable
keikai
-1

Texte en gras:

<Text>
  <Text>This is a sentence</Text>
  <Text style={{fontWeight: "bold"}}> with</Text>
  <Text> one word in bold</Text>
</Text>

Texte italique:

<Text>
  <Text>This is a sentence</Text>
  <Text style={{fontStyle: "italic"}}> with</Text>
  <Text> one word in italic</Text>
</Text>
Monero Jeanniton
la source