Bölünemez boşluklarla ReactJS oluşturma dizesi


90

& Gibi karakterler içerebilen bir dizeye sahip bazı sahne öğelerim var. Ayrıca boşluklar içerir. Tüm boşlukları ile değiştirmek istiyorum  .

Bunu yapmanın kolay bir yolu var mı? Bu sözdizimini kullanarak sadece render edemeyeceğimi unutmayın:

<div dangerouslySetInnerHTML={{__html: myValue}} />

çünkü ilk önce herhangi bir HTML varlığını işaretleriyle değiştirmem gerekirdi. Bunu yapmak zorunda kalmak istemiyorum, çok düşük seviyede görünüyor.

Bunu yapmamın bir yolu var mı?


1
bu neden tepki ile ilgili?
— Marcelo Bezerra

1
Ne yapmak istediğiniz tam olarak belli değil. Eğer istiyor musunuz sadece tüm boşlukların yerine &nbspl;tam anlamıyla ekran HTML etiketleri istediğinizde veya orada bir şey yapmak istediğiniz başka bir do?
— Bojangles

Ne zaman myValue erişilebilir olduğuna bağlıdır . Uygun yaşam döngüsü işlevinde bekleyebilir, ayrıştırabilir ve parsedçoklu ayrıştırmayı önleyen bir bayrak ayarlayabilirsiniz .
— David Hellsing

işlemek istiyorsanız & nbsp; react ile doma kaçmadıysanız, dangerouslySetInnerHTMLyöntemi kullanmanız gerekecek . Boşlukları & nbsp; ile değiştirerek bir dize oluşturmak için javascript kullanabileceğinizden, bunun tam olarak bir yolunu göremiyorum ancak dangerouslySetInnerHTMLyöntemi kullanmadan reaksiyonla bunlardan kaçılacaktır.
— Mike Driver

Yanıtlar:


238

&nbsp;HTML varlığını kullanmak yerine, &nbsp;(U + 00A0 KIRILMAYAN ALAN) 'a atıfta bulunan Unicode karakterini kullanabilirsiniz :

<div>{myValue.replace(/ /g, "\u00a0")}</div>

3
Lütfen yukarıda kullandığınız unicode karakterinin, kimlik avı düzenleri tarafından kötüye kullanılması nedeniyle tarayıcılar tarafından kara listeye alındığını unutmayın. Bakınız kb.mozillazine.org/Network.IDN.blacklist_chars
— Perry Tew

2
@BenAlpert İyi nokta. Evet. Çok güzel bir nokta. Bildiğim kadarıyla sadece IDN adresleri.
— Perry Tew

basit ama etkili. thx @BenAplert 3 yıl sonra bile.
— YASH DAVE

Bu benim için başka hiçbir şey yapmadığında çalıştı. Yardım için teşekkürler!
— davidawad

2
Bu kara liste, HTML kodu için değil, alan adları için geçerlidir.
— JW.

35

Bunun eski bir soru olduğunu biliyorum ve bu tam olarak istediğiniz şeyi yapmıyor, ancak dizeyi düzenlemek yerine, elde etmek istediğiniz şey muhtemelen CSS white-space: nowrapözelliği kullanılarak daha iyi çözülür :

Html olarak:

<div style="white-space: nowrap">This won't break lines</div>

Tepki olarak:

<div style={{ whiteSpace: 'nowrap' }}>{myValue}</div>

Teşekkür ederim! Bu daha iyi cevap. Ve benim durumumda (kaydırmak istemiyorum ama aynı zamanda tek satırda da istemiyorum), {content: ''; white-space: normal}
— chad steele

0

Güzel bir xml görüntülemek istiyorsanız:

var str = "<test>\n\t\t<value>1</value>\n</test>\n".replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\t/g, "\u00a0").replace(/\n/g, '<br/>');
return (
    <div dangerouslySetInnerHTML={{__html: str}} ></div>
)

0

Kaybolmadan buraya yazmak çok zor, bu yüzden herkesin görebilmesi için biraz boşluk ekliyorum. Bu <nbsp /> etiketinden beyaz boşluğu kaldırırsanız, React'te bölünemez bir boşluk kullanabilirsiniz.

React, bu JSX etiketini bölünemez bir alana çevirir. Garip tuhaflık: Bu da boşluk bırakmak istediğiniz metinle aynı satırda kullanılmalıdır. Ayrıca, bu etikete sahip bölünemez boşluklar React'te istiflenmez.


Warning: The tag <nbsp> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter
— Çalışmıyor

0

Dizeler arasındaki boşluğu kaldırmak için aşağıdaki kod benim için çalışıyor. örneğin: "afee gg" sonuç: "afeedd"

{myValue.replace (/ \ s + / g, '')}

-4

Yani "Merhaba dünya" gibi bir değeriniz var ve biz de içinde olduğunu söyleyeceğiz this.props.value.

Bunu yapabilirsiniz:

var parts = this.props.value.split(" "), array = [];
for (var i=0; i<parts.length; i++){
  // add the string
  array.push(<span key={i * 2}>{parts[i]}</span>);
  // add the nbsp
  array.push(<span key={i * 2 + 1}>&nbsp;</span>);
}

// remove the trailing nbsp
array.pop();

return <div>{array}</div>;

jsbin

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.