Vue第二部分

品牌列表案例

運用的知識:

v-model進行雙向綁定

@click.prevent="del(id)" 函數(shù)傳參

v-for循環(huán)

String.prototype.includes('要包含的字符串')

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>cysky</title>
    <link rel="stylesheet" href="../lib/bootstrap-3.3.7.css">
    <script src="../lib/vue-2.4.0.js"></script>
</head>
<body>
<div id="app">
    <div class="panel panel-primary">
        <div class="panel-heading">
            <h3>添加品牌</h3>
        </div>
        <div class="panel-body form-inline">
            <label for="">
                ID:
                <input type="text" class="form-control" v-model="id">
            </label>
            <label for="">
                Name:
                <input type="text" class="form-control" v-model="name">
            </label>
            <label for="">
                <input type="button" value="添加" class="btn btn-primary" @click="add">
            </label>
            <label for="">
                搜索名稱關(guān)鍵字:
                <input type="text" class="form-control" v-model="keywords">
            </label>
        </div>
    </div>

    <table class="table table-bordered table-striped table-hover">
        <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Ctime</th>
            <th>Del</th>
        </tr>
        </thead>
        <tbody>
        <tr v-for="item in search(keywords)">
            <td>{{ item.id }}</td>
            <td>{{ item.name }}</td>
            <td>{{ item.ctime }}</td>
            <td><a href="" @click.prevent="del(id)">刪除</a></td>
        </tr>
        </tbody>
    </table>
</div>

<script>
    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() {
                var car = {id: this.id, name: this.name, ctime: new Date()};
                this.list.push(car);
                this.id = '';
                this.name = ''
            },
            del(id) {
                var index = this.list.indexOf(function (item) {
                    if (item.id === id) {
                        return true
                    }
                });
                this.list.splice(index, 1)
            },
            search(keywords) {
                return this.list.filter(function (item) {
                    if (item.name.includes(keywords)) {
                        return item
                    }
                })
            }
        }
    })
</script>
</body>
</html>

<tr v-for="item in search(keywords)">

之前漱挚,v-for 中的數(shù)據(jù)趾盐,都是直接從 data 上的 list 中直接渲染過來的纷跛,現(xiàn)在凌蔬,這里定義了一個 search 方法 在 search 方法內(nèi)部崭歧,通過執(zhí)行 for 循環(huán)顿仇,把所有符合搜索的關(guān)鍵字的數(shù)據(jù)角雷,保存到一個新數(shù)組中返回欣尼。

全局過濾器

定義私有過濾器 過濾器有兩個 條件 【過濾器名稱 和 處理函數(shù)】

所謂的全局過濾器爆雹,就是所有的VM實例都共享的

Vue.filter('dataFormat',function(dataStr,pattern = ''){
        var dt = new Date(dataStr);
        var y = dt.getFullYear();
        var m = dt.getMonth()+1;
        var d = dt.getDate().toString().padStart(2,'0');
        var h = dt.getHours().toString().padStart(2,'0');
        var mm = dt.getMinutes().toString().padStart(2,'0');
        var s = dt.getSeconds().toString().padStart(2,'0');
        return `${y}-${m}-$vcn8puw ${h}:${mm}:${s}`
    });

使用: <td>{{ item.ctime | dateFormat() }}</td>

私有過濾器

過濾器調(diào)用的時候,采用就近原則愕鼓,如果私有過濾器和全局過濾器名稱一致钙态,這時候優(yōu)先調(diào)用私有過濾器

filters:{
            timeFormat: function (dateStr, pattern='') {
                var dt = new Date(dateStr);
                var y = dt.getFullYear();
                var m = dt.getMonth() + 1;
                var d = dt.getDate();
                var h = dt.getHours().toString().padStart(2,'0');
                var mm = dt.getMinutes().toString().padStart(2,'0');
                var s = dt.getSeconds().toString().padStart(2,'0');
                return `${y}-${m}-$qccnyar ${h}:${mm}:${s}`
            }
        }

自定義全局按鍵修飾符

全部的按鍵別名:

  • .enter
  • .tab
  • .delete (捕獲“刪除”和“退格”鍵)
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right

以上可以直接使用:@click.enter = 'add'

Vue.config.keyCodes.f2 = 113

使用:@click.f2='add'

使用Vue.directive()定義全局的指令

 Vue.directive('focus',{
        inserted:function(el){
            el.focus()
        }
    });

使用:<input type="text" class="form-control" v-model="keywords" id="search" v-focus v-color="'green'">

inserted 表示元素 插入到DOM中的時候,會執(zhí)行 inserted 函數(shù)【觸發(fā)1次】

