vue.js表格組件開發(fā)的實(shí)例詳解
前言
組件(Component)是 Vue.js 最強(qiáng)大的功能之一。組件可以擴(kuò)展 HTML 元素,封裝可重用的代碼。在較高層面上,組件是自定義元素,Vue.js 的編譯器為它添加特殊功能。在有些情況下,組件也可以是原生 HTML 元素的形式,以 is 特性擴(kuò)展。
組件開發(fā)的基礎(chǔ)
組件可以擴(kuò)展 HTML 元素,封裝可重用的代碼。我理解為功能模塊的模板吧。
對(duì)于vue來(lái)說(shuō),組件是這個(gè)樣子的,我們?cè)趆tml里面寫
<div id="example"> <my-component></my-component> </div>edx
然后就出來(lái)
<div id="example"> <div>A custom component!</div> </div>
代碼 <div>A custom component!</div>
我們只要寫一遍就行了 。
所以我們需要定義它,把 my-component的標(biāo)簽和代碼關(guān)聯(lián)起來(lái),所以我們要定義它
// 定義 var MyComponent = Vue.extend({ template: '<div>A custom component!</div>' })
定義了之后,我們要讓頁(yè)面能夠渲染它,讓Vue知道它的存在
// 注冊(cè) Vue.component('my-component', MyComponent) // 創(chuàng)建根實(shí)例 new Vue({ el: '#example' })
以上,是官網(wǎng)一個(gè)非常簡(jiǎn)單的例子 ,其實(shí)覺得和一個(gè)function
的封裝也差不多,定義,引入,然后執(zhí)行。
然后一個(gè)組件可以引用別的組件的東西,有點(diǎn)像函數(shù)的互相調(diào)用啊。
var Child = Vue.extend({ /* ... */ }) var Parent = Vue.extend({ template: '...', components: { // <my-component> 只能用在父組件模板內(nèi) 'my-component': Child } })
一個(gè)表格組件的實(shí)例
這是官網(wǎng)的例子
這個(gè)是一個(gè)可以排序的表格的例子。我們從頭開始來(lái)制作一個(gè)可以排序的表格。
基本結(jié)構(gòu)
首先分成兩個(gè)部分,一個(gè)是搜索框,一個(gè)是表格本身,我們可以得到這樣的結(jié)構(gòu)
<div id="demo"> <form id="search"> Search <input name="query"> </form> <table> <thead> <tr> <th>name</th> <th>power</th> </tr> </thead> <tbody> <tr> <td>Jack Chan</td> <td>7000</td> </tr> </tbody> </table> </div>
顯示效果
加上基本的css
body { font-family: Helvetica Neue, Arial, sans-serif; font-size: 14px; color: #444; } table { border: 2px solid #42b983; border-radius: 3px; background-color: #fff; } th { background-color: #42b983; color: rgba(255,255,255,0.66); cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -user-select: none; } td { background-color: #f9f9f9; } th, td { min-width: 120px; padding: 10px 20px; } #search { margin-bottom: 10px; }
顯示效果如下,
提取組件
我們是想要讓表格成為單獨(dú)的組件,所以我們定義一個(gè)叫做 demo-grid的組件,用它來(lái)生成表格
<div id="demo"> <form id="search"> Search <input name="query" > </form> <demo-grid> </demo-grid> </div>
代碼里面關(guān)于表格的那部分給放到組件模板里面,我們定義組件。也就是用script來(lái)定義,
<script type="text/x-template" id="grid-template"> <table> <thead> <tr> <th>name</th> <th>power</th> </tr> </thead> <tbody> <tr> <td>Jack Chan</td> <td>7000</td> </tr> </tbody> </table> </script>
定義完了之后我們要在給Vue注冊(cè)組件模塊,然后進(jìn)行Vue的渲染
Vue.component('demo-grid',{ template:"#grid-template", }); var demo = new Vue({ el:'#demo' })
然后最后的效果是一樣的,這個(gè)時(shí)候并沒有數(shù)據(jù)流。
組件數(shù)據(jù)流
我們要讓表格知道表格的頭部和表格的內(nèi)容,也就是有一個(gè)gridColumns和gridData,這個(gè)數(shù)據(jù)最開始放在Vue的Data里面
// bootstrap the demo var demo = new Vue({ el: '#demo', data: { gridColumns: ['name', 'power'], gridData: [ { name: 'Chuck Norris', power: Infinity }, { name: 'Bruce Lee', power: 9000 }, { name: 'Jackie Chan', power: 7000 }, { name: 'Jet Li', power: 8000 } ] } })
然后我們的組件也要接受這個(gè)數(shù)據(jù),這里我們通過(guò)類似屬性的形式給組件模板傳入數(shù)據(jù),
<demo-grid :data="gridData" :columns="gridColumns"> </demo-grid>
然后我們?cè)诮M件里面把相應(yīng)的數(shù)據(jù)繼承下來(lái)。
Vue.component('demo-grid',{ template:"#grid-template", props: { data: Array, columns: Array } });
然后在模板里面替換掉
<script type="text/x-template" id="grid-template"> <table> <thead> <tr> <th v-for="key in columns">{{key}}</th> </tr> </thead> <tbody> <tr v-for="entry in data"> <td v-for="key in columns">{{entry[key]}}</td> </tr> </tbody> </table> </script>
效果如下
搜索功能增加
這個(gè)時(shí)候,我們想加入一個(gè)交互,也就是在搜索框增加關(guān)鍵詞的時(shí)候,表格能夠相應(yīng)地變化。
首先我們要綁定搜索框的模型,也就是用searchQuery來(lái)綁定Input
<form id="search"> Search <input name="query" v-model="searchQuery"> </form>
在Vue里面增加data的初始化
var demo = new Vue({ el: '#demo', data: { searchQuery: '', ... })
同時(shí),在組件模板里面也進(jìn)行參數(shù)傳入
<demo-grid :data="gridData" :columns="gridColumns" :filter-key="searchQuery"> </demo-grid>
組件的定義里面要繼承模板的數(shù)據(jù),也就是在模板里面是filter-key,注意要轉(zhuǎn)化駝峰寫法
Vue.component('demo-grid', { template: '#grid-template', props: { data: Array, columns: Array, filterKey: String } })
這個(gè)時(shí)候,我們的模板里面要過(guò)濾符合filterKey的數(shù)據(jù),這里就用到了過(guò)濾器,vue提供了一個(gè)叫做filterBy的過(guò)濾器。|與過(guò)濾器,第一個(gè)為過(guò)濾器的名字,后面的是參數(shù),| filterBy filterKey使用的就是filterBy的過(guò)濾器,參數(shù)是filterKey
<tr v-for=" entry in data | filterBy filterKey> <td v-for="key in columns"> {{entry[key]}} </td> </tr>
效果如下,我們這樣就有了一個(gè) 能夠過(guò)濾的表格
表格排序
這部分邏輯比前面稍微復(fù)雜一點(diǎn)點(diǎn)。首先我們給表格加一個(gè)三角形,三角形有兩種,一種是正序的,一種是逆序的,我們用span來(lái)作為三角形的容器
<th v-for="key in columns" @click="sortBy(key)" :class="{active: sortKey == key}"> {{key | capitalize}} <span class="arrow"> </span> </th>
三角形的樣式有兩種,上升的和下降的
.arrow { display: inline-block; vertical-align: middle; width: 0; height: 0; margin-left: 5px; opacity: 0.66; } .arrow.asc { border-left: 4px solid transparent; border-right: 4px solid transparent; border-bottom: 4px solid #fff; } .arrow.dsc { border-left: 4px solid transparent; border-right: 4px solid transparent; border-top: 4px solid #fff; }
dsc的效果如下
我們希望能夠在不同的狀態(tài)里面切換,所以我們選擇在組件里面有數(shù)據(jù)存儲(chǔ)排序的狀態(tài)信息,用一個(gè)sortOrders的對(duì)象來(lái)存儲(chǔ)排序信息 ,同時(shí)用一個(gè)sortKey來(lái)表示當(dāng)前用來(lái)排序的鍵,我們?cè)O(shè)置為name
// register the grid component Vue.component('demo-grid', { template: '#grid-template', ... data: function () { var sortOrders = {} this.columns.forEach(function (key) { sortOrders[key] = 1 }) return { sortKey: 'name', sortOrders: sortOrders } }
然后使用orderBy
來(lái)排序
<tbody> <tr v-for=" entry in data | filterBy filterKey | orderBy sortKey sortOrders[sortKey]"> <td v-for="key in columns"> {{entry[key]}} </td> </tr> </tbody>
現(xiàn)在也就是根據(jù)name升序排序,所以我們看到表格的結(jié)果如下
增加交互
我們希望能夠通過(guò)點(diǎn)擊表格頭部來(lái)自動(dòng)升序降序,所以添加鼠標(biāo)事件,另外把span的樣式和sortOrders[key]
的值相關(guān)聯(lián),增加active的樣式
<th v-for="key in columns" @click="sortBy(key)" :class="{active: sortKey == key}"> {{key | capitalize}} <span class="arrow" :class="sortOrders[key] > 0 ? 'asc' : 'dsc'"> </span> </th>
相關(guān)active的樣式如下
th.active .arrow { opacity: 1; }
對(duì)于鼠標(biāo)事件,我們定義在表格內(nèi)部,也就是把sortKey定位當(dāng)前活躍的元素,同時(shí)改變sortOrders[key]
的值
// register the grid component Vue.component('demo-grid', { template: '#grid-template', props: { ... }, data: function () { ... }, methods: { sortBy: function (key) { this.sortKey = key this.sortOrders[key] = this.sortOrders[key] * -1 } } });
總結(jié)
以上就是關(guān)于vue.js組件開發(fā)的全部?jī)?nèi)容了,希望這篇文章對(duì)大家學(xué)習(xí)或者使用vue.js能有一定的幫助,如果有疑問(wèn)大家可以留言交流。
相關(guān)文章
一文詳解如何在vue中實(shí)現(xiàn)文件預(yù)覽功能
很多Vue項(xiàng)目中都需要PDF文件預(yù)覽功能,比如合同ERP,銷售CRM,內(nèi)部文檔CMS管理系統(tǒng),內(nèi)置PDF文件在線預(yù)覽功能,下面這篇文章主要給大家介紹了關(guān)于如何在vue中實(shí)現(xiàn)文件預(yù)覽功能的相關(guān)資料,需要的朋友可以參考下2022-10-10Vue中登錄驗(yàn)證成功后保存token,并每次請(qǐng)求攜帶并驗(yàn)證token操作
這篇文章主要介紹了Vue中登錄驗(yàn)證成功后保存token,并每次請(qǐng)求攜帶并驗(yàn)證token操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09vue3系統(tǒng)進(jìn)入頁(yè)面前的權(quán)限判斷和重定向方式
這篇文章主要介紹了vue3系統(tǒng)進(jìn)入頁(yè)面前的權(quán)限判斷和重定向方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Vue2?響應(yīng)式系統(tǒng)之深度響應(yīng)
這篇文章主要介紹了Vue2?響應(yīng)式系統(tǒng)之深度響應(yīng),文章基于Vue2?響應(yīng)式系統(tǒng)的相關(guān)資料展開對(duì)Vue2?深度響應(yīng)的介紹,需要的小伙伴可以參考一下2022-04-04vue-cli5搭建vue項(xiàng)目的實(shí)現(xiàn)步驟
本文主要介紹了vue-cli5搭建vue項(xiàng)目的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05vue-router 中router-view不能渲染的解決方法
本篇文章主要結(jié)合了vue-router 中router-view不能渲染的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05vue項(xiàng)目實(shí)現(xiàn)多語(yǔ)言切換的思路
這篇文章主要介紹了vue項(xiàng)目實(shí)現(xiàn)多語(yǔ)言切換的思路,幫助大家完成多語(yǔ)言翻譯,感興趣的朋友可以了解下2020-09-09