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.

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 .


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>

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',
  },
 
});


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


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


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()

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>

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.


0

par exemple!

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

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


0
<Text>
    <Text style={{fontWeight: "bold"}}>bold</Text>
    normal text
    <Text style={{fontStyle: "italic"}}> italic</Text>
</Text>

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>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.