React'te çok satırlı bir metin dizesi nasıl oluşturulur


87

Satır sonları içeren bir metin dizem olduğunu ve bunu şu şekilde işlediğimi varsayalım:

render() {
    var text = "One\nTwo\nThree";
    return <div>{text}</div>;
}

HTML'de satır kesmeleri satır kesmeleri olarak işlenmez. Bunu React'te nasıl yapmalıyım? <br>Etiketlere dönüştürmek ve kullanmak istemiyorum dangerouslySetInnerHTML. Başka bir yolu var mı?


Eğer kullandıysanız <br>, sorun bu olabilir. <br/>HTML 4 sürümünü kullanmadığınız sürece JS Transformer'ın bundan hoşlanmadığını fark ettim .
steviesama

Bir değişkene iki satır React kodu atamak için, her iki satırın etrafında parantez kullanın. ()
Vael Victus

1
Bunu ön sarma kullanarak düzelttim. İşte benzer bir soruya cevabım: stackoverflow.com/a/55466235/5346095
JS dev

Yanıtlar:


74

Her satıra div koymayı deneyebilirsiniz

render() {
    return (<div>
        <div>{"One"}</div>
        <div>{"Two"}</div>
        <div>{"Three"}</div>
    </div>);
}

Veya

render() {
    var text = "One\nTwo\nThree";
    return (
    <div>
        {text.split("\n").map((i,key) => {
            return <div key={key}>{i}</div>;
        })}
    </div>);
}

5
Bunu severim. Sanırım ondan bir <MultilineText>parça da yapabilirim !
Aaron Beall

13
<div>Metin satırlarını biçimlendirmek için neden kullanasınız ? <p>anlamsal olarak daha doğru görünüyor.
Kost

1
Bu ciddi bir şekilde bu şekilde ele alınmalı mı? Bunun işe yaradığını anlıyorum, ancak bu işaretlemede bir karmaşa yaratıyor. Ya kullanıcı bu metni kopyalamak isterse? Dürüst olmak gerekirse, buradaki hata, çözümünüzde değil, tepkinin ele alınmasıdır. Bu en iyi seçenek olabilir ama vay canına.
kevincoleman

1
Tepki olarak düşünmeyin bile, bunu HTML kullanarak nasıl halledebileceğinizi düşünün. Şimdiye kadarki en iyi çözüm, div'leri oluşturmak, BR etiketleri veya blok aralıkları koymaktır. Bence bu, HTML / react için aynı senaryo.
Sergio Flores

245

Yeni bir CSS sınıfı oluşturun

.display-linebreak {
  white-space: pre-line;
}

Metninizi o CSS sınıfıyla görüntüleyin

render() {
  const text = 'One \n Two \n Three';
  return ( 
     <div className="display-linebreak"> 
        {text} 
     </div>
  );
}

Satır sonu içeren görseller (Beyaz boşluk dizileri tek bir beyaz alana daralır. Metin gerektiğinde kaydırılır). Bunun gibi:

One
Two
Three

Ayrıca önceden sarmayı da düşünebilirsiniz. Daha fazla bilgi burada ( CSS beyaz boşluk Özelliği ).


2
Bu, kabul ettiğim yanıta harika bir alternatif ve olumlu oyları hak ediyor, ancak bunu denediğimi ve düzen / taşma / oluşturma ile ilgili sorunlar yaşadığımı belirtmem gerektiğini düşünüyorum; Beyaz boşluk seçeneklerinin hiçbiri, o sırada bir düzeltmeye ihtiyaç duyduğum tüm durumlarda doğru çalışmıyor gibi görünürken, kabul edilen yanıt işe yaradı.
Aaron Beall

1
Elbette en iyi cevap. Sadece CSS'yi ekleyin ve haritayı veya başka bir şeyi kullanmaya gerek yok. Teşekkürler.
Frederiko Cesar

26

"White-space: pre" CSS özelliğini kullanabilirsiniz. Bunun üstesinden gelmenin en kolay yolu bu.


En iyi cevap, imo: bu bir görüntüleme sorunudur, bu nedenle ideal olarak css'de ele alınmalıdır (html'yi değiştirerek değil)
Bogdan D

12
white-space:prewhite-space:nowrapbenim için olduğu gibi aynı etkiye sahipti , yani metin kabından taştı. white-space:pre-wrapBunun yerine kullanmak bunu çözdü.
rorymorris89

Yalnızca "ön" ifadesinin kullanılması, metnin kapsayıcıyı aşmasına / sarmalanmamasına neden olur. white-space: pre-line;Bunun yerine kullanın .
Frederiko Cesar

6

İşte en temiz çözüm (afaik):

   render(){
      return <pre>
             Line 1{"\n"}
             Line 2{"\n"}
             Line 3{"\n"}
      </pre>
   }

Bunun yerine <div style={{whiteSpace:"pre"}}>, veya başka herhangi bir html blok öğesini de kullanabilirsiniz ( bu stil niteliği gibi spanveya pile)


Çeşitli yolları denedikten sonra teşekkürler, benim için çalışan tek çözüm bu.
Saurabh Rana

2

Bunu dene,

render() {
    var text = "One\nTwo\nThree";
    return <div style={{whiteSpace: 'pre-line'}}>{text}</div>;
}

0

Sınırlandırılmış metninizi "Birinci satırım \ nİkinci satırım \ nNeler ..." normal bir html metin alanı içinde oluşturun. Çalıştığını biliyorum çünkü bugün kullandım! Metin alanını yalnızca gerekiyorsa okunabilir hale getirin ve buna göre stil verin.


0

-webkit-user-modify: read-write-plaintext-only;Div'de kullanabilirsiniz . Örneğin \ n ve \ p gibi şeyleri biçimlendirecek ve anlayacaktır.


0

Html'nin textarea etiketini kullanabilir, daha sonra stili textarea etiketine ekleyebilirsiniz. Satır sonları ve sekme boşlukları dahil tüm sorunlarınızı hemen hemen çözer. Cheerzz ...

Örneğin: Renderiniz aşağıdaki gibi görünecek

render() {
    var text = "One\nTwo\nThree";
    return <textarea>{text}</textarea>;
}

Çıktı:

One
Two
Three

0

Bunun String.rawyerine bu tür bir değer için güvenle çalıştırabilirsiniz .

const text = String.raw`One
Two
Three
`
render() {
  return <div style={{ whiteSpace: "pre" }}>{text}</div>
}

<pre>Aynı şeyi etkili bir şekilde yapan bir etiketi de kullanabilirsiniz , ancak bunu zaten uygulamanızda başka amaçlar için kullanıyorsanız anlamsal olarak daha az açıktır.


0
<div style={{ whiteSpace: "break-spaces" }}> {JSON.stringify(state, null, " ")} </div>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.