1.過濾器css
全局html
私有vue
2.Vue生命週期bootstrap
什麼是生命週期api
圖文助解app
代碼助解函數
先看看官網是怎麼說的:學習
Vue.js 容許你自定義過濾器,可被用於一些常見的文本格式化。過濾器能夠用在兩個地方:雙花括號插值和 v-bind
表達式 (後者從 2.1.0+ 開始支持)。過濾器應該被添加在 JavaScript 表達式的尾部,由「管道」符號指示:測試
<!-- 在雙花括號中 --> {{ message | capitalize }} <!-- 在 `v-bind` 中 --> <div v-bind:id="rawId | formatId"></div>
全部的vm實例都共享的。
示例:
將字符串中全部的 「單純」 替換成 」邪惡「
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue測試</title> <script src="js/vue.js"></script> </head> <body> <div id="app"> {{msg | character}} </div> <script> Vue.filter('character', function (msg) { return msg.replace(/單純/g, '邪惡'); }); var vm = new Vue({ el: '#app', data: { msg: '魔鏡魔鏡誰是世界上最單純的姑娘?魔鏡魔鏡誰是世界上最單純的小夥?魔鏡魔鏡你是否單純?' }, methods: {} }); </script> </body> </html>
過濾器函數總接收表達式的值 (以前的操做鏈的結果) 做爲第一個參數。在上述例子中,capitalize
過濾器函數將會收到 message
的值做爲第一個參數。
在 調用 過濾器 : character 時,能夠傳參數
<div id="app"> {{msg | character('兔子','可愛')}} </div> <script> Vue.filter('character', function (msg, arg1, arg2) { return msg.replace(/單純/g, '邪惡' + arg1 + arg2); }); var vm = new Vue({ el: '#app', data: { msg: '魔鏡魔鏡誰是世界上最單純的姑娘?魔鏡魔鏡誰是世界上最單純的小夥?魔鏡魔鏡你是否單純?' }, methods: {} }); </script>
過濾器可屢次使用
<div id="app"> {{msg | character('兔子','可愛') | ceshi}} </div> <script> Vue.filter('character', function (msg, arg1, arg2) { return msg.replace(/單純/g, '邪惡' + arg1 + arg2); }); Vue.filter('ceshi', function (msg) { return msg + '小兔子乖乖,把門開開'; }); var vm = new Vue({ el: '#app', data: { msg: '魔鏡魔鏡誰是世界上最單純的姑娘?魔鏡魔鏡誰是世界上最單純的小夥?魔鏡魔鏡你是否單純?' }, methods: {} }); </script>
日期格式化:
將昨天小穎寫的文章 學習Vue 入門到實戰——學習筆記(二) 中的 ctime 格式化爲‘yyyy’-'mm'-'dd'形式
過濾器爲
Vue.filter('dateFormat', function (dateStr) { var dt = new Date(dateStr), y = dt.getFullYear(), m = dt.getMonth() + 1, d = dt.getDate(); // return y + '-' + m + '-' + d; //模板字符串 if(m.toString().length<2){ m='0'+m; } if(d.toString().length<2){ d='0'+d; } return `${y}-${m}-${d}`; });
強化
<div id="app"> <div class="panel panel-primary"> <div class="panel-heading">添加、刪除、查詢</div> <div class="panel-body form-inline"> <div class="form-group"> <label for="exampleInputId">Id:</label> <input type="text" class="form-control" id="exampleInputId" v-model="id"> </div> <div class="form-group"> <label for="exampleInputName">Name:</label> <input type="text" class="form-control" id="exampleInputName" v-model="name"> </div> <button type="submit" class="btn btn-primary" @click="add">添加</button> <div class="form-group"> <label for="searchName">搜索名稱關鍵字:</label> <input type="text" class="form-control" id="searchName" v-model="keywords"> </div> </div> </div> <div class="table-content"> <table class="table table-striped table-bordered table-hover"> <thead> <tr> <th>Id</th> <th>Name</th> <th>Ctime</th> <th>operation</th> </tr> </thead> <tbody> <tr v-for="item in search(keywords)"> <td>{{item.id}}</td> <td>{{item.name}}</td> <td>{{item.ctime | dateFormat('')}}</td> <td><a @click.prevent="del(item.id)">刪除</a></td> </tr> </tbody> </table> </div> </div> <script> Vue.filter('dateFormat', function (dateStr, pattern) { var dt = new Date(dateStr), y = dt.getFullYear(), m = dt.getMonth() + 1, d = dt.getDate(); // return y + '-' + m + '-' + d; //模板字符串 if (m.toString().length < 2) { m = '0' + m; } if (d.toString().length < 2) { d = '0' + d; } // return `${y}-${m}-${d}`; if (pattern.toLowerCase() == 'yyyy-mm-dd') { return `${y}-${m}-${d}`; } else { var hh = dt.getHours(), mm = dt.getMinutes(), ss = dt.getSeconds(); return `${y}-${m}-${d} ${hh}:${mm}:${ss}`; } }); </script>
過濾器調用的時候採用就近原則,若是私有過濾器和全局過濾器名稱一致,這時候優先調用私有過濾器。
示例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue測試</title> <link href="css/bootstrap.min.css" rel="stylesheet"> <script src="js/vue.js"></script> <style> .table-content { padding-top: 20px; } .table-content a, .table-content a:hover { cursor: default; text-decoration: none; } </style> </head> <body> <div id="app"> <div class="panel panel-primary"> <div class="panel-heading">添加、刪除、查詢</div> <div class="panel-body form-inline"> <div class="form-group"> <label for="exampleInputId">Id:</label> <input type="text" class="form-control" id="exampleInputId" v-model="id"> </div> <div class="form-group"> <label for="exampleInputName">Name:</label> <input type="text" class="form-control" id="exampleInputName" v-model="name"> </div> <button type="submit" class="btn btn-primary" @click="add">添加</button> <div class="form-group"> <label for="searchName">搜索名稱關鍵字:</label> <input type="text" class="form-control" id="searchName" v-model="keywords"> </div> </div> </div> <div class="table-content"> <table class="table table-striped table-bordered table-hover"> <thead> <tr> <th>Id</th> <th>Name</th> <th>Ctime</th> <th>operation</th> </tr> </thead> <tbody> <tr v-for="item in search(keywords)"> <td>{{item.id}}</td> <td>{{item.name}}</td> <td>{{item.ctime | dateFormat}}</td> <td><a @click.prevent="del(item.id)">刪除</a></td> </tr> </tbody> </table> </div> </div> <div id="app2"> {{dt | dateFormat}} </div> <script> Vue.filter('dateFormat', function (dateStr, pattern) { var dt = new Date(dateStr), y = dt.getFullYear(), m = dt.getMonth() + 1, d = dt.getDate(); // return y + '-' + m + '-' + d; //模板字符串 if (m.toString().length < 2) { m = '0' + m; } if (d.toString().length < 2) { d = '0' + d; } // return `${y}-${m}-${d}`; if (pattern && pattern.toLowerCase() == 'yyyy-mm-dd') { return `${y}-${m}-${d}`; } else { var hh = dt.getHours(), mm = dt.getMinutes(), ss = dt.getSeconds(); if (hh.toString().length < 2) { hh = '0' + hh; } if (mm.toString().length < 2) { mm = '0' + mm; } if (ss.toString().length < 2) { ss = '0' + ss; } return `${y}-${m}-${d} ${hh}:${mm}:${ss}`; } }); var vm = new Vue({ el: '#app', data: { id: '', name: '', keywords: '', user: [{ id: '1', name: '李琪琪', ctime: new Date() }, { id: '2', name: '小穎穎', ctime: new Date() }, { id: '3', name: '大黑熊', ctime: new Date() }] }, methods: { add() { this.user.push({id: this.id, name: this.name, ctime: new Date()}); this.id = ''; this.name = ''; }, del(id) { //在數組的some方法中,若是return true,就會當即終止對這個歌數組的循環。 // this.user.some((item, i) => { // if (item.id == id) { // this.user.splice(i, 1); // return true; // } // }); var index = this.user.findIndex(item => { if (item.id == id) { return true; } }); this.user.splice(index, 1); }, search(keywords) { // var newList = []; // this.user.forEach(item => { // if (item.name.indexOf(keywords) != -1) { // newList.push(item); // } // }); // return newList; return this.user.filter(item => { if (item.name.includes(keywords)) { return item; } }) } } }); var vm = new Vue({ el: '#app2', data: { dt: new Date() }, methods: {}, filters: { dateFormat: function (dateStr, pattern) { var dt = new Date(dateStr), y = dt.getFullYear(), m = dt.getMonth() + 1, d = dt.getDate(); // return y + '-' + m + '-' + d; //模板字符串 if (m.toString().length < 2) { m = '0' + m; } if (d.toString().length < 2) { d = '0' + d; } // return `${y}-${m}-${d}`; if (pattern && pattern.toLowerCase() == 'yyyy-mm-dd') { return `${y}-${m}-${d}`; } else { var hh = dt.getHours(), mm = dt.getMinutes(), ss = dt.getSeconds(); if (hh.toString().length < 2) { hh = '0' + hh; } if (mm.toString().length < 2) { mm = '0' + mm; } if (ss.toString().length < 2) { ss = '0' + ss; } return `${y}-${m}-${d} ${hh}:${mm}:${ss}`; } } } }); </script> </body> </html>
附帶提下:ES2017 引入了字符串補全長度的功能。若是某個字符串不夠指定長度,會在頭部或尾部補全。padStart()
用於頭部補全,padEnd()
用於尾部補全。
則過濾器代碼可修改成:
Vue.filter('dateFormat', function (dateStr, pattern) { var dt = new Date(dateStr), y = dt.getFullYear(), m = (dt.getMonth() + 1).toString().padStart(2, '0'), d = dt.getDate().toString().padStart(2, '0'); // return y + '-' + m + '-' + d; //模板字符串 // return `${y}-${m}-${d}`; if (pattern && pattern.toLowerCase() == 'yyyy-mm-dd') { return `${y}-${m}-${d}`; } else { var hh = dt.getHours().toString().padStart(2, '0'), mm = dt.getMinutes().toString().padStart(2, '0'), ss = dt.getSeconds().toString().padStart(2, '0'); return `${y}-${m}-${d} ${hh}:${mm}:${ss}`; } });
從Vue實例建立、運行、到銷燬期間,老是伴隨着各類各樣的事件,這些事件,統稱爲生命週期。(Vue實例從建立到銷燬的過程)
生命週期鉤子:就是生命週期事件的別名而已。
生命週期鉤子 = 生命週期函數 = 生命週期事件。
建立期間:
beforeCreate:實例剛在內存中被建立出來,此時,尚未初始化好 data 和 methods 屬性。
created:實例已經在內存中建立ok,此時data 和 methods 已經建立ok,此時尚未開始編譯模板。
beforeMount:此時已經完成了模板的編譯,可是尚未掛載到頁面中。
mounted:此時,已經將編譯好的模板,掛載到了頁面指定的容器中顯示。
運行期間:
beforeUpdate:狀態更新以前執行此函數,此時 data 中的狀態值是最新的,可是界面上顯示的數據仍是舊的,由於此時尚未開始從新渲染DOM節點。
update:實例更新完畢以後調用此函數,此時data中的狀態值和界面上顯示的數據都已經完成了更新,界面已經被從新渲染好了。
銷燬期間:
beforeDestroy:實例銷燬以前調用,在這一步,實例仍然徹底可用。
destroyed:Vue實例銷燬後調用,調用後Vue實例指示的全部東西都會被解除綁定,全部的事件監聽器會被移除,全部的子實例也會被銷燬。
公用代碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue測試</title> <script src="js/vue.js"></script> </head> <body> <div id="app"> <p id="testP">{{msg}}</p> </div> <script> var vm = new Vue({ el: '#app', data: { msg:'hello world' }, methods: { show(){ console.log('執行了show方法'); } } }); </script> </body> </html>
beforeCreate
beforeCreate(){//表示實例徹底被建立出來以前,會執行它 console.log(this.msg); this.show(); //注意:在beforeCreate生命週期函數執行的時候,data和methods中的數據尚未初始化 }
created
created() { console.log(this.msg); this.show(); // 在create中,data和methods已經初始化好了 // 若是要調用methods中的方法或操做data中的數據,最先只能在crate中操做。 }
beforeMount
beforeMount() {//模板已經在內存中編譯好,但還沒有把模板渲染到頁面中 console.log(document.getElementById('testP').innerText); //在beforeMount執行時,頁面中的元素尚未真正被替換過來,只是以前寫的模板字符串({{msg}}) }
mounted
mounted(){//表示內存中的模板,已經真實的掛載到了頁面中,用戶已經能夠看到渲染好的頁面了。 console.log(document.getElementById('testP').innerText); //注意:mounted是實例建立期間的最後一個生命週期函數了,當執行完mounted就表示,實例已經被徹底建立好了,此時若是 // 沒有其餘操做的話,這個實例就靜靜的躺在咱們內存中,一動不動。 }
beforeUpdate
beforeUpdate() {//這時候頁面數據沒有更新,可是data中的數據已經更新了 console.log('界面上的元素內容:' + document.getElementById('testP').innerText); console.log('data中的msg數據是:' + this.msg); //得出結論:當執行beforeUpdate時,界面中顯示的數據仍是舊的,此時data數據是最新的,,頁面數據還沒有和最新的數據同步。 }
點擊按鈕後:
update
updated(){ console.log('界面上的元素內容:' + document.getElementById('testP').innerText); console.log('data中的msg數據是:' + this.msg); // update事件執行的時候,頁面和data數據已經保持同步了,都是最新的數據 }