概念:Vue.js 容許你自定義過濾器,可被用做一些常見的文本格式化。過濾器能夠用在兩個地方:mustache 插值和 v-bind 表達式。過濾器應該被添加在 JavaScript 表達式的尾部,由「管道」符指示;javascript
<td>{{item.ctime | dataFormat('yyyy-mm-dd')}}</td>
2.私有 filters
定義方式:css
filters: { // 私有局部過濾器,只能在 當前 VM 對象所控制的 View 區域進行使用 dataFormat(input, pattern = "") { // 在參數列表中 經過 pattern="" 來指定形參默認值,防止報錯 var dt = new Date(input); // 獲取年月日 var y = dt.getFullYear(); var m = (dt.getMonth() + 1).toString().padStart(2, '0'); var d = dt.getDate().toString().padStart(2, '0'); // 若是 傳遞進來的字符串類型,轉爲小寫以後,等於 yyyy-mm-dd,那麼就返回 年-月-日 // 不然,就返回 年-月-日 時:分:秒 if (pattern.toLowerCase() === 'yyyy-mm-dd') { return `${y}-${m}-${d}`; } else { // 獲取時分秒 var hh = dt.getHours().toString().padStart(2, '0'); var mm = dt.getMinutes().toString().padStart(2, '0'); var ss = dt.getSeconds().toString().padStart(2, '0'); return `${y}-${m}-${d} ${hh}:${mm}:${ss}`; } } }
// 定義一個全局過濾器 Vue.filter('dataFormat', function (input, pattern = '') { var dt = new Date(input); // 獲取年月日 var y = dt.getFullYear(); var m = (dt.getMonth() + 1).toString().padStart(2, '0'); var d = dt.getDate().toString().padStart(2, '0'); // 若是 傳遞進來的字符串類型,轉爲小寫以後,等於 yyyy-mm-dd,那麼就返回 年-月-日 // 不然,就返回 年-月-日 時:分:秒 if (pattern.toLowerCase() === 'yyyy-mm-dd') { return `${y}-${m}-${d}`; } else { // 獲取時分秒 var hh = dt.getHours().toString().padStart(2, '0'); var mm = dt.getMinutes().toString().padStart(2, '0'); var ss = dt.getSeconds().toString().padStart(2, '0'); return `${y}-${m}-${d} ${hh}:${mm}:${ss}`; } });
注意:當有局部和全局兩個名稱相同的過濾器時候,會以就近原則進行調用,即:局部過濾器優先於全局過濾器被調用!html
Vue.directive('on').keyCodes.f2 = 113;
Vue.config.keyCodes.名稱 = 按鍵值
來自定義案件修飾符的別名:Vue.config.keyCodes.f2 = 113;
2.使用自定義的按鍵修飾符:vue
<input type="text" v-model="name" @keyup.f2="add">
1.自定義全局和局部的 自定義指令java
// 自定義全局指令 v-focus,爲綁定的元素自動獲取焦點: Vue.directive('focus', { inserted: function (el) { // inserted 表示被綁定元素插入父節點時調用 el.focus(); } }); // 自定義局部指令 v-color 和 v-font-weight,爲綁定的元素設置指定的字體顏色 和 字體粗細: directives: { color: { // 爲元素設置指定的字體顏色 bind(el, binding) { el.style.color = binding.value; } }, 'font-weight': function (el, binding2) { // 自定義指令的簡寫形式,等同於定義了 bind 和 update 兩個鉤子函數 el.style.fontWeight = binding2.value; } }
2.自定義指令的使用方式:bootstrap
<input type="text" v-model="searchName" v-focus v-color="'red'" v-font-weight="900">
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>品牌列表</title> <script src="./vue-2.4.0.js"></script> <link rel="stylesheet" href="./bootstrap.min.css"> </head> <body> <div class="app"> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">添加品牌</h3> </div> <div class="panel-body form-inline"> <lable> ID: <input type="text" class="form-control" v-model="id"> </lable> <lable> Name: <input type="text" class="form-control" v-model="name"> </lable> <input type="button" value="添加" class="btn btn-primary" @click="add(id)"> <lable> search: <input type="text" class="form-control" v-model="keywords" id="search" v-focus> </lable> </div> </div> <table class="table table-bordered table-hover table-striped"> <thead> <tr> <th>ID</th> <th>Name</th> <th>Ctime</th> <th>Operation</th> </tr> </thead> <tbody> <tr v-for="list in search(keywords)" :key="list.id"> <td>{{list.id}}</td> <td v-text="list.name"></td> <td>{{list.ctime | dataFormat}}</td> <td><a href="javascript:;" @click.prevent="del(list.id)">刪除</a></td> </tr> </tbody> </table> </div> <script> //自定義全局指令,調用時要以 v- 開頭 // 參數一 : 指令的名稱 // 參數二 : 是一個對象,指令的處理函數 // bind:只調用一次,指令第一次綁定到元素時調用。在這裏能夠進行一次性的初始化設置。(DOM元素可能沒有被插入父節點) // // inserted:被綁定元素插入父節點時調用 (僅保證父節點存在,但不必定已被插入文檔中)。 // // update:所在組件的 VNode 更新時調用,可是可能發生在其子 VNode 更新以前。 Vue.directive('focus',{ inserted:function (el) { el.focus(); } }); //全局過濾器 Vue.filter('dataFormat',function (dataStr) { var dt = new Date(dataStr) ; var y = dt.getFullYear(); var m = dt.getMonth() + 1; var d = dt.getDate(); var h = dt.getHours(); var mi = dt.getMinutes(); var s = dt.getSeconds(); //模板字符串 return `${y}-${m}-${d} ${h}:${mi}:${s}`; }); var vm =new Vue({ el:'.app', data:{ id:'', name:'', keywords:'', list:[ {id:1,name:'奔馳',ctime:new Date()}, {id:2,name:'寶馬',ctime:new Date()}, ] }, methods:{ add(id){ var index = this.list.findIndex(item => { if(id == item.id){ alert("ID重複"); this.id =this.name =''; }else if(id == ''){ alert("ID爲空") } else{ var car ={id: this.id,name: this.name,ctime:new Date()}; this.list.push(car); this.id =this.name =''; } return true; }) }, del(id){ //方法一: //some() 方法測試是否至少有一個元素經過由提供的函數實現的測試 // this.list.some((item,i) => { // if(item.id == id){ // //splice() 方法經過刪除或替換現有元素或者原地添加新的元素來修改數組,並以數組形式返回被修改的內容 // this.list.splice(i,1); // return true; // } // }); //方法二: //findIndex()方法返回數組中知足提供的測試函數的第一個元素的索引 var index = this.list.findIndex(item => { if(item.id == id){ return true; } }); this.list.splice(index,1); }, search(keywords) { // 根據關鍵字,進行數據的搜索 // 都會對數組中的每一項,進行遍歷,執行相關的操做; return this.list.filter(item => { // if(item.name.indexOf(keywords) != -1) // 注意 : ES6中,爲字符串提供了一個新方法,叫作 String.prototype.includes('要包含的字符串') // 若是包含,則返回 true ,不然返回 false // contain if (item.name.includes(keywords)) { return item } }) // return newList } } }); </script> </body> </html>