Vue Tutorial: How to Create an Interactive YouTube Video Selection

DZone 's Guide to

Vue Tutorial: How to Create an Interactive YouTube Video Selection

We take a look at how to create an interactive menu in Vue.js.

· Web Dev Zone ·
Free Resource

In this post I want to share my observations during my implementation of an interactive YouTube Video selection in Vue. Maybe this can save you some time, if you plan to do the same.

Let’s start with my motivation. It came from the improvements of the #BlueCloudMirror game UI. We decided to provide the #BlueCloudMirror users a recorded YouTube LiveStream of us. This video provides an awesome overview of our major technologies.

The video takes approximately 50 minutes. This is a long time to watch, so we want to provide the user a new interactive architecture page, as you can see below. A user should have the ability to select the topic they is interested in. To do this, we needed the position selection for the YouTube video. In the gif you can see the result.


Topics of this blog post:

  • How to define dynamic values in a Vue template.
  • How to configure autostart for YouTube videos.
  • How to avoid SAMEORI problem with the YouTube video.

How to Define Dynamic Values in a Vue Template

You can find the code of the Architecture.vue file on GitHub.

For the UI, I used the option template, and for the event handling the options methods and data.

To show you a high level view of how the code works, I made a very simplified sequence diagram.


Details of the Sequence Diagram

1. V-BIND onClick Event

The following code shows that the Vue template contains the button. This button will trigger an event. The definition for this event is defined using v-on together with the related method onYouTubeDemo.

         background-color: #FFFFFF;
 ><fontcolor="black">Game demo [5:03 mins]</font>

2. Set the Right Value for 'Game Demo'

The method  onYouTubeDemo is called by clicking the button we defined before. Inside this method, the internal JSON array variable sets the right YouTube video URL, for using in the templatefor the UI later.

In the following code, you can see the internal JSON array variable definition of youtubedata. The JSON array reflects the properties to display the video in an iFrame later.

var youtubedata = {     
  "0":{ width:"853",       
        src:"https://www.youtube.com/embed/Z4wU03JnEcU?autoplay=1&amp;amp;amp;start=303",                        frameborder:"0",       allow:"accelerometer; autoplay; encrypted-media; gyroscope;  picture-in-picture", 
        allowfullscreen:"" }};

Inside the code below, in  methods, the event method  onYouTubeDemo is responsible for setting the right video URL for the previouly defined JSON array variable youtubedata. The variable is used in the data option later.

methods: {   
  onYouTubeDemo() {   

Data organizes the data exchange for the web front-end with these variables youtubeJSON:youtubedata. You can find more details in the Vue best practices docs.

data: function () {   
    return {youtubeJSON:youtubedata}},

3. Show the Video in an iFrame

With the v-bindkey, and v-for we are setting the right data values for the YouTube video to display inside an iFrame. Here you can find the variable youtubeJSON. The blog post Use JSON to dynamically build web pages with Vue.js is awesome help for more details.

   v-for="data in youtubeJSON"


I discovered on the internet: you have to ensure that the youtube url contains the parameter autoplay and the value is set to 1.


How to Avoid the SAMEORI Problem

The SAMEORI problem, in our case, is when you cannot display the video in a iFrame. To avoid the SAMEORI problem, simply ensure you use embed in your YouTube URL in the source code. A very useful note is on Stack Overflow related to the “sameori” error.


This was all about my observations during my implementation of an interactive YouTube Video selection in Vue.

I hope this was useful for you!



vue, vue.js tutorial, web dev, youtube

Published at DZone with permission of Thomas Suedbroecker . See the original article here.

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}