一個(gè)表格組件-vuejs示例

分析vuejs官網(wǎng)上一個(gè)表格組件的實(shí)現(xiàn)過程颁独。
原址:https://cn.vuejs.org/v2/examples/grid-component.html

1掏湾、新建一個(gè)demo和vue實(shí)例

<!--html-->
<div id="demo"></div>

//js
var demo=new Vue({
  el:"#demo"
});

2锡垄、新建一個(gè)Vue實(shí)例静稻,并用data聲明一個(gè)數(shù)據(jù)對象睹耐,定義表格所需的數(shù)據(jù)

var demo=new Vue({
    el:"#demo",
    data:{
        //表格的頭部部分?jǐn)?shù)據(jù)
        gridColumns: ['name', 'power'],
        //表格的主體部分?jǐn)?shù)據(jù)
        gridData: [
             { name: 'Chuck Norris', power: Infinity },
             { name: 'Bruce Lee', power: 9000 },
             { name: 'Jackie Chan', power: 7000 },
             { name: 'Jet Li', power: 8000 }
        ],
        //input組件中v-model雙向綁定的數(shù)據(jù)值
        searchQuery : ''
    }
});

3糊探、注冊一個(gè)子組件組件demo-grid挎狸,并在父實(shí)例的模塊中以自定義元素<demo-grid></demo-grid>的形式使用
要讓子組件使用父組件的數(shù)據(jù)扣汪,我們需要通過props選項(xiàng)。子組件要顯式的用props選項(xiàng)聲明它期待獲得的數(shù)據(jù)

<!--html-->
<div id="demo">
     <!--搜索框-->
     <form id="search">
          <!--用v-model實(shí)現(xiàn)了input輸入框數(shù)據(jù)的雙向綁定-->
          Search <input name="query" v-model="searchQuery">
     </form>

     <!--表格-->
     <demo-grid
          <!--這里是綁定了幾個(gè)自定義屬性伟叛,屬性值為Vue實(shí)例data中的數(shù)據(jù)值-->
          :data="gridData"
          :columns="gridColumns"
          :filter-key="searchQuery"
     ></demo-grid>
</div>

//js 創(chuàng)建一個(gè)子組件
Vue.component("demo-grid",{
  template:"#grid-template",   
    props: {     
      //獲得父組件的數(shù)據(jù)并定義了數(shù)據(jù)類型
      data: Array,
      columns: Array,
      filterKey: String
    },
});

4私痹、X-template
定義模版的方式:在 JavaScript 標(biāo)簽里使用 text/x-template 類型,并且指定一個(gè) id="grid-template"统刮,所定義的就相當(dāng)于上文子組件中template的內(nèi)容

<!--html-->
<!--X-template定義的模板放到html標(biāo)簽中-->

<script type="text/x-template" id="grid-template">
  <table>
    <thead>
      <tr>
        <th
          <!--遍歷columns數(shù)組(即:["name","power"])紊遵,取出每一項(xiàng)-->
          v-for="key in columns"
          <!--注冊一個(gè)click事件,事件函數(shù)為sortBy并將點(diǎn)擊的相應(yīng)的鍵值傳參到函數(shù)里面去-->
          @click="sortBy(key)"
          <!--如果兩者相等侥蒙,則應(yīng)用active樣式-->
          :class="{ active: sortKey == key }"
        >
         <!--使用capitalize過濾值-->
          {{ key | capitalize }}
         <!--箭頭符號樣式-->
          <span class="arrow" :class="sortOrders[key] > 0 ? 'asc' : 'dsc'"></span>
        </th>
      </tr>
    </thead>
    <tbody>
      <!--遍歷計(jì)算屬性中filteredData計(jì)算后返回的data值-->
      <tr v-for="entry in filteredData">
        <td v-for="key in columns">
          {{entry[key]}}
        </td>
      </tr>
    </tbody
  </table>
</script>

5暗膜、為子組件(demo-grid)繼續(xù)添加選項(xiàng)對象
①data
定義子組件內(nèi)部的數(shù)據(jù)對象。
子組件這里的data必須是一個(gè)函數(shù)鞭衩。

data: function () {
  //定義一個(gè)sortOrders空對象
  var sortOrders = {};
  //遍歷columns值(也就是父組件中的數(shù)據(jù)值['name', 'power']),將每一項(xiàng)的值設(shè)為1学搜,即:{name:1,power:1}
  this.columns.forEach(function (key) {
    sortOrders[key] = 1
  });
  //返回一個(gè)空字符串值sortKey(下文會講作用)和sortOrders對象
  return {
    sortKey: '',
    sortOrders: sortOrders
  };
},

②methods方法

