Vue
1、Vue快速起步
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| |
| |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| </head> |
| <body> |
| <div id="app"> |
| {{msg}} |
| </div> |
| <script> |
| let vue = new Vue({ |
| el: "#app", |
| data: { |
| msg:"啦啦啦啦" |
| } |
| }); |
| </script> |
| </body> |
| </html> |
2、v-bind的使用
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| </head> |
| <body> |
| <div id="app"> |
| <a v-bind:title="msg">床前明月光</a> |
| <a :title="msg2">凄凄惨惨戚戚</a> |
| </div> |
| |
| <script> |
| var app = new Vue({ |
| el: "#app", |
| data: { |
| msg: "李白", |
| msg2: "李清照" |
| } |
| }); |
| </script> |
| </body> |
| </html> |
3、v-on的使用
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| </head> |
| <body> |
| <div id="app"> |
| <button v-on:click="f1">点点</button> |
| <button @click="f2">点点2</button> |
| </div> |
| |
| <script> |
| |
| var app = new Vue({ |
| el: "#app", |
| data:{ |
| }, |
| methods: { |
| f1: function() { |
| console.log("f1......"); |
| }, |
| f2: function() { |
| console.log("f2......"); |
| } |
| } |
| }); |
| </script> |
| </body> |
| </html> |
4、走马灯例子体会Vue的单向绑定
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| </head> |
| <body> |
| |
| <div id="app"> |
| <button @click="lang">浪起来</button> |
| <button v-on:click="stop">不要浪了</button> |
| {{msg}} |
| </div> |
| |
| <script> |
| let time; |
| let vue = new Vue({ |
| el: "#app", |
| data: { |
| msg: "大家好呀,欢迎来到..." |
| }, |
| methods: { |
| lang(){ |
| this.msg=this.msg.substring(1)+this.msg.substring(0,1); |
| clearTimeout(time); |
| time = setTimeout(this.lang,1000); |
| }, |
| stop(){ |
| clearTimeout(time); |
| } |
| } |
| }) |
| </script> |
| </body> |
| </html> |
5、Vue中的5个事件修饰符
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| <style> |
| #d1 { |
| width: 300px; height: 300px; background-color: #00b9f1; |
| } |
| #d2 { |
| width: 200px; height: 200px; background-color: #8ab42e; |
| } |
| #d3 { |
| width: 100px; height: 100px; background-color: #ff6600; |
| } |
| </style> |
| </head> |
| <body> |
| <div id="app"> |
| <button @click.once="f1">一次性事件</button> |
| <br /> |
| <a href="http://www.baidu.com" @click.prevent="f2">阻止默认事件的发生</a> |
| <br /> |
| <div id="d1" @click="d1"> |
| <div id="d2" @click="d2"> |
| <div id="d3" @click="d3"> |
| |
| |
| |
| </div> |
| </div> |
| </div> |
| </div> |
| <script> |
| var app = new Vue({ |
| el: "#app", |
| data: { |
| msg: "Hello!!" |
| }, |
| methods: { |
| f1() { |
| console.log("f1: " + new Date().getTime()); |
| }, |
| f2() { |
| alert("f2...."); |
| }, |
| |
| d1() { |
| console.log("d1"); |
| }, |
| d2() { |
| console.log("d2"); |
| }, |
| d3() { |
| console.log("d3"); |
| } |
| } |
| }); |
| </script> |
| </body> |
| </html> |
5.1 事件委托
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| <style> |
| #d1 { |
| width: 300px; height: 300px; background-color: #00b9f1; |
| } |
| #d2 { |
| width: 200px; height: 200px; background-color: #8ab42e; |
| } |
| #d3 { |
| width: 60px; height: 60px; background-color: #ff6600; |
| } |
| #d4 { |
| width: 60px; height: 60px; background-color: #ff00f2; |
| } |
| </style> |
| </head> |
| <body> |
| <div id="app"> |
| <button @click.once="f1">一次性事件</button> |
| <br /> |
| <a href="http://www.baidu.com" @click.prevent="f2">阻止默认事件的发生</a> |
| <br /> |
| <div id="d1" @click="d1"> |
| <div id="d2" > |
| <div id="d3"> |
| |
| </div> |
| <div id="d4"> |
| |
| </div> |
| </div> |
| </div> |
| </div> |
| <script> |
| var app = new Vue({ |
| el: "#app", |
| data: { |
| msg: "Hello!!" |
| }, |
| methods: { |
| f1() { |
| console.log("f1: " + new Date().getTime()); |
| }, |
| f2() { |
| alert("f2...."); |
| }, |
| d1(e) { |
| let t=e.target; |
| |
| if(t.id=="d3"){ |
| console.log("33333"); return ; |
| } |
| if(t.id=="d4"){ |
| console.log("4444"); return ; |
| } |
| } |
| } |
| }); |
| </script> |
| </body> |
| </html> |
6、Vue双向绑定
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| |
| </head> |
| <body> |
| <div id="app"> |
| <button @click="f1">点我试试</button> |
| {{msg}} <br> |
| <input v-model:value="msg"> |
| </div> |
| |
| <script> |
| let vue = new Vue({ |
| el: "#app", |
| data: { |
| msg:"哈哈哈" |
| }, |
| methods: { |
| f1(){ |
| this.msg="点就点" |
| } |
| } |
| }) |
| |
| </script> |
| </body> |
| </html> |
6.1 双向绑定例子
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| |
| </head> |
| <body> |
| <div id="app"> |
| <input id="i1" v-model:value="num1"> + <input id="i2" v-model:value="num2"> <button @click="calc"> = </button> |
| <input :value="ans"> |
| </div> |
| <script> |
| let vue = new Vue({ |
| el: "#app", |
| data: { |
| num1:null, |
| num2:null, |
| ans:null |
| }, |
| methods: { |
| calc(){ |
| this.ans=Number(this.num1)+Number(this.num2); |
| } |
| } |
| }) |
| </script> |
| </body> |
| </html> |
7、Vue绑定元素的class属性
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| <style> |
| .aa { |
| border: #000000 solid 1px; |
| } |
| .bb { |
| background-color: aquamarine; |
| } |
| .cc { |
| font-size: 30px; |
| } |
| </style> |
| </head> |
| <body> |
| <div id="app"> |
| |
| <div v-bind:class="['aa','bb','cc']"> |
| Vue |
| </div> |
| |
| <div v-bind:class="[p, p2, p3]"> |
| Vue2 |
| </div> |
| |
| <div v-bind:class="[ {'aa':flag},{'bb':flag2},{'cc':flag3} ]"> |
| Vue3 |
| </div> |
| |
| <div v-bind:class="[ flag4 ? 'aa' : 'bb' ]"> |
| Vue4 |
| </div> |
| |
| </div> |
| <script> |
| var app = new Vue({ |
| el: "#app", |
| data: { |
| p: "aa", |
| p2: "bb", |
| p3: "cc", |
| flag: true, |
| flag2: true, |
| flag3: true, |
| flag4: true |
| } |
| }); |
| </script> |
| </body> |
| </html> |
8、v-for的使用
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| |
| </head> |
| <body> |
| <div id="app"> |
| |
| <div v-for="item in list"> |
| {{item}}<br> |
| </div> |
| |
| |
| <div v-for="(item,idx) in arr"> |
| {{idx}}---{{item}}<br> |
| </div> |
| |
| |
| <div v-for="(v,k) in user"> |
| {{k}}---{{v}} |
| </div> |
| |
| |
| <div v-for="item in 10"> |
| {{item}} |
| </div> |
| |
| </div> |
| |
| <script> |
| let vue = new Vue({ |
| el: "#app", |
| data: { |
| list: [ |
| {id: 1, name: '关羽'}, |
| {id: 2, name: '张飞'}, |
| {id: 3, name: '赵云'}, |
| {id: 4, name: '马超'}, |
| {id: 5, name: '黄忠'}, |
| ], |
| arr: [11,22,33,44,55], |
| user: { |
| uid: 1001, |
| name: "岳不群", |
| age: 24, |
| address: "华山派" |
| } |
| } |
| }); |
| </script> |
| </body> |
| </html> |
8.1 v-for的例子
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| |
| |
| </head> |
| <body> |
| <div id="app"> |
| <input type="text" v-model="msg"> |
| |
| <button @click="add">增加</button> |
| |
| |
| |
| |
| |
| |
| |
| <div v-for="item in getList()" :key="item.id"> |
| <input type="checkbox"> {{item.id}}--{{item.name}} |
| </div> |
| </div> |
| |
| <script> |
| let vue = new Vue({ |
| el: "#app", |
| data: { |
| list: [ |
| {id: 1, name: '关羽'}, |
| {id: 2, name: '张飞'}, |
| {id: 3, name: '赵云'}, |
| {id: 4, name: '马超'}, |
| {id: 5, name: '黄忠'}, |
| ], |
| msg:"", |
| cnt:"", |
| }, |
| methods: { |
| add(){ |
| cnt=this.list.length; |
| this.list.unshift({id:++cnt,name:this.msg}) |
| }, |
| getList(){ |
| console.log("调用了额"); |
| return this.list; |
| } |
| } |
| }); |
| </script> |
| </body> |
| </html> |
9、v-if与v-show的区别
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| |
| </head> |
| <body> |
| <div id="app"> |
| |
| |
| |
| |
| |
| |
| <div v-if="flag"> |
| 你看的见我吗 |
| </div> |
| <div v-show="flag"> |
| 你真的看得见我吗 |
| </div> |
| <button @click="toggle">我点</button> |
| </div> |
| |
| <script> |
| let vue =new Vue({ |
| el: "#app", |
| data: { |
| flag:true |
| }, |
| methods: { |
| toggle(){ |
| this.flag=!this.flag; |
| } |
| } |
| }); |
| </script> |
| </body> |
| </html> |
10、Vue的过滤器
10.1 vue的全局过滤器
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| </head> |
| <body> |
| <div id="app"> |
| |
| {{msg|foo}} <br> |
| |
| {{msg|bar(3)}} <br> |
| </div> |
| |
| <div id="app2"> |
| {{msg|foo|bar(10)}} |
| </div> |
| |
| <script> |
| |
| |
| Vue.filter("foo", function(data) { |
| var n = parseInt(Math.random() * 100 + 1); |
| return data + " " + n; |
| }); |
| |
| Vue.filter("bar", function(data, n) { |
| var str = ""; |
| for(var i = 1; i <= n; i++) { |
| str += " " + data + " "; |
| } |
| return str; |
| }) |
| |
| |
| var app = new Vue({ |
| el: "#app", |
| data: { |
| msg:"无崖子" |
| } |
| }); |
| |
| |
| var app2 = new Vue({ |
| el: "#app2", |
| data: { |
| msg: "丁春秋" |
| } |
| }); |
| </script> |
| </body> |
| </html> |
10.2 vue的私有过滤器
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| </head> |
| <body> |
| <div id="app" > |
| {{msg|foo|bar('orange')}} |
| </div> |
| |
| <div id="app2"> |
| |
| {{msg|foo}} |
| </div> |
| |
| <script> |
| |
| |
| var app = new Vue({ |
| el: "#app", |
| data: { |
| msg:"无崖子" |
| }, |
| filters: { |
| "foo": function(data) { |
| return data + " " +new Date().getTime(); |
| }, |
| "bar": function(data, color) { |
| return "<font color='"+color+"'>" + data + "</font>"; |
| } |
| } |
| }); |
| |
| |
| var app2 = new Vue({ |
| el: "#app2", |
| data: { |
| msg: "丁春秋" |
| } |
| }); |
| </script> |
| </body> |
| </html> |
11、 按键修饰符
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| |
| </head> |
| <body> |
| <div id="app"> |
| |
| |
| |
| <input type="text" @keyup.a="f1"> |
| </div> |
| |
| <script> |
| let vue = new Vue({ |
| el:"#app", |
| data: { |
| }, |
| methods: { |
| f1(e){ |
| console.log(e.keyCode); |
| } |
| } |
| }); |
| </script> |
| </body> |
| </html> |
12、Vue自定义指令
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| </head> |
| <body> |
| |
| |
| <div id="app"> |
| <input type="text" > |
| <input type="text" > |
| <input type="text" v-focus v-mycolor="'blue'" > |
| </div> |
| <script> |
| |
| |
| |
| Vue.directive("focus", { |
| |
| |
| |
| bind: function(el) { |
| el.style.backgroundColor = "lightblue"; |
| console.log("bind..."); |
| }, |
| |
| |
| inserted: function(el) { |
| el.focus(); |
| console.log("inserted"); |
| } |
| }); |
| |
| |
| |
| var app = new Vue({ |
| el: "#app", |
| data: { |
| msg: "aaaa" |
| }, |
| |
| directives: { |
| "mycolor": { |
| bind(el,binding) { |
| el.style.color = binding.value; |
| } |
| } |
| } |
| }); |
| </script> |
| |
| </body> |
| </html> |
13、生命周期钩子函数

code
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| |
| </head> |
| <body> |
| <div id="app"> |
| {{msg}} <br> |
| <button type="button" @click="f1">点我更新额</button> <br> |
| <button type="button" @click="f2">点我关闭额</button> |
| |
| </div> |
| |
| <script> |
| |
| |
| let vue = new Vue({ |
| el: "#app", |
| data: { |
| msg:"哈哈", |
| }, |
| |
| beforeCreate(){ |
| console.log("beforeCreated......"+this.msg); |
| }, |
| created(){ |
| console.log("created......"+this.msg); |
| }, |
| beforeMount(){ |
| console.log("beforeMount....."); |
| let t = document.getElementById("app").innerHTML; |
| console.log(t); |
| }, |
| mounted(){ |
| console.log("mounted....."); |
| let t = document.getElementById("app").innerHTML; |
| console.log(t); |
| }, |
| beforeUpdate(){ |
| console.log("beforeUpdate...."+this.msg); |
| let t = document.getElementById("app").innerHTML; |
| console.log(t); |
| }, |
| updated(){ |
| console.log("updated...."+this.msg); |
| let t = document.getElementById("app").innerHTML; |
| console.log(t); |
| }, |
| beforeDestroy(){ |
| console.log("beforeDestroy..."+this.msg); |
| let t = document.getElementById("app").innerHTML; |
| console.log(t); |
| }, |
| destroyed(){ |
| console.log("destroy..."+this.msg); |
| let t = document.getElementById("app").innerHTML; |
| console.log(t); |
| }, |
| methods: { |
| f1(){ |
| this.msg="666" |
| }, |
| f2(){ |
| this.$destroy(); |
| } |
| } |
| |
| }); |
| </script> |
| </body> |
| </html> |
运行结果

