Chuỗi kết xuất ReactJS với khoảng trắng không ngắt


87

Tôi có một số đạo cụ có một chuỗi có thể chứa các ký tự như &. Nó cũng chứa khoảng trắng. Tôi muốn thay thế tất cả các khoảng trắng bằng  .

Có cách nào dễ dàng để tôi có thể làm điều này không? Hãy nhớ rằng tôi không thể kết xuất bằng cú pháp này:

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

bởi vì trước tiên tôi sẽ phải thay thế bất kỳ thực thể HTML nào bằng đánh dấu của chúng. Tôi không muốn phải làm điều này, có vẻ như mức độ quá thấp.

Có cách nào tôi có thể làm điều này?


1
tại sao điều này liên quan đến phản ứng?
Marcelo Bezerra

1
Nó không hoàn toàn rõ ràng bạn muốn làm gì. Bạn có muốn chỉ thay thế tất cả các khoảng trắng bằng &nbspl;, bạn muốn hiển thị các thẻ HTML theo nghĩa đen hay bạn muốn làm gì khác?
Bojangle

Nó phụ thuộc vào thời điểm myValue có thể truy cập. Bạn có thể đợi nó trong chức năng vòng đời thích hợp, phân tích cú pháp nó và đặt parsedcờ ngăn nhiều phân tích cú pháp.
David Hellsing

nếu bạn muốn kết xuất & nbsp; không thoát đến dom với react, bạn sẽ cần sử dụng dangerouslySetInnerHTMLphương thức này. Tôi thực sự không biết cách giải quyết vấn đề đó vì bạn có thể sử dụng javascript để tạo chuỗi thay thế khoảng trắng bằng & nbsp; nhưng nếu không sử dụng dangerouslySetInnerHTMLphương thức này, chúng sẽ được thoát bằng react.
Mike Driver

Câu trả lời:


233

Thay vì sử dụng &nbsp;thực thể HTML, bạn có thể sử dụng ký tự Unicode &nbsp;đề cập đến (U + 00A0 KHÔNG GIAN NGẮT):

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

3
Xin lưu ý rằng ký tự unicode bạn đang sử dụng ở trên đang bị các trình duyệt đưa vào danh sách đen vì bị lạm dụng bởi các âm mưu lừa đảo. Xem kb.mozillazine.org/Network.IDN.blacklist_chars
Perry Tew

2
@BenAlpert Điểm tốt. Đúng. Điểm rất tốt. Chỉ cần IDN địa chỉ theo hiểu biết của tôi.
Perry Tew

đơn giản mà hiệu quả. thx @BenAplert ngay cả sau 3 năm đăng bài.
YASH DAVE

Điều này đã làm việc cho tôi khi không có gì khác đã làm. Cảm ơn đã giúp đỡ!
davidawad

2
Danh sách đen đó áp dụng cho tên miền, không phải mã HTML.
JW.

34

Tôi biết đây là một câu hỏi cũ và điều này không thực hiện chính xác những gì bạn yêu cầu, nhưng thay vì chỉnh sửa chuỗi, những gì bạn muốn đạt được có thể được giải quyết tốt hơn bằng cách sử dụng white-space: nowrapthuộc tính CSS :

Trong html:

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

Trong phản ứng:

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

Cảm ơn bạn! Đây là câu trả lời tốt hơn. Và trong trường hợp của tôi (một loạt các liên kết tôi không muốn bao bọc, nhưng tôi cũng không muốn nằm trên một dòng), tôi đã thêm một :: sau {content: ''; white-space: normal}
chad steele

0

Nếu bạn muốn hiển thị một xml đẹp:

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

Rất khó để gõ vào đây mà nó không biến mất, vì vậy tôi thêm một chút khoảng trắng để mọi người có thể nhìn thấy nó. Nếu bạn xóa khoảng trắng khỏi thẻ này <nbsp />, thì bạn sẽ có thể sử dụng khoảng trắng không ngắt trong React.

React chuyển thẻ JSX này thành một không gian liên tục. Kỳ quặc: Điều này cũng phải được sử dụng trên cùng một dòng với văn bản bạn muốn khoảng trắng. Ngoài ra, các khoảng trắng không ngắt với thẻ này không ngăn xếp trong React.


Không hoạt động: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

Để xóa khoảng trắng giữa chuỗi, mã dưới đây phù hợp với tôi. ví dụ: "afee dd" kết quả: "afeedd"

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

-4

Vì vậy, bạn có một giá trị như "Xin chào thế giới" và chúng tôi sẽ nói rằng nó ở trong this.props.value.

Bạn có thể làm được việc này:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.