methods: {
  //當(dāng)在父組件tr那里點(diǎn)擊了click事件,就會調(diào)用這個(gè)函數(shù)
  sortBy: function (key) {
    this.sortKey = key
    this.sortOrders[key] = this.sortOrders[key] * -1
  }
}

③computed計(jì)算屬性

  computed: {
    filteredData: function () {
      var sortKey = this.sortKey
      var filterKey = this.filterKey && this.filterKey.toLowerCase()
      var order = this.sortOrders[sortKey] || 1
      var data = this.data
      if (filterKey) {
        /*原本的data數(shù)據(jù)值
        * data:[
        *   { name: 'Chuck Norris', power: Infinity },
        *   { name: 'Bruce Lee', power: 9000 },
        *   { name: 'Jackie Chan', power: 7000 },
        *   { name: 'Jet Li', power: 8000 }
        * ]
        */  
        //filter函數(shù)方法會篩選出data數(shù)組中為true的項(xiàng)
        data = data.filter(function (row) {
        //然后將里面的每一項(xiàng)(也就是對象)中的鍵值進(jìn)行與輸入的filterKey值進(jìn)行匹配搜索论衍,
        //大于-1則將該項(xiàng)返回組成新的data
          return Object.keys(row).some(function (key) {
            return String(row[key]).toLowerCase().indexOf(filterKey) > -1
          })
        })
      }
      if (sortKey) {
        //復(fù)制一份data數(shù)據(jù)瑞佩,然后進(jìn)行sort排序,組成新的表格排序
        data = data.slice().sort(function (a, b) {
          a = a[sortKey]
          b = b[sortKey]
          return (a === b ? 0 : a > b ? 1 : -1) * order
        })
      }
      return data
    }
  },

④filters

 filters: {
    capitalize: function (str) {
      return str.charAt(0).toUpperCase() + str.slice(1)
    }
  }

6坯台、最后子組件就是這樣:

Vue.component('demo-grid', {
  template: '#grid-template',
  props: {
    data: Array,
    columns: Array,
    filterKey: String
  },
  data: function () {
    var sortOrders = {}
    this.columns.forEach(function (key) {
      sortOrders[key] = 1
    })
    return {
      sortKey: '',
      sortOrders: sortOrders
    }
  },
  computed: {
    filteredData: function () {
      var sortKey = this.sortKey
      var filterKey = this.filterKey && this.filterKey.toLowerCase()
      var order = this.sortOrders[sortKey] || 1
      var data = this.data
      if (filterKey) {
        data = data.filter(function (row) {
          return Object.keys(row).some(function (key) {
            return String(row[key]).toLowerCase().indexOf(filterKey) > -1
          })
        })
      }
      if (sortKey) {
        data = data.slice().sort(function (a, b) {
          a = a[sortKey]
          b = b[sortKey]
          return (a === b ? 0 : a > b ? 1 : -1) * order
        })
      }
      return data
    }
  },
  filters: {
    capitalize: function (str) {
      return str.charAt(0).toUpperCase() + str.slice(1)
    }
  },
  methods: {
    sortBy: function (key) {
      this.sortKey = key
      this.sortOrders[key] = this.sortOrders[key] * -1
    }
  }
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炬丸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蜒蕾,更是在濱河造成了極大的恐慌稠炬,老刑警劉巖焕阿,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異首启,居然都是意外死亡暮屡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門毅桃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褒纲,“玉大人,你說我怎么就攤上這事疾嗅⊥獬В” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵代承,是天一觀的道長汁蝶。 經(jīng)常有香客問我,道長论悴,這世上最難降的妖魔是什么掖棉? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮膀估,結(jié)果婚禮上幔亥,老公的妹妹穿的比我還像新娘。我一直安慰自己察纯,他們只是感情好帕棉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饼记,像睡著了一般香伴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上具则,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天即纲,我揣著相機(jī)與錄音,去河邊找鬼博肋。 笑死低斋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的匪凡。 我是一名探鬼主播膊畴,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼病游!你這毒婦竟也來了巴比?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎轻绞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佣耐,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡政勃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兼砖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奸远。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖讽挟,靈堂內(nèi)的尸體忽然破棺而出懒叛,到底是詐尸還是另有隱情,我是刑警寧澤耽梅,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布薛窥,位于F島的核電站,受9級特大地震影響眼姐,放射性物質(zhì)發(fā)生泄漏诅迷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一众旗、第九天 我趴在偏房一處隱蔽的房頂上張望罢杉。 院中可真熱鬧,春花似錦贡歧、人聲如沸滩租。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽律想。三九已至,卻和暖如春哗咆,著一層夾襖步出監(jiān)牢的瞬間蜘欲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工晌柬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姥份,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓年碘,卻偏偏與公主長得像澈歉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子屿衅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

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