Best practice per l'aggiunta di spazi bianchi in JSX


96

Capisco come (e perché ) aggiungere uno spazio bianco in JSX, ma mi chiedo quale sia la migliore pratica o se qualche fa davvero la differenza?

Avvolgi entrambi gli elementi in una campata

<div className="top-element-formatting">
  <span>Hello </span>
  <span className="second-word-formatting">World!</span>
</div>

Aggiungili su una riga

  <div className="top-element-formatting">
    Hello <span className="second-word-formatting">World!</span>
  </div>

Aggiungi spazio con JS

<div className="top-element-formatting">
    Hello {" "}
    <span className="second-word-formatting">World!</span>
</div>

1
Non hai bisogno dell'estensione extra, React ha risolto problemi di vecchia data con i nodi di testo e il tuo secondo esempio va bene
Dominic

1
Non so se esista una "best practice" definita - certamente non è necessario racchiudere tutto in <span>tag, ma generalmente seguo solo pratiche HTML generiche quando mi preoccupo dello spazio bianco.
arthurakay

Risposte:


110

Poiché &nbspti fa avere spazi unificatori, dovresti usarlo solo dove necessario. Nella maggior parte dei casi, ciò avrà effetti collaterali indesiderati.

Le versioni precedenti di React, credo tutte quelle precedenti alla v14, si inserivano automaticamente <span> </span>quando si aveva una nuova riga all'interno di un tag.

Anche se non lo fanno più, questo è un modo sicuro per gestirlo nel tuo codice. A meno che tu non abbia uno stile che mira specificamente span(cattiva pratica in generale), questa è la strada più sicura.

Per il tuo esempio, puoi metterli insieme su una singola riga poiché è piuttosto breve. In scenari di linea più lunga, è così che dovresti probabilmente farlo:

  <div className="top-element-formatting">
    Hello <span className="second-word-formatting">World!</span>
    <span> </span>
    So much more text in this box that it really needs to be on another line.
  </div>

Questo metodo è anche sicuro contro gli editor di testo con taglio automatico.

L'altro metodo è usare {' '}che non inserisce tag HTML casuali. Ciò potrebbe essere più utile durante lo styling, l'evidenziazione degli elementi e la rimozione del disordine dal DOM. Se non hai bisogno della retrocompatibilità con React v14 o precedenti, questo dovrebbe essere il tuo metodo preferito.

  <div className="top-element-formatting">
    Hello <span className="second-word-formatting">World!</span>
    {' '}
    So much more text in this box that it really needs to be on another line.
  </div>

15

È possibile utilizzare lo spazio vuoto della proprietà css e impostarlo per il pre-wrapping dell'elemento div che lo racchiude.

div {
     white-space: pre-wrap;
}

Se il contenitore è flessibile, allora avrai bisogno di questa soluzione.
Curtis

Questo è l'unico non & nbsp; soluzione che ha funzionato per me!
Magnus

@ Magnus Sei il benvenuto, amico mio. Nessuna delle soluzioni a questa risposta ha effettivamente funzionato per il mio caso speciale.
i_code

10

Puoi aggiungere un semplice spazio bianco con virgolette: {" "}

