Vue

本次课程分为四个部分:

Vue基础——>本地应用——>网络应用——>综合应用

第一部分:Vue基础

Vue简介

1、JavaScript框架

2、简化Dom操作

3、响应式数据驱动

 

第一个Vue程序

  • 导入开发版本的Vue.js.
  • 创建Vue实例对象,设置el属性和data属性.
  • 使用简洁的模板语法把数据渲染到页面上.

模版语法如下:

 

实例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue基础</title>
</head>
<body>

</body>
</html>
<div id="app" >
    {{message}}
</div>

<!--开发环境版本,包含了有帮助的命令行警告-->
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script>
    var app = new Vue({
        el: "#app",
        data: {
            message: "Hello Vue!"
        }
    })
</script>

el属性的意思是设置挂载点,通过css选择器设置Vue实例管理的元素

Vue实例的作用范围是什么呢?

  • Vue会管理el选项命中的元素以及其内部的后代元素

是否可以使用其他的选择器?

  • 可以使用其他的选择器,但是建议使用ID选择器

是否可以设置其他的dom元素呢?

  • 单标签不行,可以使用其他的双标签,但不包括使用HTML和BODY

代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>el:挂载点</title>
</head>
<body>
{{message}}
<p id="app"  class="app">
    {{message}}
     <span>{{message}}</span>
</p>

</body>
</html>


<!--开发环境版本,包含了有帮助的命令行警告-->
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script>
    var app = new Vue({
        //最常用: el: "#app",
        // el: ".app",
        el: "div",
        data: {
            message: "黑马程序员"
        }
    })
</script>

 

  • data属性即数据对象,Vue实例需要使用的数据都会定义在data中。
  • data中可以写复杂类型的数据
  • 渲染复杂类型数据时,遵守js的语法即可(例如:对象的.语法,数组的索引语法)

 

 

 对象如何获取属性,即对象.name

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>data:数据对象</title>
</head>
<body>
<div id="app">
    {{message}}
    <h2>{{school.name}} {{school.mobile}}</h2>
    <ul>
        <li>{{campus[0]}}</li>
        <li>{{campus[3]}}</li>
    </ul>
</div>

</body>
</html>


<!--开发环境版本,包含了有帮助的命令行警告-->
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script>
    var app = new Vue({
        el: "#app",
        data: {
            message: "你好 小黑!",
            school: {
                name: "黑马程序员",
                mobile: "400-618-9090",
            },
            campus: ["北京校区", "上海校区", "广州校区", "深圳校区"]
        }
    })
</script>

第二部分:本地应用。

用Vue开发网页效果。充分利用以下Vue指令,以案例巩固知识点。

 

 

 三个部分:

 

 

 

 

 

 

 

 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>本地应用</title>
</head>
<body>
<div id="app">
    <h2 v-text="message+'!'">深圳</h2>
    <h2 v-text="info+'!'">深圳</h2>
    <h2>{{message+'!'}}深圳</h2>
</div>

</body>
</html>

<!--开发环境版本,包含了有帮助的命令行警告-->
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script>
    var app = new Vue({
        el: "#app",
        data: {
            message: "黑马程序员!!!",
            info: "前端与移动教研部"
        }
    })
</script>

效果如下:

总结:

  •  v-text指令的作用是:设置标签的内容(textContent)
  • 默认写法会替换全部内容,使用差值表达式{{}}可以替换指定内容。

 全部代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-html</title>
</head>
<body>
<!--2.html结构-->
<div id="app">
    <p v-html="content"></p>
    <p v-text="content"></p>

</div>

<!--1.开发环境版本,包含了有帮助的命令行警告-->
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script>
    //3. 创建Vue实例
    var app = new Vue({
        el: "#app",
        data: {
            // content: "黑马程序员"
         //     把内容改成html结构:content:"<a href='http://www.itheima.com'>黑马程序员</a>"
        }
    })
</script>
</body>
</html>

效果如下:

 

 

 

 

 

 

  总结: 

  • v-html指令的作用是:设置元素的innerHTML
  • 内容中有html结构会被解析为标签.
  • v-text指令无论内容是什么,只会解析为文本
  • 解析文本使用v-text.需要解析html结构使用v-html

 

 全部代码如下:

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-on</title>
</head>
<body>
<!--2.html结构-->
<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>

<!--1.开发环境版本,包含了有帮助的命令行警告-->
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script>
    //3. 创建Vue实例
    var app = new Vue({
        el: "#app",
        data: {
            food: "西兰花炒蛋"
        },
        methods: {
            doIt: function () {
                alert("做It");
            },
            changeFood: function () {
                // console.log(this.food);
                this.food+="好好吃!"
            }
        },
    })
