最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue.js表格組件開(kāi)發(fā)的實(shí)例詳解

 更新時(shí)間:2016年10月12日 11:56:58   作者:進(jìn)擊的前端  
Vue.js通過(guò)簡(jiǎn)潔的API提供高效的數(shù)據(jù)綁定和靈活的組件系統(tǒng)。在前端紛繁復(fù)雜的生態(tài)中,Vue.js有幸受到一定程度的關(guān)注,所以本文將從各方面對(duì)Vue.js的組件開(kāi)發(fā)做一個(gè)深入介紹。有需要的朋友們可以參考借鑒。

前言

組件(Component)是 Vue.js 最強(qiáng)大的功能之一。組件可以擴(kuò)展 HTML 元素,封裝可重用的代碼。在較高層面上,組件是自定義元素,Vue.js 的編譯器為它添加特殊功能。在有些情況下,組件也可以是原生 HTML 元素的形式,以 is 特性擴(kuò)展。

組件開(kāi)發(fā)的基礎(chǔ)

組件可以擴(kuò)展 HTML 元素,封裝可重用的代碼。我理解為功能模塊的模板吧。

對(duì)于vue來(lái)說(shuō),組件是這個(gè)樣子的,我們?cè)趆tml里面寫(xiě)

<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>我們只要寫(xiě)一遍就行了 。

所以我們需要定義它,把 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è)可以排序的表格的例子。我們從頭開(kāi)始來(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ù)最開(kāi)始放在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ò)類(lèi)似屬性的形式給組件模板傳入數(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)化駝峰寫(xiě)法

 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組件開(kāi)發(fā)的全部?jī)?nèi)容了,希望這篇文章對(duì)大家學(xué)習(xí)或者使用vue.js能有一定的幫助,如果有疑問(wèn)大家可以留言交流。

相關(guān)文章

  • 淺談vue中使用編輯器vue-quill-editor踩過(guò)的坑

    淺談vue中使用編輯器vue-quill-editor踩過(guò)的坑

    這篇文章主要介紹了淺談vue中使用編輯器vue-quill-editor踩過(guò)的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • vue實(shí)現(xiàn)拖拽或點(diǎn)擊上傳圖片

    vue實(shí)現(xiàn)拖拽或點(diǎn)擊上傳圖片

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)拖拽或點(diǎn)擊上傳圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Vue提供的三種調(diào)試方式你知道嗎

    Vue提供的三種調(diào)試方式你知道嗎

    這篇文章主要為大家介紹了Vue提供的三種調(diào)試方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • vue3的api解讀之ref和reactive示例詳解

    vue3的api解讀之ref和reactive示例詳解

    這篇文章主要介紹了vue3的api解讀之ref和reactive詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • vue pages 多入口項(xiàng)目 + chainWebpack 全局引用縮寫(xiě)說(shuō)明

    vue pages 多入口項(xiàng)目 + chainWebpack 全局引用縮寫(xiě)說(shuō)明

    這篇文章主要介紹了vue pages 多入口項(xiàng)目 + chainWebpack 全局引用縮寫(xiě)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • vue項(xiàng)目中使用vue-i18n報(bào)錯(cuò)的解決方法

    vue項(xiàng)目中使用vue-i18n報(bào)錯(cuò)的解決方法

    這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目中使用vue-i18n報(bào)錯(cuò)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • VUE v-bind 數(shù)據(jù)綁定的示例詳解

    VUE v-bind 數(shù)據(jù)綁定的示例詳解

    這篇文章主要介紹了VUE v-bind 數(shù)據(jù)綁定,簡(jiǎn)單點(diǎn)來(lái)說(shuō)就是對(duì) HTML 中的元素,我們可以使用 v-bind 來(lái)進(jìn)行綁定和動(dòng)態(tài)的數(shù)據(jù)輸出,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 解決VUE-npm ERR! C:\rj\node-v14.4.0-win-x64\nod問(wèn)題

    解決VUE-npm ERR! C:\rj\node-v14.4.0-win-x64\nod問(wèn)題

    這篇文章主要介紹了解決VUE-npm ERR! C:\rj\node-v14.4.0-win-x64\nod問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 解決vue3中使用echart報(bào)錯(cuò):Cannot read properties of undefined (reading ‘type‘)

    解決vue3中使用echart報(bào)錯(cuò):Cannot read properties of&n

    在Vue項(xiàng)目中使用Echarts進(jìn)行數(shù)據(jù)可視化是非常常見(jiàn)的需求,然而有時(shí)候在引入Echarts的過(guò)程中可能會(huì)遇到報(bào)錯(cuò),本文主要介紹了解決vue3中使用echart報(bào)錯(cuò):Cannot read properties of undefined (reading ‘type‘),感興趣的可以了解一下
    2024-01-01
  • Vue實(shí)現(xiàn)文本編譯詳情

    Vue實(shí)現(xiàn)文本編譯詳情

    這篇文章主要介紹了Vue實(shí)現(xiàn)文本編譯詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-08-08

最新評(píng)論

肃南| 通辽市| 合江县| 青阳县| 藁城市| 怀宁县| 宣威市| 大荔县| 永平县| 皮山县| 江川县| 大方县| 江北区| 绥宁县| 行唐县| 峨山| 温宿县| 溆浦县| 英山县| 安远县| 临清市| 富裕县| 黔南| 柘城县| 昌江| 昭觉县| 昌图县| 沙坪坝区| 西青区| 雅安市| 山阴县| 达州市| 敦化市| 古蔺县| 临高县| 墨竹工卡县| 潼南县| 盐边县| 伽师县| 和平区| 肇源县|