ReactJS แสดงสตริงที่มีช่องว่างที่ไม่ทำลาย


90

ฉันมีอุปกรณ์ประกอบฉากบางอย่างที่มีสตริงที่อาจมีอักขระเช่น & นอกจากนี้ยังมีช่องว่าง  ฉันต้องการที่จะแทนที่ช่องว่างทั้งหมดที่มี

มีวิธีง่ายๆที่ฉันสามารถทำได้หรือไม่? โปรดทราบว่าฉันไม่สามารถแสดงผลโดยใช้ไวยากรณ์นี้ได้:

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

เพราะก่อนอื่นฉันจะต้องแทนที่เอนทิตี HTML ใด ๆ ด้วยมาร์กอัป ฉันไม่ต้องการที่จะทำเช่นนี้ดูเหมือนว่าระดับต่ำเกินไป

มีวิธีที่ฉันสามารถทำได้หรือไม่?


1
เหตุใดจึงเกี่ยวข้องกับการตอบสนอง
Marcelo Bezerra

1
ยังไม่ชัดเจนว่าคุณต้องการทำอะไร คุณต้องการเพียงแค่แทนที่ช่องว่างทั้งหมด&nbspl;คุณต้องการแสดงแท็ก HTML ตามตัวอักษรหรือมีอย่างอื่นที่คุณต้องการทำ?
Bojangles

ขึ้นอยู่กับว่าจะสามารถเข้าถึงได้เมื่อ myValueใด คุณสามารถรอได้ในฟังก์ชันอายุการใช้งานที่เหมาะสมแยกวิเคราะห์และตั้งค่าparsedสถานะที่ป้องกันการแยกวิเคราะห์หลายรายการ
David Hellsing

หากคุณต้องการแสดงผล & nbsp; ไม่ใช้ค่า Escape ไปยัง Dom ด้วยการตอบสนองคุณจะต้องใช้dangerouslySetInnerHTMLวิธีนี้ ฉันไม่เห็นวิธีการดังกล่าวเนื่องจากคุณสามารถใช้จาวาสคริปต์เพื่อสร้างสตริงแทนที่ช่องว่างด้วย & nbsp; แต่หากไม่ใช้dangerouslySetInnerHTMLวิธีการเหล่านี้จะถูกหลีกหนีโดยการตอบสนอง
Mike Driver

คำตอบ:


238

แทนที่จะใช้&nbsp;เอนทิตี HTML คุณสามารถใช้อักขระ Unicode ซึ่ง&nbsp;อ้างถึง (U + 00A0 NON-BREAKING SPACE):

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

3
โปรดทราบว่าอักขระ Unicode ที่คุณใช้ข้างต้นกำลังถูกขึ้นบัญชีดำโดยเบราว์เซอร์เนื่องจากการละเมิดโดยใช้รูปแบบฟิชชิง ดูkb.mozillazine.org/Network.IDN.blacklist_chars
Perry Tew

2
@ BenAlpert จุดดี. ใช่. จุดที่ดีมาก เพียง IDN ที่อยู่เพื่อความรู้ของฉัน
Perry Tew

เรียบง่าย แต่มีประสิทธิภาพ ขอบคุณ @BenAplert หลังจาก 3 ปีของการโพสต์
YASH DAVE

สิ่งนี้ใช้ได้ผลสำหรับฉันเมื่อไม่มีอะไรทำ ขอบคุณสำหรับความช่วยเหลือ!
davidawad

2
บัญชีดำนั้นใช้กับชื่อโดเมนไม่ใช่รหัส HTML
.

35

ฉันรู้ว่านี่เป็นคำถามเก่าและสิ่งนี้ไม่ได้ทำตามที่คุณขอ แต่แทนที่จะแก้ไขสตริงสิ่งที่คุณต้องการบรรลุอาจได้รับการแก้ไขให้ดีขึ้นโดยใช้white-space: nowrapแอตทริบิวต์CSS :

ใน html:

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

ในการตอบสนอง:

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

ขอขอบคุณ! นี่คือคำตอบที่ดีกว่า และในกรณีของฉัน (ลิงก์จำนวนมากฉันไม่ต้องการตัด แต่ฉันก็ไม่ต้องการในบรรทัดเดียว) ฉันเพิ่ม :: after {content: ''; white-space: normal}
chad steele

0

หากคุณต้องการแสดง xml สวย ๆ :

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

มันยากมากที่จะพิมพ์ตรงนี้โดยที่มันไม่หายไปดังนั้นฉันจึงเพิ่มช่องว่างเล็กน้อยเพื่อให้ทุกคนเห็น หากคุณลบช่องว่างออกจากแท็ก <nbsp /> นี้คุณจะสามารถใช้ช่องว่างที่ไม่ทำลายใน React

React แปลแท็ก JSX นี้เป็นช่องว่างที่ไม่ทำลาย นิสัยแปลก ๆ : สิ่งนี้ต้องใช้ในบรรทัดเดียวกับข้อความที่คุณต้องการเว้นวรรค นอกจากนี้ช่องว่างที่ไม่ทำลายด้วยแท็กนี้จะไม่ซ้อนกันใน React


ไม่ทำงาน:Warning: The tag <nbsp> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter
Ross Attrill

0

ในการลบช่องว่างระหว่างสตริงโค้ดด้านล่างใช้ได้กับฉัน เช่น: "afee dd" ผลลัพธ์: "afeedd"

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

-4

เพื่อให้คุณมีค่าเช่นนี้ "สวัสดีชาวโลก" this.props.valueและเราจะบอกว่ามันเป็นใน

คุณสามารถทำได้:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.