</script>
</body>
</html>

 

 效果如下:

总结: 

  •  v-on指令的作用是:为元素绑定事件
  • 事件名不需要写on
  • 指令可以简写为@
  • 绑定的方法定义在methods属性中
  • 方法内部通过this关键字可以访问定义在data中数据

 

 计数器:

 

 步骤:

1、data中定义数据:比如num

2、methods中添加两个方法:比如add(递增),sub(递减)

3、使用v-text将num设置给span标签

4、使用v-on将add,sub分别绑定给+,-按钮

5、累加的逻辑:小于10累加,否则提示

6、递减的逻辑:大于0递减,否则提示

 

 所有代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>计数器</title>
<style>
.input-num{
font-size: 50px;
text-align: center;
}
button{
width: 50px;
height: 50px;
}
</head> <body> <!--2.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"> </div> <!--1.开发环境版本,包含了有帮助的命令行警告--> <script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script> <script> //3. 创建Vue实例 var app = new Vue({ el: "#app", data: { num:1 }, methods: { add: function () { if(this.num<10){ this.num++; } else{ alert('别点啦,最大啦!'); } }, sub: function () { if(this.num>0){ this.num--; } else{ alert('别点啦,最小啦!'); } } }, }) </script> </body> </html>

全部总结:

  • 创建Vue示例时:el(挂载点),data(数据),methods(方法)
  • v-on指令的作用是绑定事件,简写为@
  • 方法中通过this,关键字获取data中的数据
  • v-text指令的作用是:设置元素的文本值,简写为{{}}
  • v-html指令的作用是:设置元素的innerHTML

第二部分:网络应用。

  三个部分:

 

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-show指令</title>
</head>
<body>
<!--2.html结构-->
<div id="app">
    <input type="button" value="切换显示状态" @click ="changeIsShow">
    <input type="button" value="累加年龄" @click ="addAge">
   <img v-show="isShow" src="http://www.itheima.com/images/logo.png">
   <img v-show="age>=18" src="http://www.itheima.com/images/logo.png">
</div>

<!--1.开发环境版本,包含了有帮助的命令行警告-->
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script>
    //3. 创建Vue实例
    var app = new Vue({
        el: "#app",
        data:{
            isShow:false,
            age:16
        },
        methods:{
            changeIsShow:function (){
                this.isShow = !this.isShow;
            },
            addAge:function (){
                this.age++;
            }
        },
    })
</script>
</body>
</html>

总结:

  • v-show指令的作用是:根据真假切换元素的显示状态
  • 原理是修改元素的display,实现显示隐藏
  • 指令后面的内容,最终都会解析为布尔值
  • 值为true元素显示,值为false元素隐藏

 

 

一些效果

 

 

 

 实际操作中,频繁切换的元素要v-show,反之用v-if;因为操作dom元素对性能的消耗比较大;

所有代码为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-show指令</title>
</head>
<body>
<!--2.html结构-->
<div id="app">
    <input type="button" value="切换显示" @click="toggleISfunction ">
   <p v-if="isShow">黑马程序员</p>
   <p v-show="isShow">黑马程序员 -v-show修饰</p>
   <h2 v-if="temperature>=35">热死啦</h2>
</div>

<!--1.开发环境版本,包含了有帮助的命令行警告-->
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script>
    //3. 创建Vue实例
    var app = new Vue({
        el: "#app",
        data:{
            isShow:false,
            temperature:20
        },
        methods:{
            toggleISfunction (){
                this.isShow = !this.isShow;
            }

        },
    })
</script>
</body>
</html>

总结:

  • v-if指令的作用是:根据表达式的真假切换元素的显示状态
  • 本质是通过操纵dom元素来切换显示状态
  • 表达式的值为true,元素存在于dom树中,为false从dom树中移除
  • 频繁的切换选择v-show,反之使用v-if,前者的切换消耗小

 

 

 简写形式:

 

 

 

 

 代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-bind指令</title>
    <style>
        .active{
            border: 1px solid red;
        }
    </style>

</head>
<body>
<!--2.html结构-->
<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">

</div>

<!--1.开发环境版本,包含了有帮助的命令行警告-->
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script>
    //3. 创建Vue实例
    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>
</body>
</html>

