Как вызвать модальный бутстрап и в то же время передать параметр компоненту внутри модального?

У меня есть список результатов (который уже работает). Как мне вызвать модальный бутстрап и в то же время передать параметр компоненту внутри модального? Я протестировал модальный режим, и модальный режим начальной загрузки можно вызвать вручную.

<template>
  <div class = "main">
          <ol>
            <li
              v-bind:key = "searchResult.id"
              v-for = "searchResult in searchResults"
              @click = "?(searchResult.snippet.resourceId.videoId)"
            >
              {{ searchResult.snippet.title }}
            </li>
          </ol>
          <b-modal id = "modal-1" title = "BootstrapVue" :hide-footer = "true">
            <p class = "my-4"><VideoIFrame /></p>
          </b-modal>
        </div>
  </div>
</template>

<script>
import VideoIFrame from "@/components/VideoIFrame.vue";

export default {
  components: {
    VideoIFrame
  },
  data() {
    return {
      searchResults: []
    };
  }
};
</script>

Некоторый код сокращен для краткости

Это код компонента

<template>
  <div class = "videoWrapper">
    <iframe
      :src = "iframesrc"
      frameborder = "0"
      allow = "autoplay; encrypted-media"
      allowfullscreen
    ></iframe>
  </div>
</template>

<script>
import { bus } from "../main";

export default {
  data() {
    return {
      iframesrc: null
    };
  },
  created() {
    debugger;
    bus.$on("iframesrc", data => {
      debugger;
      this.iframesrc = data;
    });
  }
};
</script>

Не могли бы вы также показать, откуда вы звоните $bus.emit('iframesrc', url)?

tao 24.12.2020 02:28

@tao, у меня есть еще один компонент VideoPlayList, с помощью которого я его испускаю bus.$emit("iframesrc", "https://www.youtube.com/embed/" + videoId);

Steve 24.12.2020 02:30

Вместо того, чтобы испускать, вы хотите сохранить значение в Vue.observable(), которое импортируется как в этот список, так и в VideoIFrame.vue. Если вы добавите содержимое VideoPlayList.vue в ветвь этой песочницы, я покажу вам, как использовать Vue.observable() для обмена данными между компонентами.

tao 24.12.2020 02:33

Хорошо, я добавил VideoPlayList.vue. На самом деле у меня есть другое представление Playlist.vue, в котором используются как компонент VideoPlayList.vue, так и VideoIFrame.vue. Здесь представление Search.vue использует только компонент VideoIFrame.vue.

Steve 24.12.2020 02:40

Не могли бы вы также поделиться ссылкой на форк? У меня его нет (поскольку вы его разветвили - вы не можете редактировать мою песочницу, как я не мог редактировать одну из ваших песочниц). Когда я это делаю, он автоматически создает вилку со случайным URL-адресом. Мне нужна ссылка на ваш форк, чтобы увидеть, что вы добавили.

tao 24.12.2020 02:42

Хорошо, конечно, это ссылка

Steve 24.12.2020 02:44

Давайте продолжим обсуждение в чате.

tao 24.12.2020 02:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
7
102
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема, которую я вижу с тем, что у вас есть, заключается в том, что вы привязываетесь к событию $busiframesrc внутри VideoIFramecreated. Но VideoIFrame создается только при открытии модального окна. Таким образом, если автобус выдает iframesrc, когда модальное окно не открыто, iframesrc будет undefined, когда вы его открываете, потому что оно пропустило событие, когда оно было выдано.

Чтобы решить эту проблему, вы должны поместить код, перехватывающий излучение, за пределы модального компонента.

Вы можете просто поместить его в родителя модального окна и передать как prop компоненту VideoIFrame в шаблоне.

Другие возможные решения, если вы не хотите связывать VideoIFrame с родителем модального окна, — это использовать любое решение для управления состоянием (например, Vuex, Vue.observable()).

Основываясь на вашем первоначальном примере, вот обновление, используя простой магазин (с Vue.observable()). Суммируя:

  • бросил $bus использование
  • создал простой магазин
  • импортировал его как в компонент списка, так и в компонент videoIFrame и использовал его для передачи идентификатора щелкнутого элемента в videoIFrame.

Вот об этом.

Как всегда, используя реквизит. Подробнее об этом можно прочитать здесь https://v2.vuejs.org/v2/guide/components-props.html

Я нашел больше проблем с вашим кодом, так что давайте исправим это.

Нам нужно отправить компонент (videoIframe) с нужным URL-адресом.

 <template>
  <div class = "main">
          <ol>
            <li
              v-bind:key = "searchResult.id"
              v-for = "searchResult in searchResults"
              @click = "showModal(`https://example.com/${searchResult.snippet.resourceId.videoId}`)"
            >
              {{ searchResult.snippet.title }}
            </li>
          </ol>
          <b-modal id = "modal-1" title = "BootstrapVue" v-model = "modalOpen" :hide-footer = "true">
            <p class = "my-4"><VideoIFrame :framesrc = "currentURL " /></p>
          </b-modal>
        </div>
  </div>
</template>

<script>
import VideoIFrame from "@/components/VideoIFrame.vue";

export default {
  components: {
    VideoIFrame
  },
  data() {
    return {
      modalOpen: false,
      currentURL: '',
      searchResults: []
    };
  },
  methods: {
     showModal(videoURI){
         this.showModal = true;
         this.currentURL = videoURI;
      }
  }
};
</script>

Компонент iframe - должен объявить, что он получает реквизит по имени "iframesrc", а не в объекте данных.

<template>
  <div class = "videoWrapper">
    <iframe
      :src = "iframesrc"
      frameborder = "0"
      allow = "autoplay; encrypted-media"
      allowfullscreen
    ></iframe>
  </div>
</template>
<script>
import { bus } from "../main";

export default {
  props: ['iframesrc']
};
</script>

У меня также есть еще один компонент VideoPlayList, который я испускаю с помощью bus.$emit("iframesrc", "https://www.youtube.com/embed/" + videoId);

Steve 24.12.2020 02:32

Теперь я могу вызвать модальное окно с помощью вашего кода. Но модальное окно все еще не может получить значение iframesrc. Ваш :framesrc = "currentURL" должен быть :iframesrc = "currentURL "?

Steve 24.12.2020 03:09

Другие вопросы по теме