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í)覺(jué)得和一個(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í)候并沒(méi)有數(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-10
Vue中登錄驗(yàn)證成功后保存token,并每次請(qǐng)求攜帶并驗(yàn)證token操作
這篇文章主要介紹了Vue中登錄驗(yàn)證成功后保存token,并每次請(qǐng)求攜帶并驗(yàn)證token操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
vue3系統(tǒng)進(jìn)入頁(yè)面前的權(quán)限判斷和重定向方式
這篇文章主要介紹了vue3系統(tǒng)進(jìn)入頁(yè)面前的權(quán)限判斷和重定向方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
Vue2?響應(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-04
vue-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-05
vue-router 中router-view不能渲染的解決方法
本篇文章主要結(jié)合了vue-router 中router-view不能渲染的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
vue項(xiàng)目實(shí)現(xiàn)多語(yǔ)言切換的思路
這篇文章主要介紹了vue項(xiàng)目實(shí)現(xiàn)多語(yǔ)言切換的思路,幫助大家完成多語(yǔ)言翻譯,感興趣的朋友可以了解下2020-09-09

