#javascript #vue.js #whitespace #nl2br
#javascript #vue.js #пробелы #nl2br
Вопрос:
Как бы я показал пробел в vue.js . Прямо сейчас все друг за другом….
Уже пробовал это:
Но, похоже, ничего не работает. Пытаюсь сделать это уже 3 дня -_-.
Я использую Vue.js
1.0 и browserify
.
Большое спасибо!
—РЕДАКТИРОВАТЬ—
<template>
<div>
<bar :title="title" />
<div class="Row Center">
<div class="Message Center" v-if="!loading">
<div class="Message__body" v-if="messages">
<div class="Message__item__body" v-for="message in messages" v-link="{ name: 'Message', params: { message: message.slug }}">
<div class="Message__item__body_content">
<p class="Message__title">{{ message.subject }}</p>
</div>
<div class="Message__item__body_content">
<p>Reacties: {{ message.totalReactions }}</p>
</div>
<div class="Message__item__body_content">
<p>Door: {{ message.user.name }} {{ message.user.last_name }}</p>
</div>
</div>
<pagination :last-page="lastPage" :page="page" :name="Message" />
<p v-if="noMessages" class="Collection__none">Er zijn momenteel geen berichten voor het topic {{ topic.name }}.</p>
</div>
</div>
<div class="Loader" v-if="loading">
<grid-loader :loading="loading" :color="color" :size="size" />
</div>
</div>
<div class="Row center" v-if="!loading amp;amp; page == 1 amp;amp; topic">
<div>
<button type="submit" class="Btn Btn-main" v-link="{ name: 'NewMessage', params: { topic: topic.slug }}">Nieuw bericht</button>
</div>
</div>
</div>
</template>
<script>
import Bar from '../Shared/Bar.vue';
import Pagination from '../Shared/Pagination.vue';
import Topic from '../../Services/Topic/TopicService';
import { GridLoader } from 'vue-spinner/dist/vue-spinner.min.js';
export default {
components: { Bar, Pagination, GridLoader },
data () {
return {
title: 'Berichten',
messages: [],
topic: null,
noMessages: false,
loading: false,
color: "#002e5b",
page: 1,
lastPage: 1,
}
},
route: {
data ({ to }) {
this.loading = true;
this.page = to.query.page || 1;
Topic.show(this.$route.params.topic, this.page)
.then((data) => {
this.topic = data.data.topic;
if(!data.data.messages.data.length == 0) {
this.messages = data.data.messages.data;
this.lastPage = data.data.messages.last_page;
} else {
this.noMessages = true;
}
this.loading = false;
});
}
}
}
</script>
Когда я делаю это вот так:
<div class="Message__body__message">
<p>{{ message.message.split("n"); }}</p>
</div>
Это только добавляет запятые.
—РЕДАКТИРОВАТЬ—
Комментарии:
1. Если вы используете двойные усы для отображения текста в Vue, попробуйте
v-html
директиву. vuejs.org/guide/syntax.html#Raw-HTML
Ответ №1:
Установите стиль пробела контейнера на предварительную строку, как в:
<div style="white-space: pre-line;">{{textWithLineBreaks}}</div>
Комментарии:
1. Лучший ответ прямо здесь. Также рассмотрите возможность использования
white-space: pre-wrap
, поскольку он не сворачивает последовательные пробелы, какpre-line
.
Ответ №2:
Когда вы разбиваете сообщение, вы получаете несколько элементов данных, которые вы должны обрабатывать с помощью v-for
.
Но также смотрите ответ LMK, в котором вам не нужно разделять сообщение.
new Vue({
el: '#app',
data: {
message: `this is a message
it is broken across
several lines
it looks like a poem`
}
});
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.0.3/vue.min.js"></script>
<div id="app">
<template v-for="line in message.split('n')">{{line}}<br></template>
</div>
Комментарии:
1. Потрясающе! Отлично работает.
2. Одна вещь 🙂 Я получаю сообщение об ошибке консоли:
Error when evaluating expression "message.message.split('n')": TypeError: Cannot read property 'split' of undefined
3. У вас
message.message
всегда строка? Ошибка предполагает, что это не определено, по крайней мере, в каком-то случае.4. Похоже, что разрывы строк вызывают эту проблему (потому что они пустые). И это работает только с одним разрывом строки, если я добавляю несколько разрывов строк, он показывает только один! Пожалуйста, посмотрите мою правку для примера строки в моей базе данных, которая вызывает проблему.
5. Я отредактировал свой пример, чтобы включить несколько пустых строк. Проблема не в этом. Ошибка указывает на то, что он пытается вызвать
split
в качестве метода неопределенное значение. В какой-то момент, по какой-то причине,message.message
это не строка.
Ответ №3:
Вы должны преобразовать свои данные перед их отображением с помощью Vue.
const lines = stringWithLineBreaks.split('n')
// then render the lines
Я могу дать более конкретный ответ, если вы поделитесь кодом, с которым работаете.
Комментарии:
1. Спасибо за ваш ответ. Я добавил компонент над отображаемыми сообщениями (см. Редактирование)!
2. @Jamie мой ответ должен был быть похож на ответ Роя Дж. — мне кажется, это хорошо
3. Вы также могли бы использовать для этого вычисляемое свойство, например: lines() { return this.stringWithLineBreaks.split(‘n’); }