Як відобразити багаторядковий текстовий рядок у React


87

Припустимо, у мене є текстовий рядок, який містить розриви рядків, і я відображаю його так:

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

У HTML розриви рядків не відображаються як розриви рядків. Як мені це зробити в React? Я не хочу перетворювати на <br>теги та використовувати dangerouslySetInnerHTML. Чи є інший спосіб?


Якщо ви використовували <br>це, можливо проблема. Я помітив, що JS Transformer не подобається, якщо ви не використовуєте <br/>версію HTML 4.
steviesama

Щоб призначити змінній два рядки коду React, використовуйте дужки навколо обох рядків. ()
Vael Victus

1
Я виправив це за допомогою попереднього обгортання. Ось моя відповідь на подібне запитання: stackoverflow.com/a/55466235/5346095
JS dev

Відповіді:


74

Ви можете спробувати поставити divs для кожного рядка

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

Або

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

5
Мені подобається це. Я гадаю, я міг би з цього зробити і <MultilineText>компонент!
Аарон Білл

13
Чому ви використовуєте <div>для форматування текстових рядків? <p>видається більш семантично правильним.
kost

1
Це серйозно, як із цим слід боротися? Я розумію, що це працює, але це створює безлад у розмітці. Що робити, якщо користувач хоче скопіювати цей текст? Чесно кажучи, виною тут є обробка реакції, а не ваше рішення. Це може бути найкращим варіантом, але нічого собі.
kevincoleman

1
Навіть не думайте про реакцію, подумайте, як ви можете це впоратись, використовуючи HTML. Оптимальним рішенням є створення div, розміщення тегів BR або блокування span. На мою думку, це той самий сценарій для HTML / реагування.
Серхіо Флорес

245

Створіть новий клас CSS

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

Показуйте свій текст із цим класом CSS

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

Рендери з розривами рядків (послідовності пробілів згортаються в єдиний пробіл. Текст обертається, коли це необхідно). Подобається це:

One
Two
Three

Ви також можете розглянути попереднє обгортання. Більше інформації тут ( пробіл CSS ).


2
Це відмінна альтернатива відповіді, яку я прийняв, і заслуговує на підтримку, але я вважаю, що слід зазначити, що я її спробував і мав проблеми з компонуванням / переповненням / рендерингом; жоден з пробілів, здавалося, не працював правильно у всіх випадках, коли я потребував виправлення на той час, тоді як прийнята відповідь дала результат.
Аарон Білл

1
Напевно найкраща відповідь. Просто додайте CSS і не потрібно використовувати карту чи щось інше. Дякую.
Фредеріко Сезар

26

Ви можете використовувати властивість CSS "white-space: pre". Я думаю, що це найпростіший спосіб з цим впоратися.


Найкраща відповідь, imo: це проблема дисплея, тому в ідеалі з нею слід вирішувати css (не змінюючи html)
Богдан Д,

12
white-space:preмав такий самий ефект, як і white-space:nowrapдля мене, тобто текст переповнював його контейнер. Використання white-space:pre-wrapзамість цього вирішило.
rorymorris89

Тільки використання "pre" призведе до того, що текст перевищує / не обгортає контейнер. Використовуйте white-space: pre-line;замість цього.
Фредеріко Сезар

6

Ось найчистіше рішення (afaik):

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

Замість цього ви також можете використовувати <div style={{whiteSpace:"pre"}}>будь-який інший елемент блоку html (наприклад, spanабо pз цим атрибутом стилю)


Дякую після випробування різних способів, це єдине рішення, яке мені вдалося.
Саураб Рана


0

Рендеруйте розділений текст "Мій рядок перший \ nМой другий рядок \ nWhatvs ..." всередині звичайного HTML-тексту. Я знаю, що це працює, бо я щойно цим користувався! Зробіть текстове поле readOly, якщо потрібно, і відповідно оформіть стиль.


0

Ви можете використовувати -webkit-user-modify: read-write-plaintext-only;у своєму div. Він відформатує та зрозуміє такі речі, як \ n та \ p, наприклад.


0

Ви можете використовувати тег textarea html, пізніше ви можете додати стиль до тегу textarea. Це практично вирішує всі ваші проблеми, включаючи розриви рядків та пробіли вкладок. Cheerzz ...

наприклад: Ваш візуалізатор виглядатиме приблизно так, як показано нижче

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

Вихід:

One
Two
Three

0

String.rawЗамість цього ви можете безпечно запустити значення цього типу.

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

Ви також можете просто використовувати <pre>тег, який ефективно робить те саме, але менш семантично зрозумілий, якщо ви вже використовуєте його для інших цілей у своєму додатку.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.