過濾器,就是vue容許開發者自定義的文本格式化函數,可使用在兩個地方:輸出內容和操做數據中。javascript
定義過濾器的方式有兩種。css
Vue.filter("RMB1", function(v){
//就是來格式化(處理)v這個數據的
if(v==0){
return v
}
return v+"元"
})
var vm = new Vue({
el:"#app",
data:{},
filters:{
RMB2:function(value){
if(value==''){
return;
}else{
return '¥ '+value;
}
}
}
});
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.js"></script> <!--導入自定義的過濾器函數--> <script src="js/filters.js"></script> </head> <body> <div id="app"> 價格:{{price|keepdot2(3)|RMB}}<br> 價格:{{price|keepdot2(3)|RMB}}<br> 價格:{{price|keepdot2(3)|RMB}}<br> 價格:{{price|keepdot2(3)}}<br> <!--以管道符將值傳入後面的過濾器函數裏--> </div> <script> var vm1 = new Vue({ el:"#app", data:{ price: 20.3 }, methods:{}, // 普經過濾器[局部過濾器] filters:{ keepdot2(value,dot){ return value.toFixed(dot) } } }) </script> </body> </html>
// 全局過濾器
// Vue.filter("過濾器名稱","調用過濾器時執行的函數")
Vue.filter("RMB",function(value){
return value+"元";
})
咱們以前學習過字符串反轉,若是直接把反轉的代碼寫在元素中,則會使得其餘同事在開發時時不易發現數據被調整了,因此vue提供了一個計算屬性(computed),可讓咱們把調整data數據的代碼存在在該屬性中。html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.min.js"></script> <script> window.onload = function(){ var vm = new Vue({ el:"#app", data:{ str1: "abcdefgh" }, computed:{ //計算屬性:裏面的函數都必須有返回值 strRevs: function(){ var ret = this.str1.split("").reverse().join(""); return ret } } }); } </script> </head> <body> <div id="app"> <p>{{ str1 }}</p> <p>{{ strRevs }}</p> </div> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.js"></script> <!--<script src="js/filters.js"></script>--> </head> <body> <div id="app"> 原價格:{{price|k2}}<br> 折扣價:{{new_price}}<br> </div> <script> var vm1 = new Vue({ el:"#app", data:{ price: 20.3, sale: 0.6, }, // 過濾器 filters:{ k2(value){ return value.toFixed(2) } }, // 計算屬性 computed:{ new_price(){ return (this.price*this.sale).toFixed(2); } } }) </script> </body> </html>
偵聽屬性,能夠幫助咱們偵聽data某個數據的變化,從而作相應的自定義操做。vue
偵聽屬性是一個對象,它的鍵是要監聽的對象或者變量,值通常是函數,當偵聽的data數據發生變化時,會自定執行的對應函數,這個函數在被調用時,vue會傳入兩個形參,第一個是變化前的數據值,第二個是變化後的數據值。java
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.min.js"></script> <script> window.onload = function(){ var vm = new Vue({ el:"#app", data:{ num:20 }, watch:{ num:function(newval,oldval){ //num發生變化的時候,要執行的代碼 console.log("num已經發生了變化!"); } } }) } </script> </head> <body> <div id="app"> <p>{{ num }}</p> <button @click="num++">按鈕</button> </div> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.js"></script> <script src="js/filters.js"></script> </head> <body> <div id="app"> <form action=""> 帳號:<input type="text" v-model="form.username"><span :style="user_style">{{user_text}}</span><br><br> 密碼:<input type="password" v-model="form.password"><br><br> 確認密碼:<input type="password" v-model="form.password2"><br><br> </form> </div> <script> var vm1 = new Vue({ el:"#app", data:{ form:{ username:"", password:"", password2:"", }, user_style:{ color: "red", }, user_text:"用戶名長度只能是4-10位" }, // 監聽屬性 // 監聽屬性的變化 watch:{ "form.username":function(value){ if(value.length>=4 && value.length<=10){ this.user_style.color="blue"; this.user_text="用戶名長度合法!"; }else{ this.user_style.color="red"; this.user_text="用戶名長度只能是4-10位!"; } } } }) </script> </body> </html>
每一個Vue對象在建立時都要通過一系列的初始化過程。在這個過程當中Vue.js會自動運行一些叫作生命週期的的鉤子函數,咱們可使用這些函數,在對象建立的不一樣階段加上咱們須要的代碼,實現特定的功能。ajax
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.min.js"></script> <script> window.onload = function(){ var vm = new Vue({ el:"#app", data:{ num:0 }, beforeCreate:function(){ console.log("beforeCreate,vm對象還沒有建立,num="+ this.num); //undefined this.name=10; // 此時沒有this對象呢,因此設置的name無效,被在建立對象的時候被覆蓋爲0 }, created:function(){ console.log("created,vm對象建立完成,設置好了要控制的元素範圍,num="+this.num ); // 0 this.num = 20; }, beforeMount:function(){ console.log( this.$el.innerHTML ); // <p>{{num}}</p> console.log("beforeMount,vm對象還沒有把data數據顯示到頁面中,num="+this.num ); // 20 this.num = 30; }, mounted:function(){ console.log( this.$el.innerHTML ); // <p>30</p> console.log("mounted,vm對象已經把data數據顯示到頁面中,num="+this.num); // 30 }, beforeUpdate:function(){ // this.$el 就是咱們上面的el屬性了,$el表示當前vue.js所控制的元素#app console.log( this.$el.innerHTML ); // <p>30</p> console.log("beforeUpdate,vm對象還沒有把更新後的data數據顯示到頁面中,num="+this.num); // beforeUpdate----31 }, updated:function(){ console.log( this.$el.innerHTML ); // <p>31</p> console.log("updated,vm對象已經把過呢更新後的data數據顯示到頁面中,num=" + this.num ); // updated----31 }, }); } </script> </head> <body> <div id="app"> <p>{{num}}</p> <button @click="num++">按鈕</button> </div> </body> </html>
總結:後端
在vue使用的過程當中,若是要初始化操做,把初始化操做的代碼放在 mounted 中執行。
mounted階段就是在vm對象已經把data數據實現到頁面之後。通常頁面初始化使用。例如,用戶訪問頁面加載成功之後,就要執行的ajax請求。
另外一個就是created,這個階段就是在 vue對象建立之後,把ajax請求後端數據的代碼放進 created
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.js"></script> <script src="js/filters.js"></script> </head> <body> <div id="app"> {{user_text}} </div> <script> // vm初始化時會有如下幾個階段 // 1. vm對象建立 // 2. vm對象把數據添加到data屬性中 // 3. vm對象顯示數據到視圖模板html頁面中 var vm1 = new Vue({ el:"#app", data:{ user_text:"用戶名長度只能是4-10位" }, // vm對象把數據添加到data屬性以前 beforeCreate(){ console.log("--------beforeCreate---------"); console.log("$data=",this.$data); console.log("$el",this.$el); console.log("user_text="+this.user_text) }, // vm對象把數據添加到data屬性以後 created(){ // 使用ajax到後端獲取數據給data console.log("----------created-------------"); console.log("$data=",this.$data); console.log("$el",this.$el); console.log("user_text="+this.user_text) }, // vm對象顯示數據到視圖模板html頁面以前 // 若是執行 beforeMount,則表示vm對象已經獲取到模板ID對象 beforeMount(){ console.log("----------beforeMount-------------"); console.log("$el",this.$el); }, // vm對象顯示數據到視圖模板html頁面之後 mounted(){ // 使用ajax或者js在頁面刷新前,完成頁面修改的操做 console.log("----------mounted-------------"); console.log("$el",this.$el); } }) </script> </body> </html>
使用.stop和.prevent數組
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .box1{ width: 200px; height: 200px; background: #ccc; } .box2{ width: 100px; height: 100px; background: pink; } </style> <script src="js/vue.min.js"></script> <script> window.onload = function(){ var vm = new Vue({ el:"#app", data:{} }) } </script> </head> <body> <div id="app"> <div class="box1" @click="alert('box1')"> <div class="box2" @click.stop.prevent="alert('box2')"></div> <!-- @click.stop來阻止事件冒泡 --> </div> <form action="#"> <input type="text"> <input type="submit"> <input type="submit" value="提交02" @click.prevent=""> <!-- @click.prevent來阻止表單提交 --> </form> </div> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.js"></script> <script src="js/filters.js"></script> </head> <body> <div id="app"> <form action=""> 帳號:<input type="text" v-model="user"><br><br> 密碼:<input type="password" v-model="pwd"><br><br> <button @click.prevent="loginhander">登陸</button> </form> </div> <script> var vm1 = new Vue({ el:"#app", data:{ user:"", pwd:"", }, methods:{ loginhander(){ if(this.user.length<3 || this.pwd.length<3){ // 長度過短不能登陸 alert("長度過短不能登陸"); }else{ // 頁面跳轉 location.assign("http://www.baidu.com") } } } }) </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.js"></script> <!--<script src="js/filters.js"></script>--> <style> .box1{ width: 400px; height: 400px; background: red; } .box2{ width: 150px; height: 150px; background: orange; } </style> </head> <body> <div id="app"> <div class="box1" @click="show1"> <div class="box2" @click="show2"> <p @click.stop="show3">一段文本</p> </div> </div> </div> <script> var vm1 = new Vue({ el:"#app", data:{}, methods:{ show1(){ console.log("box1"); }, show2(){ console.log("box2"); }, show3(){ console.log("點擊了p標籤"); } } }) </script> </body> </html>
個人計劃列表app
html代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>todolist</title> <style type="text/css"> .list_con{ width:600px; margin:50px auto 0; } .inputtxt{ width:550px; height:30px; border:1px solid #ccc; padding:0px; text-indent:10px; } .inputbtn{ width:40px; height:32px; padding:0px; border:1px solid #ccc; } .list{ margin:0; padding:0; list-style:none; margin-top:20px; } .list li{ height:40px; line-height:40px; border-bottom:1px solid #ccc; } .list li span{ float:left; } .list li a{ float:right; text-decoration:none; margin:0 10px; } </style> </head> <body> <div class="list_con"> <h2>To do list</h2> <input type="text" name="" id="txt1" class="inputtxt"> <input type="button" name="" value="增長" id="btn1" class="inputbtn"> <ul id="list" class="list"> <!-- javascript:; # 阻止a標籤跳轉 --> <li> <span>學習html</span> <a href="javascript:;" class="up"> ↑ </a> <a href="javascript:;" class="down"> ↓ </a> <a href="javascript:;" class="del">刪除</a> </li> <li><span>學習css</span><a href="javascript:;" class="up"> ↑ </a><a href="javascript:;" class="down"> ↓ </a><a href="javascript:;" class="del">刪除</a></li> <li><span>學習javascript</span><a href="javascript:;" class="up"> ↑ </a><a href="javascript:;" class="down"> ↓ </a><a href="javascript:;" class="del">刪除</a></li> </ul> </div> </body> </html> 特效實現效果: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>todolist</title> <style type="text/css"> .list_con{ width:600px; margin:50px auto 0; } .inputtxt{ width:550px; height:30px; border:1px solid #ccc; padding:0px; text-indent:10px; } .inputbtn{ width:40px; height:32px; padding:0px; border:1px solid #ccc; } .list{ margin:0; padding:0; list-style:none; margin-top:20px; } .list li{ height:40px; line-height:40px; border-bottom:1px solid #ccc; } .list li span{ float:left; } .list li a{ float:right; text-decoration:none; margin:0 10px; } </style> <script src="js/vue.js"></script> </head> <body> <div id="todolist" class="list_con"> <h2>To do list</h2> <input type="text" v-model="message" class="inputtxt"> <input type="button" @click="addItem" value="增長" class="inputbtn"> <ul id="list" class="list"> <li v-for="item,key in dolist"> <span>{{item}}</span> <a @click="upItem(key)" class="up" > ↑ </a> <a @click="downItem(key)" class="down"> ↓ </a> <a @click="delItem(key)" class="del">刪除</a> </li> </ul> </div> <script> // 計劃列表代碼 let vm = new Vue({ el:"#todolist", data:{ message:"", dolist:[ "學習html", "學習css", "學習javascript", ] }, methods:{ addItem(){ if(this.messsage==""){ return false; } this.dolist.push(this.message); this.message = "" }, delItem(key){ // 刪除和替換 // 參數1: 開始下表 // 參數2: 元素長度,若是不填默認刪除到最後 // 參數3: 表示使用當前參數替換已經刪除內容的位置 this.dolist.splice(key, 1); }, upItem(key){ if(key==0){ return false; } // 向上移動 let result = this.dolist.splice(key,1); this.dolist.splice(key-1,0,result[0]); }, downItem(key){ // 向下移動 let result = this.dolist.splice(key, 1); console.log(result); this.dolist.splice(key+1,0,result[0]); } } }) </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>todolist</title> <style type="text/css"> .list_con{ width:600px; margin:50px auto 0; } .inputtxt{ width:550px; height:30px; border:1px solid #ccc; padding:0px; text-indent:10px; /*首行縮進10px*/ } .inputbtn{ width:40px; height:32px; padding:0px; border:1px solid #ccc; } .list{ margin:0; padding:0; list-style:none; /* list-style: none 設置列表標記的 默認會是實心圓點 設成none就是沒有標記 */ margin-top:20px; } .list li{ height:40px; line-height:40px; border-bottom:1px solid #ccc; } .list li span{ float:left; } .list li a{ float:right; text-decoration:none; /* text-decoration 屬性用來設置或刪除文本的裝飾。主要是用來刪除連接的下劃線 */ margin:0 10px; } </style> <script src="js/vue.js"></script> </head> <body> <div id="todolist" class="list_con"> <h2>To do list</h2> <input type="text" v-model="message" class="inputtxt"> <input type="button" @click="addItem" value="增長" class="inputbtn"> <ul id="list" class="list"> <li v-for="item,key in dolist"> <span>{{item}}</span> <a @click="upItem(key)" class="up" > ↑ </a> <a @click="downItem(key)" class="down"> ↓ </a> <a @click="delItem(key)" class="del">刪除</a> </li> </ul> </div> <script> // 計劃列表代碼 let vm = new Vue({ el:"#todolist", data:{ message:"", dolist:[ "學習html", "學習css", "學習javascript", ] }, methods:{ addItem(){ if(this.messsage==""){ return false; } this.dolist.push(this.message); this.message = "" }, delItem(key){ // 刪除和替換 // 參數1: 開始下表 // 參數2: 元素長度,若是不填默認刪除到最後 // 參數3: 表示使用當前參數替換已經刪除內容的位置 //x. splice(start, deleteCount, value, ...) //使用註解 //x表明數組對象 //splice的主要用途是對數組指定位置進行刪除和插入 //start表示開始位置索引 //deleteCount刪除數組元素的個數 //value表示在刪除位置插入的數組元素 //value參數能夠省略 this.dolist.splice(key, 1); }, upItem(key){ if(key==0){ return false; } // 向上移動 let result = this.dolist.splice(key,1); //放回數組["學習javascript"] console.log(result) this.dolist.splice(key-1,0,result[0]); //value表示在刪除位置插入的數組元素:result[0] }, downItem(key){ // 向下移動 let result = this.dolist.splice(key, 1); console.log(result); this.dolist.splice(key+1,0,result[0]); } } }) </script> </body> </html>