EugeneOne77
@EugeneOne77
Laravel, Vue, Wordpress разработчик.

Как на vuejs сделать несколько элементов исчезающих рэндомно?

Я в vue новичок. Не могу сообразить. Надо сделать несколько сообщений, которые с разный скоростью будут исчезать.
т.е.
<message>Сообщение исчезнет через 5 секунд</message>
<message>Сообщение исчезнет через 20 секунд</message>
<message>Сообщение исчезнет через 15 секунд</message>

Пока все что я придумал что надо делать через v-for, у каждого сообщения делать v-if , поле visible , по таймауту буду его менять, оно будет исчезать. Но мне это кажется не оптимальным.
Есть какой-то другой способ вставлять кусок html/компонент в нужное место, и главное - убирать его. В идеале функция которая сама добавляет элемент, сама убирает его.
UPD: Как я сейчас сделал. (код с несущественной ошибкой, в удалении элемента из массива)
Компонент который вставляется.
<template>
    <div class="alert alert-dismissible fade show"
         v-bind:class="[currentClass]"
    >
        <button type="button" aria-hidden="true" class="close" data-dismiss="alert" aria-label="Close">
            <i class="nc-icon nc-simple-remove"></i>
        </button>
        <span>    {{ message }}</span>
    </div>
</template>
<script>
    export default {
        name: "Alert",
        props: [
            'message', 'currentClass'
        ],
    }
</script>


Как вставляется в html:
<alert
                    v-for="(item,index) in alertsArr"
                    :key="index"
                    :message="item.message"
                    :current-class="item.currentClass"
                ></alert>

И кусок кода, который это обрабатывает.
export default {
        components: {
            alert: Alert
        },

        methods: {
            setAlert() {
                this.addAlert("da", "alert-danger ", 1000);
            },
            addAlert(message, currentClass, time) {
                this.$set(this.alertsArr, this.indexOfAlerts, {
                    'message': message,
                    'currentClass': currentClass,
                });
                
                setTimeout(function () {
                    this.$delete(this.alertsArr, this.indexOfAlerts);
                //    console.info(this.alertsArr);
                    this.indexOfAlerts++;
                }.bind(this), time);
            },
        },
        data() {
            return {
                alertsArr: [],
                indexOfAlerts: 0,


Мне кажется это нерациональным каким-то. Вся эта возня с массивом создает много телодвижений и я не могу вставить этот компонент куда-то еще, на этой же странице.
В идеале, мне нужна возможность, допустим по id html элемента вставлять.
  • Вопрос задан
  • 149 просмотров
Решения вопроса 1
Fragster
@Fragster
помогло? отметь решением!
Пока все что я придумал что надо делать через v-for, у каждого сообщения делать v-if , поле visible , по таймауту буду его менять, оно будет исчезать. Но мне это кажется не оптимальным.

Почти так. Нужно сделать поле "visible", поле ключа и выводить не весь массив, а computed свойство с уже отфильтрованным массивом.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы