Vue学习(第二天)

一、 ES6补充

1.1 块级作用域

在ES6之前因为if和for都没有块级作用域,所以在很多时候,都必须借助于函数(function)的作用域来解决引用外面变量的问题

1.1.1 错误的遍历方式

        var btns = document.getElementsByTagName('button');for (var i = 0; i < btns.length; i++) {btns[i].addEventListener('click', function() {console.log('第' + i + '个按钮被点击了...');})}

1.1.2 通过闭包解决var的块级作用域问题

    for (var i = 0; i < btns.length; i++) {(function(i) {btns[i].addEventListener('click', function() {console.log('第' + i + '个按钮被点击了...');})})(i)}

1.1.3 使用let关键子

    for (let i = 0; i < btns.length; i++) {btns[i].addEventListener('click', function() {console.log('第' + (i + 1) + '个按钮被点击了...');})}

1.2 const关键子

1.2.1 被const所修饰的标识符在定义时必须初始化

1.2.2 被const所修饰的标识符被赋值后不能修改

1.2.3 常量的含义是指向的对象不能修改,但是可以改变对象内部的属性

    obj = {name:'why',}obj.name = 'Hello World';console.log(obj);

1.3 增强写法

1.3.1 属性的增强写法

    const name = 'why';const age = 18;const height = 1.88;// ES5的写法const obj = {name: name,age: age,height: height}console.log(obj.name);// ES6的写法const obj = {name,age,height}

1.3.2 方法的增强写法

 const obj = {run: function() {},eat: function() {}}// ES6的增强写法const obj = {run() {}eat() {}}

二、事件监听

2.1 入门

        <button v-on:click='add'>+</button><button v-on:click='sub'>-</button>//语法糖<button @click='add'>+</button><button @click='sub'>-</button>        

2.2 参数问题

2.2.1 事件所调用的方法没有参数

        //情况相同<button @click='btnClick'>按钮1</button><button @click='btnClick()'>按钮1</button>

2.2.2 事件所调用的方法有参数,但是却省略了()

        //第一个参数传入MouseEvent<button @click=btn2Click>按钮2</button>undefined<button @click=btn2Click()>按钮2</button>//输出123<button @click=btn2Click(123)>按钮2</button>

2.2.3 事件所调用的方法需要同时传入多个参数且有一个参数是事件

        //第一个参数是事件<button @click=btn3Click>按钮3</button>//全为undefined<button @click=btn3Click()>按钮3</button>//报错,方法不存在<button @click=btn3Click(abc)>按钮3</button>//将事件对象传入第2个参数<button @click=btn3Click(123,$event)>按钮3</button>

2.3 修饰符

2.3.1 stop 防止冒泡事件

        <div @click='divClick'>this a div<!-- 防止冒泡事件 --><button @click.stop='btnClick'>按钮</button></div>

2.3.2 prevent 阻止默认事件,如阻止表单提交

<form action="www.baidu.com" method="post"><!-- prevent 阻止默认事件 --><input type="submit" value="提交" @click.prevent='submitClick'></form>

2.3.3 keyup 监听指定事件的点击

<input type="text" @keyup.enter='keyUpClick'>

2.3.4 once 只执行一次

<button @click.once='onceClick'>按钮</button>

三、条件判断

3.1 入门

<h2 v-if='grade>90'>优秀</h2><h2 v-else-if='grade>75'>良好</h2><h2 v-else-if='grade>=60'>合格</h2><h2 v-else>不合格</h2>

3.2 用户登录方式切换

<body><div id="app"><span v-if='isUser'><label for="username">用户账号</label><input type="text" id="username" placeholder="用户账号" key="username"></span><span v-else><label for="email">用户邮箱</label><input type="text" id="eamil" placeholder="用户邮箱" key="email"></span><button @click='isUser = !isUser'>切换类型</button></div><script src="../js/vue.js"></script><script>const app = new Vue({el: '#app',data: {isUser: true,},});</script>
</body>

3.3 用户登录方式切换案例的问题

​ Vue中为了提高性能,对于在虚拟DOM中的元素进行了复用,即真正在执行时只取其一,加上key可以区分开来不会复用

3.4 v-show与v-if的区别

​ v-if:不显示元素且组件不存在
​ v-show:不显示元素但组件存在于DOM中,只是存在display属性,当切片频繁时,使用v-show,否则使用v-if

<div id="app"><h2 v-if='flag' id="a">{{message}}</h2><h2 v-show='flag' id="b">{{message}}</h2><h2></h2></div><script src="../js/vue.js"></script><script>const app = new Vue({el: '#app',data: {message: '你好呀!',flag: true,}})</script>

