Отображение символа новой строки в VueJS
Я создаю приложение примечания, в котором пользователи могут добавлять заметку, вводя многострочный текст в текстовое поле. Когда я сохраняю заметку в Firebase, она сохраняется с символами новой строки (\n), которые я хочу визуализировать.
Поэтому я написал фильтр, который заменяет эти символы на <br/>
и это отлично работает.
Хотя теперь мне нужно сделать мои данные с помощью {{{note.content}}}
и пользователь может ввести HTML, CSS и JS, которые будут выполнены.
Должен ли я использовать что-то вроде DOMPurify для проверки содержимого или есть способ безопасно отображать символы новой строки?
Ответы
Ответ 1
Оберните содержимое в элемент pre
.
Элемент <pre>
будет предварительно размещать пробелы внутри него, например:
This is followed by a newline,
not that you can tell
<br />
<br />
<pre>You can see the newline after me!
Woohoo!</pre>
Это приведет к:
This is followed by a newline, not that you can tell
You can see the newline after me!
Woohoo!
Таким образом, вам не нужно фильтровать новые строки.
Ответ 2
Как сказал @shelvacu, <pre>
html сохраняет пробелы.
Однако использование его имеет один серьезный недостаток: сам тег наследует множество ненужных стилей из фреймворков CSS, которые используются в проекте (например, Bootstrap).
Чтобы сохранить пробелы и избежать наследования каких-либо ненужных стилей, используйте:
<span style="white-space: pre;">Some whitespaced content</span>
что будет действовать так же, как <pre>
.
Имейте в виду, что white-space: pre
остается текст "как есть" - если вы хотите иметь дополнительный разрыв строки, когда это необходимо, используйте: white-space: pre-wrap
.
Смотрите: w3schools.com Свойство CSS с белым пространством
Ответ 3
После того, как я описал свою проблему, я понял, что использовать pre-tag, который предназначен для предварительно отформатированного текста. Этот тег будет уважать символы "\ t\n" и корректно выводит текст из коробки! Хотя предложения не разбиваются автоматически и переполняют ширину. С некоторым CSS я смог получить то же поведение, что и другие элементы.
html:
{{note.content}}
CSS:
.note pre {
white-space: pre-wrap;
word-wrap: break-word;
font-family: inherit;
}
Ответ 4
Используйте свойство CSS white-space: pre-line;
.
Как написать в Mozzila Doc для pre-line
значение:
Последовательности пустого пространства свернуты. Строки прерваны на новой строке символов, в <br>
, и по мере необходимости, чтобы заполнить строки.
Ответ 5
Не уверен, что я здесь что-то упустил, но все остальные ответы заставят вас иметь кучу лишних пробелов от отступов в вашем javascript-коде.
К счастью, свойство css "white-space" имеет еще одно значение, которое соответствует этой конкретной цели: "pre-line":
HTML:
<div v-model="myNote" class="note">
</div>
Вью:
this.myNote = 'My first line of text.
My second line of text.'
CSS:
.note {
white-space: pre-line;
}
Результат:
My first line of text.
My second line of text.
В отличие от результата с просто белым пространством: pre:
My first line of text.
My second line of text.
Ответ 6
Я могу заставить его работать с кавычками (')
<pre>{{textRenderedAsItIs}}</pre>
data():{
return{
textRenderedAsItIs:'Hello
World'
}
}