首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在滑块中使用多个Clappr,vue?

如何在滑块中使用多个Clappr,vue?
EN

Stack Overflow用户
提问于 2019-04-23 16:27:41
回答 2查看 323关注 0票数 1

我已经创建了一个由多个图像和视频组成的滑块。我使用Swiper和Clappr (视频播放器),但clappr不能处理多个视频。

我试图通过一个循环(下面的代码)来修复它,但即便如此,该脚本仅适用于第一个视频。

Vue v.3.1、Clappr v.0.3、Swiper v.4.5。

代码语言:javascript
复制
<section class="content__slider swiper-container"
         v-if="project_data && project_data.length">

    <ul class="swiper-wrapper">
        <li v-for="(object, index) in project_data" :key="index"
            class="content-item swiper-slide">

            <!-- it'll be show, if obj type is images -->
            <v-lazy-image v-if="object.type === 'images'"
                          :src="object.data"
                          class="content-img"/>

            <!-- it'll be show, if obj type is video -->
            <div v-if="object.type === 'video'"
                 class="content-video"
                 :id="'container_' + index"></div>

        </li>
    </ul>

</section>
代码语言:javascript
复制
import axios from 'axios'
import Swiper from "swiper/dist/js/swiper.esm.bundle";
import VLazyImage from "v-lazy-image";
import Clappr from 'clappr'

import 'swiper/dist/css/swiper.min.css'

export default {
    name: "Project",
    data: () => ({
        project_data: [], // data of project
        project_images: [], // arr of images
        project_videos: [], // arr of videos
    }),
    created() {

        axios.get('/getWorks/' + this.$route.params.name)
            .then(response => {

                 let arr = [];

                 this.project_images = response.data.work_images;
                 let images = response.data.work_images;

                 this.project_videos = response.data.work_videos;
                 let videos = response.data.work_videos;

                 for (let i = 0; i < images.length; i++) {
                     arr.push({"type": "images", "data": "/storage/" + images[i]});
                 }
                 for (let i = 0; i < videos.length; i++) {
                     arr.push({"type": "video", "data": "/storage/" + videos[i]});
                 }

                 this.project_data = arr;

            })
            .then(() => {

                // init slider
                new Swiper('.content__slider', {
                    mousewheel: true,
                    keyboard: true,
                    speed: 1200,
                    navigation: {
                        nextEl: '.content-arrow.swiper-button-next',
                        prevEl: '.content-arrow.swiper-button-prev',
                    },
                    pagination: {
                        el: '.content-pagination.swiper-pagination',
                        type: 'fraction',
                    },
                    breakpoints: {
                        959: {
                            zoom: {
                                maxRatio: 5,
                                toggle: true,
                                containerClass: '.content__slider',
                                zoomedSlideClass: '.content-item'
                            },
                        }
                    }
                });

                // init clappr (video player)
                if ( document.querySelector('.content-video') ) {
                    for (let i = 0; i < this.project_videos.length; i++) {
                        new Clappr.Player({
                            source: '/storage/' + this.project_videos[i],
                            parentId: '#container_' + (this.project_images.length - i),
                            mute: true,
                            width: document.querySelector('.content-item').offsetWidth,
                            height: document.querySelector('.content-item').offsetHeight
                        });
                    }
                }
            });
    }
}

它适用于数组中的第一个视频,但不适用于以下视频

EN

回答 2

Stack Overflow用户

发布于 2019-04-23 21:41:44

生活和学习,我没有注意到我的错误。

代码语言:javascript
复制
parentId: '#container_' + (this.project_images.length + i)

总结一下是有必要的。现在,它可以工作了)

票数 0
EN

Stack Overflow用户

发布于 2019-04-23 21:45:30

你的问题是:

  1. 您正在初始化创建的挂接上的clappr (不理想)
  2. 由于使用`v-if

,您只能初始化第一个挂接

创建的钩子是在组件完成构建其DOM之前触发的,因此从理论上讲,您将无法通过document.querySelector找到任何元素。

为什么这样做?

由于您是在一个异步函数(来自axios的ajax调用)中运行这个querySelector,这意味着服务器响应您对/getWorks/的调用所花费的时间,浏览器已经完成了DOM的创建。这纯粹是运气,而不是你想要做的。

#1;将创建的钩子更改为安装的钩子的解决方案。- Mounted是Vue用来告诉你DOM已经构建完成的钩子。

第二个问题是使用v-if来“隐藏”其他元素。v-if从DOM中完全删除元素。这使得您的querySelector无法找到它并对其进行初始化。(因为只有一个,那就是你的第一个元素:

所以,这个脚本只适用于第一个视频。

#2v-if更改为v-show - v-show的解决方案是将元素保留在DOM中,但通过CSS隐藏它。因此,它可以通过querySelector访问。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55807113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档