Inoltre è possibile utilizzare letterali modello , che consentono di inserire, incorporare espressioni (codice all'interno di parentesi graffe):

`${2 * a + b}.?!=-` // Notice this sign " ` ",its not normal quotes.

In quale versione di React funziona per te? 15.6.2 sembra ignorarlo.
smhg

1
@smhg yo. non dipende dalla versione di reagire. il suo feautere di ecmascript, dattiloscritto. Puoi digitare il tuo modello nella console Chrome per verificare se il tuo modello è ok. Il problema può essere anche nelle impostazioni di Babele.
Vasyl Gutnyk

1
Stai confondendo i letterali del modello con le espressioni JSX. Per aggiungere uno spazio tramite JSX, è sufficiente inserire una stringa composta da un carattere spazio in un'espressione JSX . Il modo più semplice per farlo è {' '}. Non hai bisogno di letterali modello per questo, anche se funzionano (e così fa {" "}).
Dan Dascalescu

sì, era un errore di battitura un po 'confuso - corretto. Ad ogni modo, ne sono sicuro, il 99,9% delle persone qui sta cercando letterali modello :)
Vasyl Gutnyk

6

Tendo a usare &nbsp;

Non è carino ma è il modo meno confuso per aggiungere spazi bianchi che ho trovato e mi dà il controllo assoluto sulla quantità di spazi bianchi che aggiungo.

Se voglio aggiungere 5 spazi:

Hello&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span className="second-word-formatting">World!</span>

È facile identificare esattamente cosa sto cercando di fare qui quando torno al codice settimane dopo.


6
Non riesco a immaginare in pratica quale sarebbe un uso di 5 spazi unificatori che tipograficamente ha un senso, ma a parte questo caso è sbagliato da usare nella pratica. Se lo stai usando per il layout, dovresti usare invece CSS e se devi aggiungere uno spazio ma non richiederlo per essere univoco, ci sono molti altri spazi che hanno più senso tipografico. Vedere questa domanda, per esempio: stackoverflow.com/questions/8515365/...
guioconnor

2
@guioconnor cerca di estendere la tua immaginazione e pensa a un'applicazione di editor, ad esempio vscode, e scoprirai che ha un senso tipografico completo: D.
Dan

6

Ho cercato di pensare a una buona convenzione da utilizzare quando si inserisce il testo accanto a componenti su righe diverse e ho trovato un paio di buone opzioni:

<p>
    Hello {
        <span>World</span>
    }!
</p>

o

<p>
    Hello {}
    <span>World</span>
    {} again!
</p>

Ognuno di questi produce HTML pulito senza &nbsp;markup aggiuntivo o estraneo. Crea meno nodi di testo rispetto all'utilizzo {' '}e consente l'utilizzo di entità html dove {' hello &amp; goodbye '}non lo fa.


4

Non è necessario inserire &nbsp;o avvolgere il tuo spazio extra <span/>. Usa semplicemente il codice entità HTML per lo spazio -&#32;

Inserisci uno spazio regolare come entità HTML

<form>
  <div>Full name:</span>&#32;
  <span>{this.props.fullName}</span>
</form>

Nota a margine: oggi mi sono imbattuto in questo perché era più carino rompere il mio codice formattando l'entità spazio. Quando usi {""}, funziona su una riga da solo e non si rompe.
Astore

Stavo solo entrando per aggiungere questo alla mia risposta. Ho invece votato al contrario il tuo.
undefined

4

Puoi usare le parentesi graffe come espressione sia con virgolette doppie che virgolette singole per lo spazio, ad es.

{" "} or {' '}

Puoi anche utilizzare i letterali modello ES6, ad esempio

`   <li></li>` or `  ${value}`

Puoi anche usare & nbsp come sotto (all'interno dell'intervallo)

<span>sample text &nbsp; </span>

Puoi anche utilizzare & nbsp in dangerouslySetInnerHTML durante la stampa di contenuto html

<div dangerouslySetInnerHTML={{__html: 'sample html text: &nbsp;'}} />

2

usa {} o {``} o&nbsp; per creare spazio tra l'elemento span e il contenuto.

<b> {notif.name} </b> <span id="value"> &nbsp;{ notif.count }{``} </span>

1
nbsp = Spazio non divisibile, che è un carattere Unicode diverso dallo spazio normale e limita l'interruzione di riga. A volte è desiderabile, basta sottolineare che non è equivalente alle altre opzioni.
Beni Cherniavsky-Paskin

0

Se l'obiettivo è separare due elementi, puoi utilizzare CSS come di seguito:

A<span style={{paddingLeft: '20px'}}>B</span>

Questo offre solo una separazione visiva, non semantica. Se copi il risultato, stai ancora ottenendo AB, no A B.
ΔO 'deltazero'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.