总结:

  •  v-bind指令的作用是:为元素绑定属性
  • 完整写法是v-bind:属性名
  • 简写的话可以直接省略v-bind,只保留:属性名
  • 需要动态的增删class建议使用对象的方式                                                                                                                                                                                                                                                                                                                                                                                                          图片切换:  
  •  总结:

  •  列表数据使用数组保存

  • v-bind指令可以设置元素属性,比如src
  • v-show和v-if都可以切换元素的显示状态,频繁切换用v-show                                                                                                                                      
  • <div id="app">
        <ul>
            <li v-for="item in arr">
                黑马程序员校区:{{item}}
            </li>
        </ul>
    </div>
    
    <script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
    <script>
        //3. 创建Vue实例
        var app = new Vue({
            el: "#app",
            data: {
                arr: ["北京", "上海", "广州", "深圳"],
       
            } ,
      
        })
  •  相同的代码:

        <ul>
            <li v-for="it in arr">
                黑马程序员校区:{{it}}
            </li>
        </ul>

    效果如下:

所有代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-for指令</title>
</head>
<body>
<!--2.html结构-->
<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>

<!--1.开发环境版本,包含了有帮助的命令行警告-->
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script>
    //3. 创建Vue实例
    var app = new Vue({
        el: "#app",
        data: {
            arr: ["北京", "上海", "广州", "深圳"],
            vegetables: [
                {name: "西兰花炒蛋"},
                {name: "蛋炒西蓝花"}
            ]
        } ,
      methods:{
          add:function (){
              this.vegetables.push({name:"花菜炒蛋"});
            },
          remove:function (){
              this.vegetables.shift();
            }
        },
     })
</script>
</body>
</html>

效果:

 

 

 

 总结: 

  • v-for指令的作用是:根据数据生成列表结构
  • 数组经常和v-for结合使用
  • 语法是(item,index)in 数据  (分别为每一项和索引)
  • item和index可以结合其他指令一起使用  
  • 数组长度的更新会同步到页面上,是响应式的  

 

 

 

 所有代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-on补充</title>
</head>
<body>
<!--2.html结构-->
<div id="app">
  <input type="button" value="点击" @click="doIt(666,'老铁')">
    <input type="text" @keyup.enter="sayHi">
</div>

<!--1.开发环境版本,包含了有帮助的命令行警告-->
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script>
    //3. 创建Vue实例
    var app = new Vue({
        el: "#app",
        methods:{
            doIt:function (p1,p2){
                console.log("做it");
                console.log(p1);
                console.log(p2);
            },
            sayHi:function (){
                alert ("吃了没");
            }
        },
     })
</script>
</body>
</html>

 效果如下:

 

 

 

 

 

 

总结:

  • 事件绑定的方法写成函数调用的形式,可以传入自定义参数
  • 定义方法时需要定义形参来接收传入的实参
  • 事件的后面跟上,.修饰符可以对事件进行限制
  • .enter可以限制触发的按键为回车

 

 

 

 

 

 所有代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-model指令</title>
</head>
<body>
<!--2.html结构-->
<div id="app">
    <input type="button" value="修改message" @click="setM">
    <input type="text" v-model="message" @keyup.enter="getM">
    <h2>{{message}}</h2>
</div>

<!--1.开发环境版本,包含了有帮助的命令行警告-->
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script>
    //3. 创建Vue实例
    var app = new Vue({
        el: "#app",
        data: {
            message: "黑马程序员"
        },
        methods: {
            getM: function () {
                alert(this.message);
            },
            setM: function () {
                this.message = "酷丁鱼";
            }
        }
    })
    
</script>
</body>
</html>

 总结:

  • v-model指令的作用是便捷的设置和获取表单元素的值
  • 绑定的数据会和表单元素值相关联
  • 绑定的数据<-->表单元素的值(双向绑定,无论改变哪一边,另一边都会同步的进行改变)

 小黑记事本:功能:记事,删除,统计

 

 

 

 第一部分:新增

列表结构生成+数据准备

 

 

 获取用户输入并且回车新增数据:

 

总结:

1、v-for指令的作用

2、v-model指令的作用

3、v-on指令,事件修饰符

 

 第二部分:删除

点击删除

 

 

 

 

 

 总结:

1、数据改变,和数据绑定的元素同步改变

2、事件的自定义参数(即传递给事件参数)

3、splice(索引,删除个数)

第三部分:统计

 

 

 总结:

1、基于数据的开发方法,找到对应的数据进行改变即可,这里的个数本质上就是数组的长度。

2、v-text指令的作用

第四部分:清空

1、点击清楚所有信息(v-on 清空数组)

 

 

 第五部分:隐藏

功能:没有数据时,隐藏元素(v-show,v-if  显示的条件为数组非空)

 

 

 或者写在父类上

 

 

 

