Vue.js : Доступ к данным массива в другом компоненте

#javascript #arrays #vue.js #getusermedia #vue-props

#javascript #массивы #vue.js #getusermedia #vue-props

Вопрос:

У меня есть компонент, в котором можно делать скриншоты видео. Они хранятся в массиве и отображаются внутри компонента под видео на холсте.

Однако я хочу получить доступ к этому массиву скриншотов в другом компоненте (Gallery.vue) и отобразить там все скриншоты. Итак, как только нажата кнопка скриншота, соответствующий скриншот должен отображаться в другом компоненте.

Вот как выглядит мой компонент Stream.vue, который содержит видео и кнопку скриншота (эти компоненты работают нормально):

 <template>
    <div id="app">
        <div>
            <video ref="video" id="video" width="1024" height="576" autoplay></video>
        </div>
        <div>
            <button class="btn btn-dark btn-lg" style="margin-top: 5px; margin-bottom: 7px" id="snap" v-on:click="capture()">
                <i class="fa fa-camera"></i>
            </button>
        </div>
        <canvas ref="canvas" id="canvas" width="640" height="480"></canvas>
        <ul>
            <li v-for="c in captures" :key="c.id">
                <img v-bind:src="c" height="50" />
            </li>
        </ul>
    </div>
</template>

<script>
export default {
    name: "camera",
    data() {
        return {
            video: {},
            canvas: {},
            captures: [],
        };
    },
    mounted() {
        this.initVideo();
    },
    methods: {
        initVideo() {
            this.video = this.$refs.video;
            if (
                "mediaDevices" in navigator amp;amp;
                "getUserMedia" in navigator.mediaDevices
            ) {
                navigator.mediaDevices
                    .getUserMedia({video: true})
                    .then((stream) => {
                        const videoPlayer = document.querySelector("video");
                        videoPlayer.srcObject = stream;
                        videoPlayer.play();
                    });
            } else {
                alert("Livestream currently unavailable.");
            }
        },
        capture() {
            this.canvas = this.$refs.canvas;
            // this.canvas = document.querySelector("canvas");
            // this.canvas = document.getElementById("galleryCanvas");
            var context = this.canvas.getContext("2d");
            context.drawImage(this.video, 0, 0, 640, 480);
            this.captures.push(this.canvas.toDataURL("image/png"));
        },
    },
};
</script>
  

Компонент галереи, в котором фактически должны быть доступны и отображаться скриншоты, выглядит следующим образом:

 <template>
    <div class="gallery" id="mainDiv">
        <canvas ref="canvas" class="galleryCanvas" id="galleryCanvas" width="640" height="480" v-bind:captures="capture"></canvas>
        <ul>
            <li v-for="screenshot in captures" :key="screenshot.id">
                <img v-bind:src="screenshot" height="50" />
            </li>
        </ul>
        <!-- <div class="canvas" id="galleryCanvas"></div> -->
    </div>
</template>

<script>
export default {
    name: "gallery",

    props: {
        captures: Array,
    },
};
</script>
  

До сих пор я пробовал несколько вещей. Я попытался получить доступ к холсту компонента галереи через

 this.canvas = document.querySelector("canvas");
  

или по его идентификатору через

 this.canvas = document.getElementById("galleryCanvas");
  

но все это не сработало бы. Он просто отображает один снимок экрана в этом компоненте, и как только я нажимаю кнопку скриншота, он перезаписывает снимок экрана вместо отображения нового снимка экрана рядом со старым.

Это может показаться довольно простой проблемой, но я действительно борюсь с этим. Я действительно был бы признателен за любую помощь.

Заранее большое вам спасибо!

Комментарии:

1. Я не уверен, что вы имеете в виду, потому что ваш код работает. Я смоделировал то же самое, имея каждый код в своем компоненте, здесь: jsfiddle.net/luismartin/6L17xt4e В любом случае я также попытался создать простой проект с помощью webpack и иметь отдельные файлы для каждого компонента. Это все еще работает: массив видеозаписей отображается в списке.

2. Спасибо за вашу помощь! Это странно. Реквизит массива captures в моем другом компоненте (Gallery.vue) всегда указывает, что он не определен… В моем потоковом компоненте это работает. Мне интересно, что я делаю не так, как вы?