React Native agregue negrita o cursiva a palabras sueltas en el campo <Texto>

113

¿Cómo puedo poner una sola palabra en un campo de texto en negrita o cursiva? Algo así:

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

Si creo un nuevo campo de texto para el carácter en negrita, lo separará en otra línea, por lo que seguramente esa no es la forma de hacerlo. Sería como crear una etiqueta <p> dentro de una etiqueta <p> solo para poner una palabra en negrita.

Hasen
fuente

Respuestas:

210

Puede usarlo <Text>como un contenedor para sus otros componentes de texto. Este es un ejemplo:

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

He aquí un ejemplo .

Slowyn
fuente
1
Sí, pero como dije, eso no funcionaría porque cada elemento de texto está separado en diferentes líneas.
Hasen
1
Si divide su <Text style={{fontWeight: 'bold'}}> with</Text>en tres líneas separadas, perderá el espacio de espacio inicial, por lo que es posible que desee utilizar {' with'}para asegurarse de tenerlo siempre.
Christoffer Karlsson
1
Solo quiero señalar que si puedes styled-componentspasar una negrita property.
Crazy Barney
2
@KonstantinYakushin Link está roto, para su información
kevlarjacket
@kevlarjacket Sí. Desafortunadamente, el servicio rnplay está cerrado. Intentaré actualizar el ejemplo.
Slowyn
60

Para una sensación más similar a la de una web:

const B = (props) => <Text style={{fontWeight: 'bold'}}>{props.children}</Text>
<Text>I am in <B>bold</B> yo.</Text>
Mella
fuente
2
esto no funciona para variables que tienen un valor de cadena
Ismail Iqbal
4
como una web como yo diría - use en <Strong>lugar de <B>:)
pie6k
Se bloqueará en Ios y Android, no puede usar la etiqueta <Text> dentro de <Text>
Hakan
¿Podría agregar const B = this.Balrender
Idan
@Hakan - reactnative.dev/docs/text - Solo quería señalar que las etiquetas <Text> anidadas son en realidad parte de la especificación ahora.
ejb
8

puede utilizar 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
fuente
1
¡Gracias por compartir ParsedText! Brilliant
Monero Jeanniton
Bienvenidos chicos. Codificación feliz
Ahmad Moussa
5

Utilice esta biblioteca nativa de reacción

Instalar

npm install react-native-htmlview --save

Uso básico

 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}
   />    );
  }
}

Soporta casi todas las etiquetas html.

Para un uso más avanzado como

  1. Manejo de enlaces
  2. Representación de elementos personalizados

Ver este archivo Léame

Ismail Iqbal
fuente
3

No está en un campo de texto como se solicitó, pero si envuelve elementos de texto separados en una vista, obtendría el resultado deseado. Esto se puede usar si no desea agregar otra biblioteca a su proyecto solo para diseñar algunos textos.

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

Resultaría de la siguiente manera

ingrese la descripción de la imagen aquí

Cea
fuente
1

ingrese la descripción de la imagen aquí

Soy un mantenedor de react-native-spannable-string

El <Text/>componente anidado con estilo personalizado funciona bien, pero el mantenimiento es bajo.

Le sugiero que cree una cadena extensible como esta con esta biblioteca.

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

Puede simplemente anidar los componentes de Texto con el estilo requerido. El estilo se aplicará junto con el estilo ya definido en el primer componente Texto.

Ejemplo:

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

Ahora no es posible anidar componentes de texto, pero puede ajustar su texto en una vista como esta:

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

Usé las cadenas dentro de los corchetes para forzar el espacio entre palabras, pero también puedes lograrlo con marginRight o marginLeft. Espero eso ayude.

Esteban Dib
fuente
0

¡por ejemplo!

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

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

Anh Tuấn Lê
fuente
0
<Text>
    <Text style={{fontWeight: "bold"}}>bold</Text>
    normal text
    <Text style={{fontStyle: "italic"}}> italic</Text>
</Text>
Naveen Jadala
fuente
Sería preferible agregar alguna explicación para su código
keikai
-1

Texto en negrita:

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

Texto en cursiva:

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