Используя Facebook React
. На странице настроек у меня есть textarea
многострочный текст, где пользователь может ввести многострочный текст (в моем случае адрес).
<textarea value={address} />
Когда я пытаюсь отобразить адрес, например {address}
, он не показывает разрывы строк и все находится в одной строке.
<p>{address}</p>
Есть идеи, как это решить?
javascript
reactjs
textarea
денислексик
источник
источник
Этого и следовало ожидать, вам нужно будет преобразовать символы новой строки (\ n) в разрывы строк HTML.
Статья об использовании в React : React Newline to break (nl2br)
Процитировать статью:
источник
....map(function (item, i) { return <span key={i}>{item}<br/></span> })
<br />
от рендеринга для последнего элемента:....map(function (item, i, arr) { return <span key={i}>{item}{ arr.length-1 === i ? null : <br/>}</span> })
. Обратите внимание, что я включил 3-й аргумент для.map()
[object Object]
Решение состоит в том, чтобы установить свойство
white-space
в элементе, отображающем содержимое вашегоtextarea
:источник
Предыдущее предложение Пита с автономным компонентом - отличное решение, хотя оно упускает одну важную вещь. Спискам нужны ключи . Я немного поправил, и моя версия (без предупреждений консоли) выглядит так:
const NewLineToBr = ({ children = '' }) => children.split('\n') .reduce((arr, line, index) => arr.concat( <Fragment key={index}> {line} <br /> </Fragment>, ), [])
Он использует фрагменты React 16
источник
Начиная с React 16 компонент может возвращать массив элементов, что означает, что вы можете создать такой компонент:
export default function NewLineToBr({children = ""}){ return children.split('\n').reduce(function (arr,line) { return arr.concat( line, <br /> ); },[]); }
который вы бы использовали вот так:
<p> <NewLineToBr>{address}</NewLineToBr> </p>
источник
Люблю версию webit. Я не знал о компоненте «Фрагмент», он очень полезен. Однако нет необходимости использовать метод уменьшения. Карты достаточно. Кроме того, списку нужны ключи в реакции, но использовать для него индекс из метода итерации - плохая привычка. eslint продолжал разбивать это в моем предупреждении, пока у меня не возникла ошибка путаницы. Так это выглядело бы так:
const NewLine = ({ children }) => children.split("\n").map(line => ( <Fragment key={uuidv4()}> {line} <br /> </Fragment> ));
источник