Vue基础条件渲染,事件处理,双向绑定,表单控制
1 注意: 本例复制最全, 后续将不再复制头尾, 只有重要内容 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title>Title</title> 7 <script src="js/vue.js"></script> 8 </head> 9 <body> 10 <div id="box"> 11 <ul v-if="shopping.length>0"> // 判断长度, 大于0证明有值, 进行循环渲染 12 <li v-for="data in shopping">{{data}}</li> 13 </ul> 14 <ul v-else>空空如也</ul> 15 </div> 16 <script> 17 new Vue({ 18 el: "#box", // 选中标签 19 data:{ 20 shopping:[1,1,3] // 显式数据 21 }, 22 }) 23 </script> 24 </body> 25 </html>
1 <body> 2 <div id="box"> 3 <div v-if="which===1">1111</div> 4 <div v-else-if="which===2">2222</div> 5 <div v-else>3333</div> 6 </div> 7 <script> 8 new Vue({ 9 el: "#box", 10 data:{ 11 which: 1 // 决定渲染标签变量 12 }, 13 }) 14 </script> 15 </body>
数组的 for 循环 语法: v-for="变量 in 数组"
,
循环着打印数组中的内容
1 <body> 2 <div id="box"> 3 <p v-for="data in arr">{{data}}</p> 4 </div> 5 <script> 6 new Vue({ 7 el: "#box", 8 data: { 9 arr: ["sz", "li", "ch"], 10 }, 11 }) 12 </script> 13 </body>
循环对象 for 语法 : v-for="变量 in 对象"
,
循环对象时渲染到html页面的是value值, 而不是key
1 <body> 2 <div id="box"> 3 <p v-for="das in obj">{{das}}</p> 4 </div> 5 <script> 6 new Vue({ 7 el: "#box", 8 data: { 9 obj: {name: "chen", age: 19, sex: "male"} 10 }, 11 }) 12 </script> 13 </body>
语法: v-for="(item,value) in 数组"
需要些两值, 需要知道的是,渲染时 item和value是反过来的.
1 <body> 2 <div id="box"> 3 <p v-for="(item,value) in arr"> {{value}} {{item}}</p> 4 </div> 5 <script> 6 new Vue({ 7 el: "#box", 8 data: { 9 arr: ["sz", "li", "ch"], 10 }, 11 }) 12 </script> 13 </body>
循环对象key和value
语法: v-for="(key,value) in 对象"
1 <body> 2 <div id="box"> 3 <p v-for="(key,value) in obj"> {{value}} {{key}}</p> 4 </div> 5 <script> 6 new Vue({ 7 el: "#box", 8 data: { 9 obj: {name: "chen", age: 19, sex: "male"} 10 }, 11 }) 12 </script> 13 </body>
1 v-for循环数组,对象时,建议在控件(组件,标签)写一个key属性,属性值唯一
2 页面更新以后,加速dom的替换(渲染),虚拟dom的替换diff算法
3 :key="变量"
-页面不会更改:vm.arr.concat(['44','55'])
-解决vm.arr=vm.arr.concat(['44','55'])
4. 页面不会更改:通过索引值更新数组
1 -解决方案一: 2 vm.arr[0] 3 "11" 4 vm.arr[0]='99' 5 "99" 6 vm.arr.splice(0,1,'88') 7 ["99"] 8 -解决方案二 9 Vue.set(vm.arr,0,'lqz')
5. 上面能更新是因为作者重写了那些方法
blur:失去焦点触发
change:失去焦点触发,跟blur一样
input:数据发生变化,就会触发
1 <body> 2 <div id="box"> 3 <input type="text" v-model="myinput" @input="handleChange"> {{myinput}} 4 <br> 5 <!-- 打印数据--> 6 <div> 7 <p v-for="data in new_arr">{{data}}</p> 8 </div> 9 </div> 10 <script> 11 new Vue({ 12 el: "#box", 13 data:{ 14 myinput:'', 15 arr: ['aabbc', 'abc', 'aabcd','ccdd','bbcc'], 16 new_arr: ['aabbc', 'abc', 'aabcd','ccdd','bbcc'], 17 }, 18 methods:{ 19 handleChange(){ 20 //控制arr的变化,数据又双向绑定了,页面就会变化 21 this.new_arr=this.arr.filter(item=>{ // 使用es6语法 匿名箭头函数 22 return item.indexOf(this.myinput) >-1 //完全匹配, 与正则匹配一样, 没有头尾 23 }) 24 解释上述代码: 25 为什么要定义两个arr数组? 如果只定义一个DOM检测不到发生变化则显示不会变化 26 } 27 } 28 }) 29 </script> 30 </body>
1 <body> 2 <div id="box"> 3 <input type="text" v-model="myinput" @blur="handleChange"> {{myinput}} 4 </div> 5 <script> 6 new Vue({ 7 el: "#box", 8 data:{ 9 myinput:'', 10 }, 11 methods:{ 12 handleChange(ev){ 13 console.log(ev) //网页控制台查看 14 } 15 } 16 }) 17 </script> 18 </body>
1 <body> 2 <div id="box"> 3 <input type="text" v-model="myinput" @change="handleChange"> {{myinput}} 4 </div> 5 <script> 6 new Vue({ 7 el: "#box", 8 data:{ 9 myinput:'', 10 }, 11 methods:{ 12 handleChange(){ 13 console.log(this.myinput) // 控制台查看打印内容, 输入框输入什么控制台打印什么 14 } 15 } 16 }) 17 </script> 18 </body>
有时候需要对一些数据进行展开和折叠, 如下案例
三种方式
1 <body> 2 <div id="box"> 3 <!-- 标签中添加表达式--> 4 <button @click="isShow=!isShow">点我折叠,展开</button> 5 <!-- js函数中操作--> 6 <button @click="handleChange">点我折叠,展开2</button> 7 <button @click="handleChange">点我折叠,展开2,传递event事件</button> 8 <!-- 打印数据--> 9 <div v-show="isShow"> 10 <p v-for="data in arr">{{data}}</p> 11 </div> 12 </div> 13 <script> 14 new Vue({ 15 el: "#box", 16 data:{ 17 isShow: true, 18 arr: ['aabbc', 'abc', 'aabcd','ccdd','bbcc'], 19 }, 20 methods:{ 21 handleChange(ev){ 22 console.log(ev) 23 this.isShow=!this.isShow // 取反操作 24 } 25 } 26 }) 27 </script> 28 </body>
.stop 阻止事件冒泡
.self 只处理自己的事件,子控件冒泡的事件不处理
.prevent 阻止a链接跳转
.once 只处理一次就解绑(抽奖页面)
1 <body> 2 <div id="box"> 3 <ul @click.self="handleUl"> 4 <li v-for="data in datalist" @click.self="handleLi($event)">{{data}}</li> 5 </ul> 6 </div> 7 <script> 8 new Vue({ 9 el: "#box", 10 data:{ 11 datalist:["chen","shao", "liu"] 12 }, 13 methods:{ 14 handleLi() { 15 console.log('li被点击了') 16 }, 17 handleUl() { 18 console.log('Ul被点击了') 19 }, 20 } 21 }) 22 </script> 23 </body>
1 box中加上即可验证, 控制台哦 2 <li v-for="data in datalist" @click.stop="handleLi">{{data}}</li>
1 点击后失效 2 <li v-for="data in datalist" @click.once="handleLi">{{data}}</li>
1 <body> 2 <div id="box"> 3 <a href="http://www.baidu.com" @click.prevent="handleA">点我看美女</a> 4 </div> 5 <script> 6 new Vue({ 7 el: "#box", 8 methods:{ 9 handleA(ev) { 10 console.log('a被点击了') 11 ev.preventDefault() //阻止a标签的跳转 12 } 13 } 14 }) 15 </script> 16 </body>
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <script src="js/vue.js"></script> 7 </head> 8 <body> 9 <div id="box"> 10 // 方法1 11 <input type="text" v-model="myinput" @keyup.enter="handleKey"> 12 // 方法2 直接写表达式 13 <input type="text" v-model="myinput" @keyup.13="handleKey"> 14 </div> 15 <script> 16 new Vue({ 17 el: "#box", 18 data:{ 19 myinput: '' 20 }, 21 methods:{ 22 handleKey(ev){ 23 console.log(ev) // 默认会把事件传到函数内 24 if(ev.keyCode===13){ 25 // 按下回车后控制台打印数据 26 console.log('回车被按下了') 27 } 28 } 29 } 30 }) 31 </script> 32 </body> 33 </html>
当表单数据发生变化是自动绑定到模板变量位置
之前已经介绍了, 这里简单例子
1 <body> 2 <div id="box"> 3 <input type="text" v-model="myinput">{{myinput}} 4 <hr> 5 <textarea name="" id="" cols="30" rows="10" v-model="text"></textarea> 6 <br> 7 {{text}} 8 </div> 9 <script> 10 new Vue({ 11 el: "#box", 12 data:{ 13 myinput:'', 14 text: '' 15 }, 16 }) 17 </script> 18 </body>
1 <body> 2 <div id="box"> 3 <input type="checkbox" v-model="check"> 记住密码 4 <br> 5 {{check}} 6 </div> 7 <script> 8 new Vue({ 9 el: "#box", 10 data:{ 11 check: true 12 }, 13 }) 14 </script> 15 </body>
1 <body> 2 <div id="box"> 3 <input type="checkbox" v-model="checkgroup" value="python"> python 4 <input type="checkbox" v-model="checkgroup" value="java"> java 5 <input type="checkbox" v-model="checkgroup" value="html"> html 6 <br> 7 {{checkgroup}} 8 </div> 9 <script> 10 new Vue({ 11 el: "#box", 12 data:{ 13 checkgroup: [] // 使用列表存放, 否则是单选 14 }, 15 }) 16 </script> 17 </body>
1 // arr只能保存一个字符串, 所以用来设置单选 2 <body> 3 <div id="box"> 4 <input type="radio" v-model="arr" value="男">男 5 <input type="radio" v-model="arr" value="女">女 6 <input type="radio" v-model="arr" value="未知">未知 7 </div> 8 <script> 9 new Vue({ 10 el: "#box", 11 data:{ 12 arr:'' 13 }, 14 }) 15 </script> 16 </body>
1 <body> 2 <div id="box"> 3 <ul> 4 <li v-for="item in datalist"> 5 <input type="checkbox" :value="item" v-model="checkgroup"> 6 品名: {{item.name}} 数量:{{item.number}} 价格:{{item.price}}元 7 </li> 8 </ul> 9 当前价格为: {{getPrice()}} 元 10 <br> 11 </div> 12 <script> 13 new Vue({ 14 el: "#box", 15 data:{ 16 datalist:[ 17 {name: '丰田', price: 100, number: 6, id: '1'}, 18 {name: '本田', price: 1000, number: 3, id: '2'}, 19 {name: '景田', price: 3330, number: 2, id: '2'}, 20 ], 21 checkgroup:[] 22 }, 23 methods:{ 24 getPrice(){ 25 var sum_price = 0; 26 for (i in this.checkgroup){ 27 sum_price += this.checkgroup[i]["number"]*this.checkgroup[i]["price"] 28 } 29 return sum_price 30 } 31 } 32 }) 33 </script> 34 </body>
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <script src="js/vue.js"></script> 7 </head> 8 <body> 9 <div id="box"> 10 <input type="checkbox" v-model="isAll" @change="handleCheck"> 全选或取消全选 11 <ul> 12 <li v-for="item in datalist"> 13 <input type="checkbox" :value="item" v-model="checkgroup" @change="handleOne"> 14 品名: {{item.name}} 数量:{{item.number}} 价格:{{item.price}}元 15 </li> 16 </ul> 17 <br> 18 </div> 19 <script> 20 new Vue({ 21 el: "#box", 22 data: { 23 datalist: [ 24 {name: '丰田', price: 100, number: 6, id: '1'}, 25 {name: '本田', price: 1000, number: 3, id: '2'}, 26 {name: '景田', price: 3330, number: 2, id: '2'}, 27 ], 28 checkgroup: [], 29 isAll:false 30 }, 31 methods: { 32 // 全选取反 33 handleCheck() { 34 if (this.checkgroup.length > 0) { 35 this.checkgroup = [] 36 // this.isAll = true 37 } else { 38 this.checkgroup = this.datalist 39 } 40 }, 41 // 单选 42 handleOne() { 43 if (this.checkgroup.length === this.datalist.length) { 44 this.isAll = true 45 } else { 46 this.isAll = false 47 } 48 } 49 } 50 }) 51 </script> 52 </body> 53 </html>