@jazzus

Как синхронно отрисовать v-for внутри модального окна?

Изучаю Laravel + VUE. Не получается синхронно вывести цикл внутри модального окна. Есть заметный скачок при открытии. Если включить замедленный режим – вначале появляется маленькое пустое модальное окно, затем оно расширяется при отрисовке списка v-for.

Как я делаю:

Кнопка открытия модального окна (сама кнопка находится в цикле v-for)
<button type="button" class="btn btn-primary btn-sm mt-2" @click="modalOpen(product.id)">Списки</button>


Запускается метод, который ставит переменной тру
modalOpen(id) {
                  this.product_id = id,
                  this.active = true,
              }


Компонент модалки вынесен из цикла и запускается через v-if ориентируясь на переменную active
<modal-list v-if="active"
    :product_id="product_id"
    :active="active"
    >
    </modal-list>


Соответственно v-if ом запускается компонент ModalList (модалка со списком).

В нем модалка принимает пропсы
props: [
          'product_id',
          'active'
        ],


И показывает себя через v-show. Ориентируясь на пропс active
<transition name="modal" v-show="this.active">

Вместе с запуском компонента модалки фетчатся списки:
mounted() {
            this.fetchDataLists();
        }


методом

fetchDataLists() {
            product_id=this.product_id
            axios.get(`/json/datalist/${product_id}`)
                .then(response => {
                    this.datalists = response.data.data;
                })
          },


Которые затем выводятся через v-for
<template v-for="(list, index) in datalists" v-model="datalists">


И именно последний v-for имеет запоздалую отрисовку. Что портит ощущение реактивности)
Я пробовал фетчить списки в родительском компоненте и передавать их через props (т.е. метод fetchDatalists запускать не дочернем компоненте ModalList, а в родительском и потом просто передавать массив данных дочернему). Да, тогда проблема с отрисовкой пропадает. Но появляется другая проблема уже не эстетического характера - мне нужно изменять массив данных datalists (через VUE.set), а пропсы насколько я прочитал изменять нельзя. В общем. Как можно синхронизировать отрисовку f-vor внутри модального окна, чтобы сформированный список данных показывался внутри модалки вместе с отрисовкой модалки, а не после нее?
  • Вопрос задан
  • 389 просмотров
Решения вопроса 1
@jazzus Автор вопроса
По итогу в процессе обсуждения нашлись решения:

1) Свойство activ, которое используется для открытия модалки передавать вместе с данными с сервера. Таким образом модалка не будет появляться раньше отрисовки списка и они будут отображаться синхронного. Минус данного велосипеда в задержке появления модалки пока данные не придут.

2) Передавать уже сформированный массив данных от родителя. А если нужно изменить пропсы то делать запрос к родителю через this.$emit и уже в родителе менять нужные данные в массиве через vue.set

3) Прятать загрузку данных за анимацией модалки.

Я остановился на втором варианте. Спасибо Сергей delphinpro и Evgeny Kulakov за идеи
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
kulakoff
@kulakoff Куратор тега Vue.js
Vue.js developing
Очевидно, что есть как минимум два варианта:

1. передавать уже готовый список, чтобы рендеринг происходил сразу с уже имеющимися данными
2. забирать данные в компоненте, но не показывать его до тех пор пока, они не получены. Т.е. внутри модального окна на корневой элемент поставить v-show="active" например, active = true - когда вы получили данные.
Ответ написан
Ваш ответ на вопрос

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

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