Vue Newline to Line Break Component
vue-nl2br is a Vue.js component designed to automatically convert newline characters (`\n`) within a string prop into HTML `<br>` tags, effectively rendering multiline text with line breaks in the browser. It explicitly targets Vue 2 (`^2.0.0`) environments. The current stable version is 1.1.1, with the last known update in August 2021, indicating a very slow release cadence, if any, for future feature development. A key differentiator is its explicit discussion against simply using CSS `white-space: pre;`, suggesting it's intended for scenarios where semantic `<br>` tags are preferred or required over CSS-driven formatting, or when the `white-space` property causes unwanted side effects. It provides options for both global and local component registration and supports custom HTML tags and class names for the wrapping element.
Common errors
-
Failed to resolve component: nl2br
cause The `nl2br` component has not been correctly registered globally or locally within the Vue application.fixEnsure you either call `Vue.component('nl2br', Nl2br)` for global registration (typically in your main.js/ts) or include `Nl2br` in the `components` option of your parent Vue component for local registration. -
Property 'text' is missing in type '{ tag: string; }' but required in type 'Nl2brProps'.cause The `text` prop is defined as required in the component's TypeScript types but was omitted in the template usage.fixAlways provide the `text` prop to the `nl2br` component, even if it's an empty string or `null` (unless using `v-if` to conditionally render).
Warnings
- breaking This package is designed for Vue 2 (`^2.0.0`) and is not directly compatible with Vue 3. Attempting to use it in a Vue 3 project will likely result in runtime errors related to component registration or rendering.
- gotcha When the `text` prop is empty or `null`, `vue-nl2br` will render an empty HTML tag (e.g., `<p></p>`). If you prefer to render nothing at all in such cases, you must explicitly use a `v-if` directive on the component.
- gotcha Consider if `white-space: pre-wrap;` CSS property on a containing element meets your requirements before using `vue-nl2br`. This component inserts semantic `<br>` tags directly into the DOM, which may have different implications for accessibility, SEO, or layout compared to purely presentational CSS.
Install
-
npm install vue-nl2br -
yarn add vue-nl2br -
pnpm add vue-nl2br
Imports
- Nl2br
import { Nl2br } from 'vue-nl2br'import Nl2br from 'vue-nl2br'
- Vue.component
const Nl2br = require('vue-nl2br'); Vue.component('nl2br', Nl2br)import Vue from 'vue'; import Nl2br from 'vue-nl2br'; Vue.component('nl2br', Nl2br) - Component Type
import { Nl2br } from 'vue-nl2br'import Nl2br, { Nl2brProps } from 'vue-nl2br'
Quickstart
<!-- MyComponent.vue -->
<template>
<div>
<h1>User Generated Content</h1>
<nl2br
v-if="longText"
tag="p"
:text="longText"
class-name="content-paragraph"
/>
<p v-else>No content to display.</p>
<h2>Example with multiple lines:</h2>
<nl2br tag="div" :text="`This is the first line.\nThis is the second line.\nAnd a final line.`" />
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import Nl2br from 'vue-nl2br';
export default Vue.extend({
name: 'MyComponent',
components: {
Nl2br,
},
data() {
return {
longText: 'Hello world!\nThis is some text that should\nbreak into multiple lines.',
};
},
mounted() {
// Simulate dynamic text loading
setTimeout(() => {
this.longText = 'Updated text after a delay.\nIt still respects newlines.\nEnjoy!';
}, 2000);
}
});
</script>
<style scoped>
.content-paragraph {
font-family: sans-serif;
color: #333;
line-height: 1.5;
}
</style>