Vue 监视数据总结 && 表单控件使用总结
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 <title>Vue 监视数据的原理</title> 6 <script type="text/javascript" src="../js/vue.js"></script> 7 </head> 8 <body> 9 <!-- 10 监视数据的原理: 11 1.Vue会监视data中所有层次的数据 12 2.如何检测对象中的数据? 13 .通过setter实现检测,且要在new Vue时就传入要检测的数据 14 .对象中后追加的属性,Vue默认不做响应式处理 15 .如需要给后添加的属性做响应式,请使用如下API: 16 .Vue.set(target, propertyName/index, value) 或 17 .this.$set(target, propertyName/index, value) 18 3.如何检测数组中的数据? 19 .通过包裹数组更新元素的方法实现,本质就是做了两件事: 20 .调用原生对应的方法对数组进行更新 21 .重新解析模板,进而更新页面 22 4.在Vue修改数组中的某个元素,一定要用如下方法: 23 .使用这些API:psh(),pop(),shift(),unshift(),splice(),reverse(),sort() 24 .Vue.set() 或 vm.$set() 25 特别注意:Vue.set 和 vm.$set() 不能给vm 或 vm的根数据对象,添加属性 26 --> 27 <div id="root"> 28 <h2>学生信息</h2> 29 <button @click=" student.age++ ">年龄+1岁</button> <br /> <br /> 30 <button @click=" addDefaultSex">添加性别属性,默认值:男</button> <br /> <br /> 31 <button @click=" student.sex = '未知'">修改性别</button> <br /> <br /> 32 <button @click=" addFriend">在列表首位添加一个朋友</button> <br /> <br /> 33 <button @click=" modifyFirstFriendName">修改第一个朋友的名字为:张三</button> <br /> <br /> 34 <button @click=" addHobby">添加一个爱好</button> <br /> <br /> 35 <button @click=" modifyHobby">修改一个爱好为开车</button> <br /> <br /> 36 <button @click=" filterChouyan">过滤爱好中的抽烟</button> <br /> <br /> 37 38 <h3>姓名:{{student.name}}</h3> 39 <h3 v-if="student.sex">性别:{{student.sex}}</h3> 40 <h3>年龄:{{student.age}}</h3> 41 <h3>爱好:</h3> 42 <ul> 43 <li v-for="(h, index) in student.hobby" :key="index">{{h}}</li> 44 </ul> 45 <h3>朋友们:</h3> 46 <ul> 47 <li v-for="(f, index) in student.friends" :key="index">{{f.name}}-{{f.age}}</li> 48 </ul> 49 </div> 50 </body> 51 52 <script type="text/javascript" > 53 Vue.config.productionTip = false;// 阻止 vue 在启动时生成生产提示。 54 55 let vm = new Vue({ 56 el: "#root", 57 data:{ 58 student:{ 59 name: "Tom", 60 age: 18, 61 hobby: ["抽烟", "喝酒", "烫头"], 62 friends:[ 63 {name:"Jerry",age:17}, 64 {name:"Tony",age:20} 65 ] 66 } 67 }, 68 methods:{ 69 addDefaultSex(e){ 70 // Vue.set(this.student, 'sex', '男'); 71 this.$set(this.student, 'sex', '男'); 72 }, 73 addFriend(e){ 74 this.student.friends.unshift({name:"Tim",age:70}); 75 }, 76 modifyFirstFriendName(e){ 77 this.student.friends[0].name = "张三"; 78 79 }, 80 addHobby(e){ 81 this.student.hobby.push('看书'); 82 }, 83 modifyHobby(e){ 84 // this.student.hobby.splice(0,1,'开车') 85 this.$set(this.student.hobby, 0, "开车"); 86 }, 87 filterChouyan(e){ 88 const arr = this.student.hobby.filter((h)=>{ 89 return h !== "抽烟" 90 }); 91 this.student.hobby = arr; 92 } 93 } 94 }); 95 </script> 96 </html>
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 <title>Vue 收集表单数据</title> 6 <script type="text/javascript" src="../js/vue.js"></script> 7 </head> 8 <body> 9 <!-- 10 收集表单数据: 11 若:<input type="text" />,则v-model收集的是value值,用户输入的就是value值 12 若:<input type="radio" />,则v-model收集的是value值,且要给标签配置value值 13 若:<input type="checkbox" /> 14 1.没有配置input的value属性,name收集的就是checked(勾选 or 未勾选,是bool值) 15 2.配置input的value属性: 16 .v-model的初始值是非数组,MAME收集的就是checked(勾选 or 未勾选,是bool值) 17 .v-model的初始值是数组,那么收集的就是value组成的数组 18 备注:v-model的三个修饰符: 19 lazy: 失去焦点再收集数据 20 number:输入字符串转为有效数字 21 trim:去掉输入首尾空格 22 --> 23 <div id="root"> 24 <form @submit.prevent="submitForm"> 25 账号:<input type="text" v-model.trim="student.username"> <br /><br /> 26 密码:<input type="password" v-model="student.password"> <br /><br /> 27 性别: 28 男<input type="radio" name="sex" value="man" v-model="student.sex"> 29 女<input type="radio" name="sex" value="woman" v-model="student.sex"> <br /><br /> 30 年龄:<input type="number" v-model.number="student.age" /> <br /><br /> 31 爱好: 32 学习<input type="checkbox" value="study" v-model="student.hobby"> 33 打游戏<input type="checkbox" value="game" v-model="student.hobby"> 34 吃饭<input type="checkbox" value="eat" v-model="student.hobby"><br /><br /> 35 所属校区 36 <select v-model="student.shoolAddr"> 37 <option value="">请选择校区</option> 38 <option value="beijing">北京</option> 39 <option value="shenzhen">深圳</option> 40 <option value="shanghai">上海</option> 41 <option value="wuhan">武汉</option> 42 </select> 43 <br /><br /> 44 其他信息: 45 <textarea v-model.lazy="student.others"></textarea><br /><br /> 46 <input type="checkbox" v-model="student.accept">阅读并接受<a href="https://www.cargoarmor.com">《用户协议》</a> 47 <br /><br /> 48 <button>提交</button> 49 50 </form> 51 </div> 52 </body> 53 54 <script type="text/javascript" > 55 Vue.config.productionTip = false;// 阻止 vue 在启动时生成生产提示。 56 57 let vm = new Vue({ 58 el: "#root", 59 data:{ 60 student:{ 61 username: '', 62 password: '', 63 sex: 'man', 64 age: 27, 65 hobby: [], 66 shoolAddr: '', 67 others: '', 68 accept: true 69 } 70 }, 71 methods:{ 72 submitForm(e){ 73 console.log(JSON.stringify(this.student)); 74 } 75 } 76 }); 77 </script> 78 </html>