全部的总结:

  • 列表结构可以通过v-for指令结合数据生成
  • v-on结合时间修饰符可以对事件进行限制,比如.enter
  • v-on在绑定事件时可以传递自定义参数
  • 通过v-model可以快速的设置和获取表单元素的值
  • 基于数据的开发方式(JS原来是基于dom元素进行操作)

第二部分:本地应用——Vue结合网络数据开发应用

axios网络请求库——>axios+vue——>天气预报的案例。

axios——功能强大的网络请求库

 

 

 

 

 

所有代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>axios基本使用</title>
</head>
<body>
<!--2.html结构-->

<input type="button" value="get请求" class="get">
<input type="button" value="post请求" class="post">

</div>
<!--官网提供的axios在线地址-->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<!--1.开发环境版本,包含了有帮助的命令行警告-->
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.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("http://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: "jack"})
            .then(function (response) {
                console.log(response);
            }, function (err) {
                console.log(err);
            })
    }

</script>
</body>
</html>

 

总结

  • axios必须先导入才可以使用
  • 使用get或post方法即可发送对应的请求(运用了get和post方法,与请求同名)
  • then方法中的回调函数会在请求成功或失败时触发
  • 通过回调函数的形参可以获取响应内容,或错误信息。

 

axios+vue

 

 

 

 

 所有代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>axios+vue</title>
</head>
<body>
<!--2.html结构-->
<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>
<!--1.开发环境版本,包含了有帮助的命令行警告-->
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script>
    // 接口1:随机获取一条笑话
    // 请求地址:https://autumnfish.cn/api/joke
    // 请求方式:get
    // 请求参数:无
    // 响应内容:随机笑话

    //3. 创建Vue实例
    var app = new Vue({
        el: "#app",
        data: {
            joke: "很好笑的笑话"
        },
        methods: {
            getJoke: function () {
                var that = this;
                axios.get("https://autumnfish.cn/api/joke").then
                (function (response) {
                    console.log(response.data);
                    that.joke = response.data;
                }, function (err) {
                })
            },

        },
    })
</script>
</body>
</html>

总结:

  • axios回调函数中的this已经改变,无法访问到data中数据
  • 把this保存起来,回调函数中直接使用保存的this即可(在上述代码中用到的是that )

 天气预报系统(与本地的区别在于增加网络数据获取的逻辑)

 

 

 

 

 回车查询的截图:

 

 

 

 

 

回车查询总结:

  • 应用的逻辑代码建议和页面分离,使用单独的js文件编写。(然后在页面的部分进行导入)
  • axios回调函数中this指向改变了,需要额外的保存一份。(即上述框起来的两个小部分)
  • 服务器返回的数据比较复杂时,获取的时候需要注意层级结构。(层级结构结构可以在console中获取)

点击查询的截图

 

 

点击查询总结:

  • 自定义参数可以让代码的复用性更高,灵活度也提高。
  • methods中定义的方法内部,可以通过this关键字点出其他的方法,加个括号进行调用。

第二部分:综合应用——悦听播放器

 

 

 1、歌曲搜索

 

 

 

 

 

 

 

 

 歌曲搜索总结:

  • 服务器返回数据比较复杂时,获取的时候需要注意层级结构。
  • 通过审查元素快速定位到需要操纵的元素。

 

2、歌曲播放

 

 

 

 

 

 

 

 

 

 

 

 歌曲播放的总结:

  • 歌曲id依赖歌曲搜索(即上一个part获得的内容)的结果,对于不用的数据也需要关注。

歌曲封面截图:

 

 

 

  歌曲封面的总结:

  • 在vue中通过v-bind操纵属性
  • 本地无法获取的数据,基本都会有对应的接口

歌曲评论截图:

 

 

 

 

 

 歌曲评论的总结:

  • 在vue中通过v-for生成列表

 

播放动画的截图:

 

 

 

 

 

 

 

 

 

 

 

 

  歌曲动画的总结:

  • audio标签的play事件会在音频播放的时候触发
  • audio标签的pause事件会在音频暂停的时候触发
  • 通过对象的方式设置类名,类名生效与否取决于后面值的真假

 

mv播放的截图:

 

 

 

 

 

 

 

 

 

 

 全部综合应用的总结:

  • 不同的接口需要的数据是不同的,文档的阅读需要仔细
  • 页面结构复杂之后,通过审查元素的方式去快速定位相关元素
  • 响应式的数据都应该在data中定义。

 

 

 

 

 

 

 

 

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

posted @ 2022-06-20 18:28  费皿啊  阅读(154)  评论(0)    收藏  举报