四、循环遍历

4.1 v-for遍历数组

<div id="app"><ul><!-- item:数组的值index:索引下标--><li v-for='(item,index) in names'>第{{index+1}}个人的名字是:{{item}}</li></ul></div><script type="text/javascript" src="../js/vue.js"></script><script>const app = new Vue({el: '#app',data: {names: ['张三', '李四', '王五', '马六'],}});</script>

4.2 v-for遍历对象

<div id="app"><ul><!-- item:属性值key:属性名index:对象的索引下标--><li v-for='(item,key,index) in info'>{{item}}+{{key}}+{{index}}</li></ul></div><script src="../js/vue.js"></script><script>const app = new Vue({el: '#app',data: {info: {name: 'zhangsan',age: 18,height: 22}}})</script>

4.3 vue中v-for为何要加key

​ 在DOM和key之间进行绑定,提交性能,比如在数组中间插入元素

    <div id="box"><div><input type='text' v-model="name"><button @click="add">添加</button></div><ul><li v-for="(item,i) in list" :key="item.id"><input type="checkbox">{{item.name}}</li></ul></div><script src="../js/vue.js"></script><script>var vm = new Vue({el: '#box',data: {name: '',id: 3,list: [{ id: 1, name: '张三' },{ id: 2, name: '李四' },{ id: 3, name: '王二' }]},methods: {add() {this.list.unshift({ id: ++this.id, name: this.name })this.namne = ''}}});</script>                { id: 2, name: '李四' },{ id: 3, name: '王二' }]},methods: {add() {this.list.unshift({ id: ++this.id, name: this.name })this.namne = ''}}});</script>

4.4 关于数组的常用响应式方法

<body><div id="app"><ul><li v-for='item in letters'>{{item}}</li></ul><hr><button @click='push'>push</button><button @click='pop'>pop</button><button @click='shift'>shift</button><button @click='unshift'>unshift</button><button @click='splice'>splice</button><button @click='sort'>sort</button><button @click='reverse'>reverse</button></div><script src="../js/vue.js"></script><script>const app = new Vue({el: '#app',data: {letters: ['a', 'b', 'c', 'd', 'e'],},methods: {push() {// 末尾添加元素this.letters.push('f');},pop() {//删除末尾元素this.letters.pop();},shift() {//头部删除元素this.letters.shift();},unshift() {//头部添加元素this.letters.unshift('f');},splice() {//splice//1.删除元素:splice(start,length) 从start位置开始,删除length个元素// this.letters.splice(1,2);//2.替换元素//第二个参数表示要替换几个元素	,后面是用于替换的元素// this.letters.splice(1,1,'m','n');//3.插入元素this.letters.splice(1, 1, 'x', 'y', 'z');},sort() {this.letters.sort();},reverse() {this.letters.reverse();}// 注意:通过索引修改值的话不是响应式的// this.letters[0]='b';//set(要修改的对象,索引值,更新值)// Vue.set();}});</script>
</body>

回顾

    • 一、 ES6补充
      • 1.1 块级作用域
        • 1.1.1 错误的遍历方式
        • 1.1.2 通过闭包解决var的块级作用域问题
        • 1.1.3 使用let关键子
      • 1.2 const关键子
        • 1.2.1 被const所修饰的标识符在定义时必须初始化
        • 1.2.2 被const所修饰的标识符被赋值后不能修改
        • 1.2.3 常量的含义是指向的对象不能修改,但是可以改变对象内部的属性
      • 1.3 增强写法
        • 1.3.1 属性的增强写法
        • 1.3.2 方法的增强写法
    • 二、事件监听
      • 2.1 入门
      • 2.2 参数问题
        • 2.2.1 事件所调用的方法没有参数
        • 2.2.2 事件所调用的方法有参数,但是却省略了()
        • 2.2.3 事件所调用的方法需要同时传入多个参数且有一个参数是事件
      • 2.3 修饰符
        • 2.3.1 stop 防止冒泡事件
        • 2.3.2 prevent 阻止默认事件,如阻止表单提交
        • 2.3.3 keyup 监听指定事件的点击
        • 2.3.4 once 只执行一次
    • 三、条件判断
      • 3.1 入门
      • 3.2 用户登录方式切换
      • 3.3 用户登录方式切换案例的问题
      • 3.4 v-show与v-if的区别
    • 四、循环遍历
      • 4.1 v-for遍历数组
      • 4.2 v-for遍历对象
      • 4.3 vue中v-for为何要加key
      • 4.4 关于数组的常用响应式方法