25

I got the following problem, I read data string from an API which contains new line characters \n and I want to display them correctly in my template.

But when I do something like:

<p>{{ mytext }}</p>

The text is display with \n characters in it like normal text.

The text string from the response is in the format of "Hello, \n what's up? \n My name is Joe".

What am I doing wrong here?

Tobias Schäfer
  • 1,330
  • 2
  • 17
  • 35

4 Answers4

63

Not even a vue issue you could simply use CSS and apply white-space: pre; to the content. You shouldn't need an additional package for this.

new Vue({
  el: '#app',
  data: {
    text: 'Hello Vue.\nThis is a line of text.\nAnother line of text.\n'
  }
})
.pre-formatted {
  white-space: pre;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.15/vue.js"></script>

<div id="app">
  <div class="pre-formatted">{{ text }}</div>
</div>
Lawrence Cherone
  • 46,049
  • 7
  • 62
  • 106
  • 10
    Note that if you need the text wrapped you can use ```white-space: pre-wrap;``` [more details](https://stackoverflow.com/questions/248011/how-do-i-wrap-text-in-a-pre-tag) – alemangui Mar 31 '20 at 16:28
  • 2
    `white-space: pre-wrap;` did the trick for me! Note that as it seems `white-space: break-spaces;` does a very similar thing. In fact, I couldn't distinguish it. – Fusseldieb Jul 24 '20 at 12:42
7

Use the <pre></pre> tag to preserve the preformated text. More info MDN Pre tag docs

new Vue({
  el: '#app',
  data: {
    text: 'Hello, \n what\'s up? \n My name is Joe'
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.15/vue.js"></script>

<div id="app">
  <pre>{{ text }}</pre>
</div>
DobleL
  • 3,808
  • 14
  • 20
  • 3
    Don't link to w3schools for new users- the site has a history of having outdated material. MDN Docs should be used instead https://developer.mozilla.org/en-US/docs/Web/HTML/Element/pre – Andrew Lohr Mar 13 '18 at 19:54
  • 2
    Unfortunately the `
    ` tag overrides font styles, so this isn't a CSS-free solution.
    – R-D May 01 '20 at 15:31
1

I was facing same issus i was using vue-nl2br

check it here

Install

npm install --save vue-nl2br

Usage

import Nl2br from 'vue-nl2br'

Vue.component('nl2br', Nl2br)

View

<nl2br tag="p" :text="`myLine1\nmyLine2`" />

result :

<p>myLine1<br>myLine2</p>
0

This is a solution to split string in multiple <div> elements.

I use this also with i18n plugin and I like it because I don't need to touch CSS.

new Vue({
  el: '#app',
  data: {
    text: ['Hello Vue.','This is a line of text.','Another line of text.','']
  }
})
.pre-formatted {
  white-space: pre;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.15/vue.js"></script>

<div id="app">
  <div v-for="text of text">{{ text }}</div>
</div>
Migio B
  • 405
  • 1
  • 6
  • 22