Cách hiển thị một chuỗi văn bản nhiều dòng trong React


83

Giả sử tôi có một chuỗi văn bản chứa các dấu ngắt dòng và tôi hiển thị nó như sau:

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

Trong HTML, dấu ngắt dòng không hiển thị như dấu ngắt dòng. Tôi nên làm điều này như thế nào trong React? Tôi không muốn chuyển đổi sang <br>thẻ và sử dụng dangerouslySetInnerHTML. Có cách nào khác không?


Nếu bạn đã sử dụng <br>đó có thể là vấn đề. Tôi nhận thấy rằng JS Transformer không thích nó trừ khi bạn sử dụng <br/>phiên bản HTML 4.
steviesama

Để gán hai dòng mã React cho một biến, hãy sử dụng dấu ngoặc đơn xung quanh cả hai dòng. ()
Vael Victus

1
Tôi đã sửa lỗi này bằng cách sử dụng pre-wrap. Đây là câu trả lời của tôi cho một câu hỏi tương tự: stackoverflow.com/a/55466235/5346095
JS dev

Câu trả lời:


73

Bạn có thể thử đặt div cho mỗi dòng

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

Hoặc là

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

5
Tôi thích điều này. Tôi nghĩ rằng tôi cũng có thể tạo ra một <MultilineText>thành phần từ nó!
Aaron Beall

13
Tại sao bạn lại sử dụng <div>để định dạng dòng văn bản? <p>có vẻ đúng hơn về mặt ngữ nghĩa.
kost

1
Đây có phải là nghiêm trọng như thế này nên được xử lý không? Tôi hiểu rằng điều này hoạt động, nhưng điều này tạo ra một mớ hỗn độn trong đánh dấu. Nếu người dùng muốn sao chép văn bản này thì sao? Công bằng mà nói, lỗi ở đây là ở cách xử lý của react, không phải ở giải pháp của bạn. Đây có thể là lựa chọn tốt nhất, nhưng wow.
kevincoleman

1
Đừng nghĩ đến phản ứng, hãy nghĩ cách bạn có thể xử lý việc này bằng HTML. Giải pháp tốt nhất cho đến nay là tạo div, đặt thẻ BR hoặc block span. Theo tôi, đây là kịch bản tương tự cho HTML / react.
Sergio Flores

236

Tạo một lớp CSS mới

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

Hiển thị văn bản của bạn với lớp CSS đó

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

Kết xuất bằng dấu ngắt dòng (Chuỗi khoảng trắng sẽ thu gọn thành một khoảng trắng duy nhất. Văn bản sẽ bao bọc khi cần thiết). Như thế này:

One
Two
Three

Bạn cũng có thể xem xét gói trước. Thông tin thêm tại đây ( Thuộc tính khoảng trắng CSS ).


2
Đây là một sự thay thế tuyệt vời cho câu trả lời mà tôi đã chấp nhận và xứng đáng nhận được sự ủng hộ, nhưng tôi cảm thấy tôi nên đề cập rằng tôi đã thử nó và gặp vấn đề với bố cục / tràn / kết xuất; không có tùy chọn khoảng trắng nào dường như hoạt động đúng trong tất cả các trường hợp tôi cần sửa chữa tại thời điểm đó, trong khi câu trả lời được chấp nhận đã làm được.
Aaron Beall

Để có câu trả lời chắc chắn nhất. Chỉ cần thêm CSS và không cần sử dụng bản đồ hay bất cứ thứ gì khác. Cảm ơn.
Frederiko Cesar

26

Bạn có thể sử dụng thuộc tính CSS "white-space: pre". Tôi nghĩ đây là cách dễ nhất để xử lý việc này.


Câu trả lời tốt nhất, imo: đây là một vấn đề của màn hình, vì vậy nó lý tưởng nên được xử lý trong css (không bằng cách thay đổi html)
Bogdan D

12
white-space:precó tác dụng tương tự như white-space:nowrapđối với tôi, tức là văn bản tràn vùng chứa của nó. Sử dụng white-space:pre-wrapthay thế đã giải quyết điều này.
rorymorris89

Chỉ sử dụng "pre" sẽ dẫn đến văn bản vượt quá / không bao bọc vùng chứa. Sử dụng white-space: pre-line;thay thế.
Frederiko Cesar

6

Đây là giải pháp sạch nhất (afaik):

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

Thay vào đó, bạn cũng có thể sử dụng <div style={{whiteSpace:"pre"}}>hoặc bất kỳ phần tử khối html nào khác (như spanhoặc pvới thuộc tính style này)


Cảm ơn sau khi thử nhiều cách khác nhau, đây là giải pháp duy nhất phù hợp với tôi.
Saurabh Rana

0

Hiển thị văn bản được phân tách của bạn "Dòng thứ nhất \ n Dòng thứ hai của tôi \ nWhatevs ..." bên trong một vùng văn bản html bình thường. Tôi biết nó hoạt động vì tôi vừa mới sử dụng nó hôm nay! Chỉ đọc vùng văn bản nếu bạn phải, và tạo kiểu cho phù hợp.


0

Bạn có thể sử dụng -webkit-user-modify: read-write-plaintext-only;trong div của mình. Nó sẽ định dạng và hiểu những thứ như \ n và \ p chẳng hạn.


0

Bạn có thể sử dụng thẻ textarea của html, sau này bạn có thể thêm kiểu cho thẻ textarea. Nó giải quyết khá nhiều vấn đề của bạn bao gồm ngắt dòng và khoảng cách tab. Cheerzz ...

ví dụ: Kết xuất của bạn sẽ giống như bên dưới

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

Đầu ra:

One
Two
Three

0

Hãy thử cái này,

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

0

Bạn có thể chạy một cách an toàn String.rawthay thế cho loại giá trị này.

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

Bạn cũng có thể chỉ sử dụng một <pre>thẻ thực hiện hiệu quả điều tương tự, nhưng nó kém rõ ràng hơn về mặt ngữ nghĩa nếu bạn đã sử dụng thẻ đó cho các mục đích khác trong ứng dụng của mình.


0
<div style={{ whiteSpace: "break-spaces" }}> {JSON.stringify(state, null, " ")} </div>
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.