14、SpringBoot-Vue
html页面
优化前版本
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <title>Title</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| <script src="https://cdn.bootcss.com/axios/0.19.2/axios.min.js"></script> |
| <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> |
| <script src="https://cdn.bootcdn.net/ajax/libs/layer/3.1.1/layer.js"></script> |
| </head> |
| <body> |
| <div id="app"> |
| <form> |
| <input type="text" name="name" v-model="name"> <br> |
| <input type="text" name="time" v-model="time"> <br> |
| <input type="button" @click="add" value="添加"> |
| </form> |
| <table> |
| <tr> |
| <td>Id</td> |
| <td>姓名</td> |
| <td>生日</td> |
| <td>操作</td> |
| </tr> |
| <tr v-for="item in list"> |
| <td>{{item.id}}</td> |
| <td>{{item.name}}</td> |
| <td>{{item.time}}</td> |
| <td> |
| |
| <button @click="del(item.id)">删除</button> |
| | |
| <button @click="updateUI(item)">修改</button> |
| </td> |
| </tr> |
| |
| </table> |
| |
| <div id="up" style="display: none"> |
| <input type="hidden" name="id" v-model="id2"> <br> |
| <input type="text" name="name" v-model="name2"> <br> |
| <input type="text" name="time" v-model="time2"> <br> |
| <button @click="updateContent">修改</button> |
| </div> |
| |
| </div> |
| |
| |
| |
| <script> |
| let vue = new Vue({ |
| el: "#app", |
| data: { |
| list:[], |
| name:"", |
| time:"", |
| id2:"", |
| time2:"", |
| name2:"", |
| w:"" |
| }, |
| created(){ |
| |
| this.findAll(); |
| }, |
| methods: { |
| add(){ |
| let obj= {}; |
| obj.name=this.name; |
| obj.time=this.time; |
| let json = JSON.stringify(obj); |
| let config = { |
| headers: { |
| "Content-Type":"application/json" |
| } |
| } |
| let self = this; |
| axios.post("http://localhost:8080/users",json,config).then(function (response){ |
| self.name=self.time=""; |
| self.findAll(); |
| }) |
| }, |
| findAll(){ |
| let self = this; |
| axios.get("http://localhost:8080/users").then(function (response){ |
| console.log(response); |
| self.list=response.data.data; |
| }) |
| }, |
| del(id){ |
| |
| let self = this; |
| axios.delete("http://localhost:8080/users/"+id).then(function (response){ |
| console.log(response); |
| self.findAll(); |
| }).catch(function (response){ |
| console.log("异常") |
| console.log(response); |
| }) |
| }, |
| updateUI(u){ |
| this.id2=u.id; |
| this.name2=u.name; |
| this.time2=u.time; |
| this.w = layer.open({ |
| title: "修改用户", |
| type:1, |
| content: $("#up"), |
| }); |
| }, |
| updateContent(){ |
| obj = {} |
| obj.id=this.id2; |
| obj.name=this.name2; |
| obj.time=this.time2; |
| let json = JSON.stringify(obj); |
| console.log(json+"!!!!!!!"); |
| let config = { |
| headers: { |
| "Content-Type":"application/json" |
| } |
| } |
| let self = this; |
| axios.put("http://localhost:8080/users",json,config).then(function (response){ |
| self.findAll(); |
| self.id2=self.name2=self.time2=""; |
| layer.close(self.w); |
| }) |
| } |
| } |
| }); |
| </script> |
| </body> |
| </html> |
优化后版本
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <title>Title</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| <script src="https://cdn.bootcss.com/axios/0.19.2/axios.min.js"></script> |
| <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> |
| <script src="https://cdn.bootcdn.net/ajax/libs/layer/3.1.1/layer.js"></script> |
| </head> |
| <body> |
| <div id="app"> |
| <form> |
| <input type="text" name="name" v-model="saveForm.name"> <br> |
| <input type="text" name="time" v-model="saveForm.time"> <br> |
| <input type="button" @click="add" value="添加"> |
| </form> |
| <table> |
| <tr> |
| <td>Id</td> |
| <td>姓名</td> |
| <td>生日</td> |
| <td>操作</td> |
| </tr> |
| <tr v-for="item in list"> |
| <td>{{item.id}}</td> |
| <td>{{item.name}}</td> |
| <td>{{item.time}}</td> |
| <td> |
| |
| <button @click="del(item.id)">删除</button> |
| | |
| <button @click="updateUI(item)">修改</button> |
| </td> |
| </tr> |
| |
| </table> |
| |
| <div id="up" style="display: none"> |
| <input type="hidden" name="id" v-model="updateForm.id"> <br> |
| <input type="text" name="name" v-model="updateForm.name"> <br> |
| <input type="text" name="time" v-model="updateForm.time"> <br> |
| <button @click="updateContent">修改</button> |
| </div> |
| |
| </div> |
| |
| |
| |
| <script> |
| |
| axios.defaults.baseURL = "http://localhost:8080/myProject/" |
| |
| |
| |
| |
| axios.interceptors.request.use(function (config){ |
| config.headers.contentType = "application/json"; |
| return config; |
| }) |
| let vue = new Vue({ |
| el: "#app", |
| data: { |
| list:[], |
| saveForm:{ |
| name:"", |
| time:"", |
| }, |
| updateForm:{ |
| id:"", |
| name:"", |
| time:"", |
| }, |
| w:"" |
| }, |
| created(){ |
| |
| this.findAll(); |
| }, |
| methods: { |
| add(){ |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| let self = this; |
| axios.post("users",this.saveForm).then(function (response){ |
| self.saveForm.name=self.saveForm.time=""; |
| self.findAll(); |
| }) |
| }, |
| findAll(){ |
| let self = this; |
| axios.get("users").then(function (response){ |
| |
| self.list=response.data.data; |
| }) |
| }, |
| del(id){ |
| let self = this; |
| axios.delete("users/"+id).then(function (response){ |
| console.log(response); |
| self.findAll(); |
| }).catch(function (response){ |
| console.log("异常") |
| console.log(response); |
| }) |
| }, |
| updateUI(u){ |
| this.updateForm.id=u.id; |
| this.updateForm.name=u.name; |
| this.updateForm.time=u.time; |
| this.w = layer.open({ |
| title: "修改用户", |
| type:1, |
| content: $("#up"), |
| }); |
| }, |
| updateContent(){ |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| let self = this; |
| axios.put("users",this.updateForm).then(function (response){ |
| self.findAll(); |
| self.updateForm.id=self.updateForm.name=self.updateForm.time=""; |
| |
| layer.close(self.w); |
| }) |
| } |
| } |
| }); |
| </script> |
| </body> |
| </html> |
15、Vue的组件
15.1 创建Vue组件的三种方式
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| </head> |
| <body> |
| <div id="app"> |
| {{msg}} !!! |
| |
| <my-component></my-component> |
| <my-component2></my-component2> |
| <my-component3></my-component3> |
| </div> |
| <script> |
| |
| |
| |
| |
| |
| |
| |
| var component = Vue.extend({ |
| template: "<h3>组件1</h3>" |
| }); |
| |
| |
| Vue.component("myComponent", component); |
| |
| |
| |
| |
| Vue.component("myComponent2", { |
| template: "<h3>组件2</h3>" |
| }); |
| |
| </script> |
| |
| |
| |
| |
| |
| |
| |
| <template id="t1"> |
| <div> |
| <div> |
| <h3>组件3</h3> |
| </div> |
| <div> |
| <h3>hahahah</h3> |
| </div> |
| </div> |
| </template> |
| |
| <script> |
| |
| |
| |
| Vue.component("myComponent3", { |
| template: "#t1", |
| }); |
| |
| var app = new Vue({ |
| el: "#app", |
| data: { |
| msg: "test" |
| } |
| }); |
| </script> |
| |
| |
| |
| </body> |
| </html> |
15.2 Vue组件的属性和方法
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| |
| </head> |
| <body> |
| <div id="app"> |
| {{msg}} |
| <fieldset> |
| <my-component></my-component> |
| </fieldset> |
| |
| </div> |
| |
| <template id="t1"> |
| <div> |
| 我是子组件 |
| msg2: {{msg2}} |
| <br> |
| <button @click="f1">点点</button> |
| </div> |
| </template> |
| <script> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Vue.component("myComponent",{ |
| template:"#t1", |
| data(){ |
| return{ |
| msg2:"我是子组件的属性额" |
| } |
| }, |
| methods:{ |
| f1(){ |
| console.log("我是子组件的方法"); |
| } |
| } |
| }) |
| |
| let vue = new Vue({ |
| el: "#app", |
| data: { |
| msg: "haha " |
| } |
| }); |
| </script> |
| </body> |
| </html> |
15.3 Vue私有组件
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| |
| </head> |
| <body> |
| <div id="app"> |
| 父组件 |
| <fieldset> |
| <foo></foo> |
| </fieldset> |
| |
| </div> |
| |
| <template id="t1"> |
| <div> |
| 子组件 |
| msg1: {{msg1}} |
| msg2: {{msg2}} |
| <br> |
| <button @click="f1">点我</button> |
| </div> |
| </template> |
| |
| <script> |
| let vue = new Vue({ |
| el:"#app", |
| data: { |
| |
| }, |
| methods: { |
| |
| }, |
| components:{ |
| "foo": { |
| template:"#t1", |
| data(){ |
| return { |
| msg1:"你猜我会不会变化", |
| msg2:" 我是子组件额!" |
| } |
| }, |
| methods: { |
| f1(){ |
| |
| this.msg1="你猜对了,我变了"; |
| } |
| } |
| } |
| } |
| }); |
| |
| </script> |
| </body> |
| </html> |
15.4 Vue组件的切换
15.4.1 Vue组件的切换方式1
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| |
| </head> |
| <body> |
| <div id="app"> |
| <a @click="flag=true">登录</a> |
| <a @click="flag=false">注册</a> |
| <login-component v-if="flag"></login-component> |
| <reg-component v-if="!flag"></reg-component> |
| </div> |
| |
| <template id="t1"> |
| <div> |
| msg1: {{msg1}} |
| </div> |
| </template> |
| |
| <template id="t2"> |
| <div> |
| msg2: {{msg2}} |
| </div> |
| </template> |
| <script> |
| let vue = new Vue({ |
| el: "#app", |
| data: { |
| flag:true |
| }, |
| methods: { |
| |
| }, |
| components:{ |
| "loginComponent":{ |
| template:"#t1", |
| data(){ |
| return { |
| msg1:"我是登录额!!" |
| } |
| } |
| }, |
| "regComponent":{ |
| template: "#t2", |
| data(){ |
| return { |
| msg2:"我是注册额!!!" |
| } |
| } |
| } |
| } |
| }); |
| |
| </script> |
| </body> |
| </html> |
15.4.2 Vue组件的切换方式2
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| |
| </head> |
| <body> |
| <div id="app"> |
| 我是父组件 |
| <fieldset> |
| <a @click.prevent="cname='loginComponent'">登录</a> |
| <a @click.prevent="cname='regComponent'">注册</a> |
| <a @click.prevent="cname='menuComponent'">菜单</a> |
| |
| |
| |
| |
| |
| |
| |
| |
| <component :is="cname"></component> |
| <component :is="cname"></component> |
| |
| </fieldset> |
| |
| </div> |
| |
| <template id="t1"> |
| <div> |
| 我是登录额!! |
| </div> |
| </template> |
| |
| <template id="t2"> |
| <div> |
| 我是注册额!!!! |
| </div> |
| </template> |
| |
| <template id="t3"> |
| <div> |
| 我是菜单额!!!!!! |
| </div> |
| </template> |
| |
| <script> |
| let vue = new Vue({ |
| el:"#app", |
| data: { |
| cname:"loginComponent" |
| }, |
| methods: { |
| |
| }, |
| components: { |
| "loginComponent":{ |
| template:"#t1" |
| }, |
| "regComponent":{ |
| template:"#t2" |
| }, |
| "menuComponent":{ |
| template:"#t3" |
| } |
| } |
| |
| }); |
| </script> |
| </body> |
| </html> |
15.5 Vue的子组件访问父组件
15.5.1 Vue的子组件访问父组件属性
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| |
| </head> |
| <body> |
| <div id="app"> |
| 我是父组件额: {{msg1}} |
| <fieldset> |
| |
| <foo :aa="msg1"></foo> |
| </fieldset> |
| |
| |
| </div> |
| |
| <template id="t1"> |
| <div> |
| |
| msg2:{{msg2}} |
| 访问父组件的属性: {{aa}} |
| </div> |
| </template> |
| |
| <script> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| let vue = new Vue({ |
| el:"#app", |
| data: { |
| msg1:"我是父组件额!!" |
| }, |
| methods: { |
| |
| }, |
| components: { |
| "foo": { |
| template:"#t1", |
| data(){ |
| return { |
| msg2:"我是子组件额!!" |
| } |
| }, |
| props:["aa"], |
| }, |
| |
| }, |
| |
| }); |
| |
| </script> |
| </body> |
| </html> |
15.5.2 Vue的子组件访问父组件方法
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| |
| </head> |
| <body> |
| <div id="app"> |
| 我是父组件额: {{msg1}} |
| <fieldset> |
| <foo @abc="f1"></foo> |
| </fieldset> |
| </div> |
| |
| <template id="t1"> |
| <div> |
| 这里是子组件额 |
| <button @click="f2">点我调用父组件的方法额</button> |
| </div> |
| </template> |
| |
| <script> |
| |
| let vue = new Vue({ |
| el:"#app", |
| data: { |
| msg1:"我是父组件额!!" |
| }, |
| methods: { |
| f1(){ |
| console.log("我是父组件的方法!!!"); |
| } |
| }, |
| components: { |
| "foo": { |
| template:"#t1", |
| methods: { |
| f2(){ |
| console.log("我是子组件的方法!!!"); |
| |
| |
| |
| this.$emit("abc"); |
| } |
| } |
| }, |
| |
| }, |
| |
| }); |
| |
| </script> |
| </body> |
| </html> |
15.6 Vue的父组件访问子组件的属性和方法
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| |
| </head> |
| <body> |
| <div id="app"> |
| 我是父组件额 |
| |
| <button @click="f1">查看子组件的属性</button> |
| <br> |
| {{msg1}} |
| |
| <fieldset> |
| <foo ref="d1"></foo> |
| </fieldset> |
| </div> |
| |
| <template id="t1"> |
| <div> |
| {{msg2}} |
| </div> |
| </template> |
| |
| <script> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| let vue = new Vue({ |
| el:"#app", |
| data:{ |
| msg1:"我是父组件!" |
| }, |
| methods: { |
| f1(){ |
| this.msg1=this.$refs.d1.msg2; |
| this.$refs.d1.f1(); |
| } |
| }, |
| components:{ |
| "foo":{ |
| template:"#t1", |
| data(){ |
| return { |
| msg2:"我是子组件!!!!!!!!!!!!!" |
| } |
| }, |
| methods: { |
| f1(){ |
| console.log("我是子组件的方法!!!"); |
| } |
| } |
| } |
| } |
| }); |
| |
| </script> |
| </body> |
| </html> |
15.7 Vue提供的如何获取DOM元素的API
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| </head> |
| <body> |
| <div id="app"> |
| <div ref="d1">{{msg}}</div> |
| <button @click="f1">点我</button> |
| </div> |
| <script> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| var app = new Vue({ |
| el: "#app", |
| data : { |
| msg: "九阴真经" |
| }, |
| methods: { |
| f1() { |
| |
| |
| |
| |
| |
| |
| |
| |
| this.$refs.d1.innerHTML = "天之道,损有余而补不足~~~"; |
| } |
| } |
| }); |
| </script> |
| </body> |
| </html> |
总结:
子组件访问父组件的属性: 通过子组件的props
子组件访问父组件的方法: 通过子组件的$emit
父组件访问子组件的属性:$refs
父组件访问子组件的方法:$refs
子组件访问父组件应用
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| </head> |
| <body> |
| <div id="app"> |
| <div v-for="item in userList"> |
| <user-component :id="item.id" :name="item.name" :photo="item.photo"></user-component> |
| </div> |
| </div> |
| |
| <template id="userDiv"> |
| <div style="float: left; margin: 5px; width: 200px; border:#abcdef solid 1px"> |
| <table width="100%"> |
| <tr> |
| <td>id</td> |
| <td>{{id}}</td> |
| </tr> |
| <tr> |
| <td>name</td> |
| <td>{{name}}</td> |
| </tr> |
| <tr> |
| <td>photo</td> |
| <td> |
| <img :src="'img/'+ photo" width="100" height="75" /> |
| </td> |
| </tr> |
| </table> |
| </div> |
| </template> |
| |
| <script> |
| var app = new Vue({ |
| el: "#app", |
| data: { |
| userList: [ |
| {id:1, name:"张三",photo:"1.jpg"}, |
| {id:2, name:"李四",photo:"2.jpg"}, |
| {id:3, name:"王五",photo:"3.jpg"}, |
| ] |
| }, |
| components: { |
| "userComponent": { |
| template: "#userDiv", |
| props:['id', 'name', 'photo'] |
| } |
| } |
| }); |
| </script> |
| |
| </body> |
| </html> |
16、Vue路由
16.1 Vue快速起步
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| |
| <script src="https://cdn.bootcss.com/vue-router/3.1.3/vue-router.min.js"></script> |
| <style> |
| a { |
| text-decoration: none; |
| } |
| .router-link-active { |
| background-color: #abcdef; |
| color: white; |
| } |
| </style> |
| </head> |
| <body> |
| <div id="app"> |
| |
| |
| <router-link to="login">去登录</router-link> |
| <router-link to="reg">去注册</router-link> |
| <router-link to="index">去首页</router-link> |
| |
| |
| |
| |
| |
| <router-view></router-view> |
| |
| </div> |
| |
| <template id="t1"> |
| <div> |
| 登录UI |
| </div> |
| </template> |
| |
| <template id="t2"> |
| <div> |
| 注册UI |
| </div> |
| </template> |
| |
| <template id="t3"> |
| <div> |
| 首页UI |
| </div> |
| </template> |
| |
| |
| <script> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| let loginComponent = { |
| template:"#t1" |
| } |
| |
| let regComponent = { |
| template:"#t2" |
| } |
| |
| let menuComponent = { |
| template:"#t3" |
| } |
| |
| let router = new VueRouter({ |
| |
| routes:[ |
| {component:loginComponent,path:"/login"}, |
| {component:regComponent,path:"/reg"}, |
| {component:menuComponent,path:"/index"} |
| ] |
| }); |
| |
| var app = new Vue({ |
| el: "#app", |
| router |
| }); |
| </script> |
| |
| <marquee> |
| 飞雪 |
| </marquee> |
| </body> |
| </html> |
16.2 Vue二级路由
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document</title> |
| <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> |
| <script src="https://cdn.bootcss.com/vue-router/3.1.3/vue-router.min.js"></script> |
| </head> |
| <body> |
| <div id="app"> |
| <router-link to="/user">用户管理</router-link> |
| <router-link to="/car">汽车管理</router-link> |
| <router-view></router-view> |
| </div> |
| |
| <template id="t1"> |
| <div> |
| 用户管理界面 <br> |
| <router-link to="/user/add">添加用户</router-link> |
| <router-link to="/user/find">查看用户</router-link> |
| <router-view></router-view> |
| </div> |
| </template> |
| |
| <template id="t1_1"> |
| <div> |
| 添加用户界面: |
| name: <input type="text"> |
| <button>add user</button> |
| </div> |
| </template> |
| |
| <template id="t1_2"> |
| <div> |
| 查看用户界面: |
| 1 -- 张三 -- 22岁 <br> |
| 2 -- 李四 -- 23岁 <br> |
| 3 -- 王五 -- 24岁 <br> |
| </div> |
| </template> |
| |
| |
| <template id="t2"> |
| <div> |
| 汽车管理界面 |
| </div> |
| </template> |
| |
| <script> |
| |
| var userComponent = { |
| template: "#t1" |
| }; |
| var userAddComponent = { |
| template: "#t1_1" |
| }; |
| var userFindComponent = { |
| template: "#t1_2" |
| }; |
| |
| |
| var carComponent = { |
| template: "#t2" |
| }; |
| |
| var router = new VueRouter({ |
| routes: [ |
| { |
| component: userComponent, path: "/user", |
| children: [ |
| {component: userAddComponent, path:"/user/add"}, |
| {component: userFindComponent, path:"/user/find"} |
| ] |
| }, |
| {component: carComponent, path:"/car"} |
| ] |
| }); |
| |
| var app = new Vue({ |
| el: "#app", |
| router |
| }); |
| </script> |
| </body> |
| </html> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