和樣式相關(guān)的操作菇晃,一般都可以在 bind 執(zhí)行

    Vue.directive('color',{
        bind:function(el,binding){
            el.style.color = 'red';
            console.log(binding.value)
        }
    });

使用:<input type="text" class="form-control" v-model="keywords" id="search" v-focus v-color="'green'">

每當(dāng)指令綁定到元素上的時候册倒,會立即執(zhí)行這個 bind 函數(shù),只執(zhí)行一次

函數(shù)中的第一個參數(shù)永遠是 el 磺送,表示被綁定了指令的那個元素驻子, 這個 el 參數(shù), 是一個原生的 JS 對象

和 JS 行為有關(guān)的操作册着,最好在 inserted 中去執(zhí)行

參數(shù)1:指令的名稱拴孤,注意,在定義的時候甲捏,指令名稱前不需要加 v- 前綴演熟,但是,在調(diào)用的時候,必須在指令名稱前加上 v- 前綴來進行調(diào)用

參數(shù)2:是一個對象芒粹,這個對象身上兄纺,有一些指令相關(guān)的函數(shù),這些函數(shù)可以在特定階段化漆,執(zhí)行相關(guān)的操作

自定義私有指令

 directives: {
            'fontweight': {
                bind: function (el, binding) {
                    el.style.fontWeight = binding.value
                }
            },
            'fontsize': {
                bind: function (el, binding) {
                    el.style.fontSize = binding.value
                }
            }
        }

品牌列表完整案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>cysky</title>
    <link rel="stylesheet" href="../lib/bootstrap-3.3.7.css">
    <script src="../lib/vue-2.4.0.js"></script>
</head>
<body>
<div id="app">
    <div class="panel panel-primary">
        <div class="panel-heading">
            <h3>添加品牌</h3>
        </div>
        <div class="panel-body form-inline">
            <label for="">
                ID:
                <input type="text" class="form-control" v-model="id">
            </label>
            <label for="">
                Name:
                <input type="text" class="form-control" v-model="name">
            </label>
            <label for="">
                <input type="button" value="添加" class="btn btn-primary" @click="add">
            </label>
            <label for="">
                搜索名稱關(guān)鍵字:
                <input type="text" class="form-control" v-model="keywords" v-focus>
            </label>
        </div>
    </div>

    <table class="table table-bordered table-striped table-hover">
        <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Ctime</th>
            <th>Del</th>
        </tr>
        </thead>
        <tbody>
        <tr v-for="item in search(keywords)">
            <td>{{ item.id }}</td>
            <td>{{ item.name }}</td>
            <td>{{ item.ctime | timeFormat() }}</td>
            <td><a href="" @click.prevent="del(id)">刪除</a></td>
        </tr>
        </tbody>
    </table>

    <p v-fontsize="50" v-color="'blue'">這是一個P標簽估脆,用于測試私有directives</p>
</div>

<script>
    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() {
                var car = {id: this.id, name: this.name, ctime: new Date()};
                this.list.push(car);
                this.id = '';
                this.name = ''
            },
            del(id) {
                var index = this.list.indexOf(function (item) {
                    if (item.id === id) {
                        return true
                    }
                });
                this.list.splice(index, 1)
            },
            search(keywords) {
                return this.list.filter(function (item) {
                    if (item.name.includes(keywords)) {
                        return item
                    }
                })
            }

        },
        filters: {//私有過濾器
            timeFormat: function (dateStr, pattern = '') {
                var dt = new Date(dateStr);
                var y = dt.getFullYear();
                var m = dt.getMonth() + 1;
                var d = dt.getDate();
                var h = dt.getHours().toString().padStart(2, '0');
                var mm = dt.getMinutes().toString().padStart(2, '0');
                var s = dt.getSeconds().toString().padStart(2, '0');
                return `${y}-${m}-$d7jii27 ${h}:${mm}:${s}`
            }
        },
        directives: {//自定義私有指令
            'fontweight': {
                bind: function (el, binding) {
                    el.style.fontWeight = binding.value
                }
            },
            'fontsize': {
                bind: function (el, binding) {
                    el.style.fontSize = parseInt(binding.value) + 'px'
                }
            },
            'color': {
                bind: function (el, binding) {
                    el.style.color = binding.value
                }
            },
            'focus': {
                inserted: function (el) {
                    el.focus()
                }
            }
        }
    })
</script>
</body>
</html>

生命周期

lifecycle.png

beforeCreate(){}:這是我們遇到的第一個生命周期函數(shù),表示實例完全被創(chuàng)建出來之前座云,會執(zhí)行它

注意:beforeCreate(){} 執(zhí)行的時候疙赠,data 和 methods 中的數(shù)據(jù)都還沒有初始化

created(){} 這是遇到的第二個生命周期函數(shù),在 created 中朦拖,data 和 methods 都已經(jīng)被初始化好了

注意:如果要調(diào)用 methods 中的方法圃阳,或者操作 data 中的數(shù)據(jù),最早璧帝,只能在 created 中操作

beforeMount(){} 這是遇到的第三個生命周期函數(shù)捍岳,表示模版已經(jīng)在內(nèi)存中編輯完成了,但是尚未把模版渲染到頁面中

注意:在 beforeMount 執(zhí)行的時候睬隶,頁面中的元素锣夹,還沒有被真正替換過來,只是之前寫的模版字符串

mounted(){} 這是遇到的第四個盛名周期函數(shù)苏潜,表示银萍,內(nèi)存中的模版,已經(jīng)真實的掛載到了頁面中窖贤,用戶已經(jīng)可以看到渲染好的頁面了

注意:mounted 是實例創(chuàng)建期間最后的一個生命周期函數(shù)砖顷,當(dāng)執(zhí)行完 mounted 就表示,實例已經(jīng)被完全創(chuàng)建好了赃梧,此時滤蝠,如果沒有其他操作,這個實例就在內(nèi)存中授嘀,等候

接下來的是運行中的兩個事件

beforeUpdate() {} 這時候表示我們的界面還沒有被更新(數(shù)據(jù)已經(jīng)更新了)

結(jié)論: 當(dāng)執(zhí)行 beforeUpdate 的時候物咳,頁面中的顯示的數(shù)據(jù),還是舊的蹄皱,此時 data 數(shù)據(jù)是最新的览闰,頁面尚未和 最新的數(shù)據(jù)保持同步

updated(){} 事件執(zhí)行的時候,頁面和 data 數(shù)據(jù)已經(jīng)保持同步了巷折,都是最新的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末压鉴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锻拘,更是在濱河造成了極大的恐慌油吭,老刑警劉巖阳距,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尖啡,死亡現(xiàn)場離奇詭異舍杜,居然都是意外死亡拌夏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門心包,熙熙樓的掌柜王于貴愁眉苦臉地迎上來类咧,“玉大人,你說我怎么就攤上這事蟹腾『弁铮” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵岭佳,是天一觀的道長血巍。 經(jīng)常有香客問我,道長珊随,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任柿隙,我火速辦了婚禮叶洞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘禀崖。我一直安慰自己衩辟,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布波附。 她就那樣靜靜地躺著艺晴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掸屡。 梳的紋絲不亂的頭發(fā)上封寞,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音仅财,去河邊找鬼狈究。 笑死,一個胖子當(dāng)著我的面吹牛盏求,可吹牛的內(nèi)容都是我干的抖锥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碎罚,長吁一口氣:“原來是場噩夢啊……” “哼磅废!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荆烈,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤拯勉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谜喊,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡潭兽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了斗遏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片山卦。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖诵次,靈堂內(nèi)的尸體忽然破棺而出账蓉,到底是詐尸還是另有隱情,我是刑警寧澤逾一,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布铸本,位于F島的核電站,受9級特大地震影響遵堵,放射性物質(zhì)發(fā)生泄漏箱玷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一陌宿、第九天 我趴在偏房一處隱蔽的房頂上張望锡足。 院中可真熱鬧,春花似錦壳坪、人聲如沸舶得。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沐批。三九已至,卻和暖如春蝎亚,著一層夾襖步出監(jiān)牢的瞬間九孩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工颖对, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捻撑,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓缤底,卻偏偏與公主長得像顾患,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子个唧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容

  • vue概述 在官方文檔中江解,有一句話對Vue的定位說的很明確:Vue.js 的核心是一個允許采用簡潔的模板語法來聲明...
    li4065閱讀 7,210評論 0 25
  • ## 框架和庫的區(qū)別?> 框架(framework):一套完整的軟件設(shè)計架構(gòu)和**解決方案**。> > 庫(lib...
    Rui_bdad閱讀 2,906評論 1 4
  • 想起了《記承天寺夜游》徙歼,元豐六年十月十二日夜犁河,解衣欲睡鳖枕,月色入戶,欣然起行桨螺。念無與為樂者宾符,遂至承天寺,尋張懷民灭翔,...
    逃離者閱讀 345評論 0 1
  • Peter同學(xué)乃濱海小外四年級小學(xué)生一枚魏烫,時有妙語引家人一樂,故記錄之肝箱。 論好食堂的重要性 四年級開學(xué)在即哄褒,當(dāng)老師...
    胡喜平閱讀 750評論 0 3
  • 人有三次成長呐赡,我經(jīng)歷了兩次,有些事情不是努力可以得到的…… 我今年18骏融,摩羯座链嘀,馬上大二,在這個暑假绎谦,我第一次覺得...
    我就是很普通閱讀 386評論 0 1