zoukankan      html  css  js  c++  java
  • Vue入门

    vue入门

    来源:https://www.bilibili.com/video/BV12J411m7MG

    Vue基础

    Vue简介
    1. JavaScript框架
    2. 简化Dom操作
    3. 响应式数据驱动
    第一个Vue程序
    1. 官方文档传送门 https://cn.vuejs.org
    2. 编辑器:VSCode 扩展:LIVE SERVER
    3. 步骤:
    • 导入开发版本的Vue.js
    <!-- 开发环境版本,包含了有帮助的命令行警告 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    
    • 创建Vue实例对象,设置el属性和data属性
    <script>
        var app = new Vue({
          el:"#app",
          data:{
            message:" 你好 JACKY! "
          }
        })
      </script>
    
    • 使用简洁的模板语法把数据渲染到页面上
    <div id="app">
        {{ message }}
    </div>
    
    el:挂载点 --- 设置Vue实例挂载(管理)的元素

    . 是class选择器; # 是id选择器

    1. Vue会管理el选项命中的元素及其内部的后代元素
    2. 可以使用其他的选择器,但是建议使用ID选择器
    3. 可以使用其他的双标签,但是不能使用HTML和BODY
    data:数据对象
    1. Vue中用到的数据定义在data中
    2. data中可以写复杂类型的数据
    3. 渲染复杂类型数据时,遵守js的语法即可
    <div id="app">
            {{ message }}
            <h2> {{ school.name }} {{ school.mobile }}</h2>
            <ul>
                <li>{{ campus[0] }}</li>
                <li>{{ campus[3] }}</li>
            </ul>
        </div>
        <script>
            var app = new Vue({
                el:"#app",
                data:{
                    message:"你好 小黑!",
                    school:{
                        name:"黑马程序员",
                        mobile:"400-618-9090"
                    },
                    campus:["北京校区","上海校区","广州校区","深圳校区"]
                }
            })
        </script>
    

    本地应用

    • 通过Vue实现常见的网页效果;
    • 学习Vue指令;
    • Vue指令指的是,以v-开头的一组特殊语法
    内容绑定,事件绑定
    1. v-text
    • 设置标签的文本值(textContent)
    • 默认写法会替换全部内容,使用差值表达式{{}}可以替换指定内容
    • 内部支持写表达式
    <h2 v-text="message+'!'">深圳</h2>
    <script>
            var app = new Vue({
                el:"#app",
                data:{
                    message:"黑马程序员!!!",
                    info:"前端与移动教研部"
                }
            })
        </script>
    
    1. v-html
    • 设置标签的innerHTML
    • 内容中有html结构会被解析为标签
    • v-text指令无论内容是什么,只会解析为文本
    • 解析文本使用v-text,需要解析html结构使用v-html
    1. v-on基础
    • 为元素绑定事件
    • 事件名不需要写on
    • 指令可以简写为@
    • 绑定的方法定义在methods属性中
    • 方法内部通过this关键字可以访问定义在data中数据
    <div id="app">
        <input type="button" value="v-on指令" v-on:click="doIt">
        <input type="button" value="v-on简写" @click="doIt">
        <input type="button" value="双击事件" @dblclick="doIt">
        <h2 @click="changeFood">{{ food }}</h2>
    </div>
    
    <script>
        var app = new Vue({
            el:"#app",
            data:{
                food:"苦瓜炒鸡蛋"  
            },
            methods: {  
                doIt:function(){
                    console.log("做it");
                    alert("do it");
                },
                changeFood:function(){
                    console.log(this.food);
                    this.food += "好好吃!"
                }
            },
        })
    </script>
    

    计数器应用

    <!-- html结构 -->
      <div id="app">
        <!-- 计数器功能区域 -->
        <div class="input-num">
          <button @click="sub">
            -
          </button>
          <span>{{num}}</span>
          <button @click="add">
            +
          </button>
        </div>
        <img src="http://www.itheima.com/images/logo.png" alt="" />
      </div>
      <!-- 开发环境版本,包含了有帮助的命令行警告 -->
      <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
      <!-- 编码 -->
      <script>
        var app = new Vue({
          el:"#app",
          data:{
            num:1
          },
          methods:{
            add:function(){
              if(this.num<7){
                this.num++;
              } else {
                alert("别点啦!最大了");
              }
            },
            sub:function(){
              if(this.num>0){
                this.num--;
              } else {
                alert("别点啦!最小了");
              }
            }
          }
        }
        )
      </script>
    
    显示切换,属性绑定
    1. v-show
    • 根据表达式的真假,切换元素的显示和隐藏
    • 原理是修改元素的display,实现显示隐藏
    • 指令后面的内容,最终都会解析为布尔值
    • 值为true元素显示,值为false元素隐藏
    • 数据改变后,对应元素的显示状态会同步更新
    <div id="app">
          <input type="button" value="切换显示状态" @click="changeIsShow">
          <input type="button" value="累加年龄" @click="addAge">
          <img v-show="isShow" src="./img/monkey.gif" alt="">
          <img v-show="age>=18" src="./img/monkey.gif" alt="">
        </div>
        <script>
          var app = new Vue({
            el:"#app",
            data:{
              isShow:false,
              age:17
            },
            methods: {
              changeIsShow:function(){
                this.isShow = !this.isShow;
              },
              addAge:function(){
                this.age++;
              }
            },
          })
        </script>
    

    2 v-if

    • 根据表达式的真假切换元素的显示状态
    • 本质是通过操纵dom元素来切换显示状态
    • 表达式的值为true,元素存在于dom树中,为false,从dom树中移除
    • 频繁的切换v-show,反之使用v-if,前者的切换消耗小
    <div id="app">
            <input type="button" value="切换显示" @click="toggleIsShow">
            <p v-if="isShow">黑马程序员</p>
            <p v-show="isShow">黑马程序员 - v-show修饰</p>
            <h2 v-if="temperature>=35">热死啦</h2>
        </div>
        <script>
            var app = new Vue({
                el:"#app",
                data:{
                    isShow:false,
                    temperature:20
                },
                methods: {
                    toggleIsShow:function(){
                        this.isShow = !this.isShow;
                    }
                },
            })
        </script>
    
    1. v-bind
    • 设置元素的属性(如src,title,class)
    • 完整的写法是:v-bind:属性名
    • 简写的话可以直接省略v-bind,只保留:属性名
    • 需要动态的增删class建议使用对象的方式
    <div id="app">
            <img v-bind:src="imgSrc" alt="">
            <br>
            <img :src="imgSrc" alt="" :title="imgTitle+'!!!'" :class="isActive?'active':''" @click="toggleActive">
            <br>
            <img :src="imgSrc" alt="" :title="imgTitle+'!!!'" :class="{active:isActive}" @click="toggleActive">
            //需要动态的增删class建议使用对象的方式
        </div>
        <script>
            var app = new Vue({
                el:"#app",
                data:{
                    imgSrc:"http://www.itheima.com/images/logo.png",
                    imgTitle:"黑马程序员",
                    isActive:false
                },
                methods: {
                    toggleActive:function(){
                        this.isActive = !this.isActive;
                    }
                },
            })
        </script>
    

    图片切换应用

    <div id="mask">
        <div class="center">
          <h2 class="title">
            <img src="./images/logo.png" alt="">
            深圳创维校区环境
          </h2>
          <!-- 图片 -->
          <img :src="imageList[index]" alt="" />
          <!-- 左箭头 -->
          <a href="javascript:void(0)"  class="left" v-show="index>0" @click="prev">
              <img src="./images/prev.png" alt="" />
            </a>
          <!-- 右箭头 -->
          <a href="javascript:void(0)" class="right" v-show="index < imageList.length-1" @click="next">
            <img src="./images/next.png" alt="" />
          </a>
        </div>
      </div>
      <script>
        var app = new Vue({
          el:"#mask",
          data:{
            imageList:["./images/00.jpg",
                "./images/01.jpg",
                "./images/02.jpg",
                "./images/03.jpg",
                "./images/04.jpg",
                "./images/05.jpg",
                "./images/06.jpg",
                "./images/07.jpg",
                "./images/08.jpg",
                "./images/09.jpg",
                "./images/10.jpg",
              ],
              index:0
          },
          methods:{
            // 上一张
            prev() {
                this.index--;
              },
              // 下一张
              next() {
                this.index++;
              }
          }
        })
      </script>
    
    列表循环,表单元素绑定
    1. v-for
    • 根据数据生成列表结构
    • 数组经常和v-for结合使用
    • 语法是** (item,index) in xx数组**
    • item和index可以结合其他指令一起使用
    • 数组长度的更新会同步到页面上,是响应式的
    <div id="app">
            <input type="button" value="添加数据" @click="add">
            <input type="button" value="移除数据" @click="remove">
    
            <ul>
                <li v-for="(it,index) in arr">
                    {{ index+1 }}黑马程序员校区:{{ it }}
                </li>
            </ul>
            <h2 v-for="item in vegetables" v-bind:title="item.name">
                {{ item.name }}
            </h2>
        </div>
        <script>
            var app = new Vue({
                el:"#app",
                data:{
                    arr:["北京","上海","广州","深圳"],
                    vegetables:[
                        {name:"西兰花炒蛋"},
                        {name:"蛋炒西蓝花"}
                    ]
                },
                methods: {
                    add:function(){
                        this.vegetables.push({ name:"花菜炒蛋" });
                    },
                    remove:function(){
                        this.vegetables.shift();
                    }
                },
            })
        </script>
    
    1. v-on补充
    • https://cn.vuejs.org/v2/api/#v-on
    • 事件绑定的方法写成函数调用的形式,可以传入自定义参数
    • 定义方法时需要定义形参来接收传入的实参
    • 事件的后面跟上.修饰符可以对事件进行限制
    • .enter可以限制触发的按键为回车
    <div id="app">
            <input type="button" value="点击" @click="doIt(666,'老铁')">
            <input type="text" @keyup.enter="sayHi">
        </div>
        <script>
            var app = new Vue({
                el:"#app",
                methods: {
                    doIt:function(p1,p2){
                        console.log("做it");
                        console.log(p1);
                        console.log(p2);
                    },
                    sayHi:function(){
                        alert("吃了没");
                    }
                },
            })
        </script>
    
    1. v-model
    • 获取和设置表单元素的值(双向数据绑定),便捷的设置和获取表单元素的值
    • 绑定的数据会和表单元素值相关联
    • 绑定的数据<-->表单元素的值
    <div id="app">
            <input type="button" value="修改message" @click="setM">
            <input type="text" v-model="message" @keyup.enter="getM">
            <h2>{{ message }}</h2>
        </div>
        <script>
            var app = new Vue({
                el:"#app",
                data:{
                    message:"黑马程序员"
                },
                methods: {
                    getM:function(){
                        alert(this.message);
                    },
                    setM:function(){
                        this.message ="酷丁鱼";
                    }
                },
            })
        </script>
    

    小黑记事本

     <!-- 主体区域 -->
        <section id="todoapp">
          <!-- 输入框 -->
          <header class="header">
            <h1>小黑记事本</h1>
            <input
              autofocus="autofocus"
              autocomplete="off"
              placeholder="请输入任务"
              class="new-todo"
              @keyup.enter="add"
              v-model="inputValue"
            />
          </header>
          <!-- 列表区域 -->
          <section class="main">
            <ul class="todo-list">
              <li class="todo" v-for="(item,index) in list">
                <div class="view">
                  <span class="index">{{ index+1 }}.</span> 
                  <label>{{ item }}</label>
                  <button class="destroy" @click="remove(index)"></button>
                </div>
              </li>
            </ul>
          </section>
          <!-- 统计和清空 -->
          <footer class="footer">
            <span class="todo-count" v-if="list.length!=0"> <strong>{{ list.length }}</strong> items left </span>
            <button class="clear-completed" @click="clear" v-show="list.length!=0">
              Clear
            </button>
          </footer>
        </section>
        <!-- 底部 -->
        <footer class="info">
          <p>
            <a href="http://www.itheima.com/"
              ><img src="./img/black.png" alt=""
            /></a>
          </p>
        </footer>
        <!-- 开发环境版本,包含了有帮助的命令行警告 -->
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        
        <script>
          var app = new Vue({
            el:"#todoapp",
            data:{
              list:["write code","do homework","meet girlfriend"],
              inputValue:"just do it"
            },
            methods:{
              add:function(){
                this.list.push(this.inputValue);
              },
              remove:function(index){ 
                this.list.splice(index,1);//splice删除数组中指定的值
              },
              clear:function(){
                this.list= [];
              }
            }
          })
        </script>
    

    网络应用

    axios:功能强大的网络请求库,实际上是Ajax的封装
    1. axios必须先导入才可以使用
    2. 使用get或post方法即可发送对应的请求
    3. then方法中的回调函数会在请求成功或失败时触发
    4. 通过回调函数的形参可以获取响应内容,或错误信息
    5. 文档传送门: https://github.com/axios/axios
    axios.get(地址?key=value&key2=values).then(function(response)},function(err){})
    axios. post(地址,{key:value,key2:value2}) then(function(response){},function(err){})
    
    
    <body>
        <input type="button" value="get请求" class="get">
        <input type="button" value="post请求" class="post">
        <!-- 官网提供的 axios 在线地址 -->
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
        <script>
            /*
                接口1:随机笑话
                请求地址:https://autumnfish.cn/api/joke/list
                请求方法:get
                请求参数:num(笑话条数,数字)
                响应内容:随机笑话
            */
            document.querySelector(".get").onclick = function () {
                axios.get("https://autumnfish.cn/api/joke/list?num=6")
                // axios.get("https://autumnfish.cn/api/joke/list1234?num=6")
                .then(function (response) {
                    console.log(response);
                  },function(err){
                      console.log(err);
                  })
            }
            /*
                 接口2:用户注册
                 请求地址:https://autumnfish.cn/api/user/reg
                 请求方法:post
                 请求参数:username(用户名,字符串)
                 响应内容:注册成功或失败
             */
            document.querySelector(".post").onclick = function () {
                axios.post("https://autumnfish.cn/api/user/reg",{username:"盐焗西兰花"})
                .then(function(response){
                    console.log(response);
                    console.log(this.skill);
                },function (err) {
                    console.log(err);
                  })
              }
    
        </script>
    </body>
    
    axios+vue
    1. axios回调函数中的this已经改变,无法访问到data中的数据
    2. 把this保存起来,回调函数中直接使用保存的this即可
    3. 和本地应用最大区别就是改变了数据来源
    <body>
        <div id="app">
            <input type="button" value="获取笑话" @click="getJoke">
            <p> {{ joke }}</p>
        </div>
        <!-- 官网提供的 axios 在线地址 -->
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
        <!-- 开发环境版本,包含了有帮助的命令行警告 -->
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            /*
                接口:随机获取一条笑话
                请求地址:https://autumnfish.cn/api/joke
                请求方法:get
                请求参数:无
                响应内容:随机笑话
            */
            var app = new Vue({
                el:"#app",
                data:{
                    joke:"很好笑的笑话"
                },
                methods: {
                    getJoke:function(){
                        // console.log(this.joke);
                        var that = this;
                        //axios回调函数中的this已经改变,无法访问到data中的数据把this保存起来,回调函数中直接使用保存的this即可
                        axios.get("https://autumnfish.cn/api/joke").then(function(response){
                            // console.log(response)
                            console.log(response.data);
                            // console.log(this.joke);
                            that.joke = response.data;
                        },function (err) {  })
                    }
                },
            })
    
        </script>
    </body>
    
    1. 应用逻辑代码建议和页面分离,使用单独的js文件编写
    2. axios回调函数中this指向改变了,需要额外的保存一份
    3. 服务器返回的数据比较复杂时,获取的时候需要注意层级结构
    mian.js
    /*
      请求地址:http://wthrcdn.etouch.cn/weather_mini
      请求方法:get
      请求参数:city(城市名)
      响应内容:天气信息
    
      1. 点击回车
      2. 查询数据
      3. 渲染数据
      */
     var app = new Vue({
         el:"#app",
         data:{
             city:'',
             weatherList:[]
         },
         methods: {
             searchWeather:function(){
                //  console.log('天气查询');
                //  console.log(this.city);
                // 调用接口
                // 保存this
                var that = this;
                axios.get('http://wthrcdn.etouch.cn/weather_mini?city='+this.city)
                .then(function(response){
                    // console.log(response);
                    console.log(response.data.data.forecast);
                    that.weatherList = response.data.data.forecast
                })
                .catch(function(err){})
             },
            changeCity:function(city){
                 this.city=city;
                 this.searchWeather();
            }
         },
     })
    
    1. 自定义参数可以让代码的复用性更高
    2. methods中定义的方法内部,可以通过this关键字点出其他的方法
    <body>
        <div class="wrap" id="app">
          <div class="search_form">
            <div class="logo"><img src="img/logo.png" alt="logo" /></div>
            <div class="form_group">
              <input
                type="text"
                @keyup.enter="searchWeather"
                v-model="city"
                class="input_txt"
                placeholder="请输入查询的天气"
              />
              <button class="input_sub">
                搜 索
              </button>
            </div>
            <div class="hotkey">
              <a href="javascript:;" @click="changeCity('北京')">北京</a>
              <a href="javascript:;" @click="changeCity('上海')">上海</a>
              <a href="javascript:;" @click="changeCity('广州')">广州</a>
              <a href="javascript:;" @click="changeCity('深圳')">深圳</a>
            </div>
          </div>
          <ul class="weather_list">
            <li v-for="item in weatherList">
              <div class="info_type"><span class="iconfont">{{ item.type }}</span></div>
              <div class="info_temp">
                <b>{{ item.low }}</b>
                ~
                <b>{{ item.high }}</b>
              </div>
              <div class="info_date"><span>{{ item.date }}</span></div>
            </li>
          </ul>
        </div>
        <!-- 开发环境版本,包含了有帮助的命令行警告 -->
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <!-- 官网提供的 axios 在线地址 -->
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
        <!-- 自己的js -->
        <script src="./js/main1.js"></script>
      </body>
    

    综合应用

    mian.js

    /*
      1:歌曲搜索接口
        请求地址:https://autumnfish.cn/search
        请求方法:get
        请求参数:keywords(查询关键字)
        响应内容:歌曲搜索结果
    
      2:歌曲url获取接口
        请求地址:https://autumnfish.cn/song/url
        请求方法:get
        请求参数:id(歌曲id)
        响应内容:歌曲url地址
      3.歌曲详情获取
        请求地址:https://autumnfish.cn/song/detail
        请求方法:get
        请求参数:ids(歌曲id)
        响应内容:歌曲详情(包括封面信息)
      4.热门评论获取
        请求地址:https://autumnfish.cn/comment/hot?type=0
        请求方法:get
        请求参数:id(歌曲id,地址中的type固定为0)
        响应内容:歌曲的热门评论
      5.mv地址获取
        请求地址:https://autumnfish.cn/mv/url
        请求方法:get
        请求参数:id(mvid,为0表示没有mv)
        响应内容:mv的地址
    */
    var app = new Vue({
      el: "#player",
      data: {
        // 查询关键字
        query: "",
        // 歌曲数组
        musicList: [],
        // 歌曲地址
        musicUrl: "",
        // 歌曲封面
        musicCover: "",
        // 歌曲评论
        hotComments: [],
        // 动画播放状态
        isPlaying: false,
        // 遮罩层的显示状态
        isShow: false,
        // mv地址
        mvUrl: ""
      },
      methods: {
        // 歌曲搜索
        searchMusic: function() {
          var that = this;
          axios.get("https://autumnfish.cn/search?keywords=" + this.query).then(
            function(response) {
              // console.log(response);
              that.musicList = response.data.result.songs;
              console.log(response.data.result.songs);
            },
            function(err) {}
          );
        },
        // 歌曲播放
        playMusic: function(musicId) {
          //   console.log(musicId);
          var that = this;
          // 获取歌曲地址
          axios.get("https://autumnfish.cn/song/url?id=" + musicId).then(
            function(response) {
              // console.log(response);
              // console.log(response.data.data[0].url);
              that.musicUrl = response.data.data[0].url;
            },
            function(err) {}
          );
    
          // 歌曲详情获取
          axios.get("https://autumnfish.cn/song/detail?ids=" + musicId).then(
            function(response) {
              // console.log(response);
              // console.log(response.data.songs[0].al.picUrl);
              that.musicCover = response.data.songs[0].al.picUrl;
            },
            function(err) {}
          );
    
          // 歌曲评论获取
          axios.get("https://autumnfish.cn/comment/hot?type=0&id=" + musicId).then(
            function(response) {
              // console.log(response);
              // console.log(response.data.hotComments);
              that.hotComments = response.data.hotComments;
            },
            function(err) {}
          );
        },
        // 歌曲播放
        play: function() {
          // console.log("play");
          this.isPlaying = true;
        },
        // 歌曲暂停
        pause: function() {
          // console.log("pause");
          this.isPlaying = false;
        },
        // 播放mv
        playMV: function(mvid) {
          var that = this;
          axios.get("https://autumnfish.cn/mv/url?id=" + mvid).then(
            function(response) {
              // console.log(response);
              console.log(response.data.data.url);
              that.isShow = true;
              that.mvUrl = response.data.data.url;
            },
            function(err) {}
          );
        },
        // 隐藏
        hide: function() {
          this.isShow = false;
        }
      }
    });
    
    

    Player.html

    <body>
      <div class="wrap">
        <div class="play_wrap" id="player">
          <div class="search_bar">
            <img src="images/player_title.png" alt="" />
            <!-- 搜索歌曲 -->
            <input type="text" autocomplete="off" v-model='query' @keyup.enter="searchMusic();" />
          </div>
          <div class="center_con">
            <!-- 搜索歌曲列表 -->
            <div class='song_wrapper' ref='song_wrapper'>
              <ul class="song_list">
                <li v-for="item in musicList">
                  <!-- 点击放歌 -->
                  <a href="javascript:;" @click='playMusic(item.id)'></a>
                  <b>{{item.name}}</b>
                  <span>
                    <i @click="playMv(item.mvid)" v-if="item.mvid!=0"></i>
                  </span>
                </li>
    
              </ul>
              <img src="images/line.png" class="switch_btn" alt="">
            </div>
            <!-- 歌曲信息容器 -->
            <div class="player_con" :class="{playing:isPlay}">
              <img src="images/player_bar.png" class="play_bar" />
              <!-- 黑胶碟片 -->
              <img src="images/disc.png" class="disc autoRotate" />
              <img :src="coverUrl==''?'./images/cover.png':coverUrl" class="cover autoRotate" />
            </div>
            <!-- 评论容器 -->
            <div class="comment_wrapper" ref='comment_wrapper'>
              <h5 class='title'>热门留言</h5>
              <div class='comment_list'>
    
                <dl v-for="item in hotComments">
                  <dt>
                    <img :src="item.user.avatarUrl" alt="" />
                  </dt>
                  <dd class="name">{{item.user.nickname}}</dd>
                  <dd class="detail">
                    {{item.content}}
                  </dd>
                </dl>
              </div>
              <img src="images/line.png" class="right_line">
            </div>
          </div>
          <div class="audio_con">
            <audio ref='audio' @play="play" @pause="pause" :src="musicUrl" controls autoplay loop class="myaudio"></audio>
          </div>
          <div class="video_con" v-show="showVideo">
            <video ref='video' :src="mvUrl" controls="controls"></video>
            <div class="mask" @click="closeMv"></div>
          </div>
        </div>
      </div>
      <!-- 开发环境版本,包含了有帮助的命令行警告 -->
      <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
      <!-- 官网提供的 axios 在线地址 -->
      <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
      <script type="text/javascript">
        // 设置axios的基地址
        axios.defaults.baseURL = 'https://autumnfish.cn';
        // axios.defaults.baseURL = 'http://localhost:3000';
    
    
    
        // 实例化vue
        var app = new Vue({
          el: "#player",
          data: {
            // 搜索关键字
            query: '',
            // 歌曲列表
            musicList: [],
            // 歌曲url
            musicUrl: '',
            // 是否正在播放
            isPlay: false,
            // 歌曲热门评论
            hotComments: [],
            // 歌曲封面地址
            coverUrl: '',
            // 显示视频播放
            showVideo: false,
            // mv地址
            mvUrl: ''
          },
          // 方法
          methods: {
            // 搜索歌曲
            searchMusic() {
              if (this.query == 0) {
                return
              }
              axios.get('/search?keywords=' + this.query).then(response => {
                // 保存内容
                this.musicList = response.data.result.songs;
    
              })
    
              // 清空搜索
              this.query = ''
            },
            // 播放歌曲
            playMusic(musicId) {
              // 获取歌曲url
              axios.get('/song/url?id=' + musicId).then(response => {
                // 保存歌曲url地址
                this.musicUrl = response.data.data[0].url
              })
              // 获取歌曲热门评论
              axios.get('/comment/hot?type=0&id=' + musicId).then(response => {
                // console.log(response)
                // 保存热门评论
                this.hotComments = response.data.hotComments
    
              })
              // 获取歌曲封面
              axios.get('/song/detail?ids=' + musicId).then(response => {
                // console.log(response)
                // 设置封面
                this.coverUrl = response.data.songs[0].al.picUrl
              })
    
            },
            // audio的play事件
            play() {
              this.isPlay = true
              // 清空mv的信息
              this.mvUrl = ''
            },
            // audio的pause事件
            pause() {
              this.isPlay = false
            },
            // 播放mv
            playMv(vid) {
              if (vid) {
                this.showVideo = true;
                // 获取mv信息
                axios.get('/mv/url?id=' + vid).then(response => {
                  // console.log(response)
                  // 暂停歌曲播放
                  this.$refs.audio.pause()
                  // 获取mv地址
                  this.mvUrl = response.data.data.url
                })
              }
            },
            // 关闭mv界面
            closeMv() {
              this.showVideo = false
              this.$refs.video.pause()
            },
            // 搜索历史记录中的歌曲
            historySearch(history) {
              this.query = history
              this.searchMusic()
              this.showHistory = false;
            }
          },
    
        })
    
      </script>
    </body>
    
  • 相关阅读:
    HDU 1301 Jungle Roads (最小生成树)
    POJ 1733 Parity game (并查集)
    HDU 3038 How Many Answers Are Wrong (并查集)
    CentOS用yum安装搭建LAMP
    Linux下php安装Redis扩展
    PHPExcel用法
    利用phpmailer类邮件发送
    Vim编辑器配置
    vhost文件设置
    ThinkPHP验证码类
  • 原文地址:https://www.cnblogs.com/nojacky/p/13905936.html
Copyright © 2011-2022 走看看