vue-iview-table二次封裝,render函數,slot的封裝

前言:

        正好這個項目用到iviewtable,之前有封裝的elementtable,這裏把iview的也封裝下,提高複用性和價值。

首先:我們的公共組件ctable.vue

<template>
  <Table 
    :width='width'
    :height='height'
    :stripe='stripe' 
    :border='border' 
    :disabled-hover='disabledHover'
    :highlight-row='highlightRow'
    :columns="columns" 
    :data="list" 
    @on-selection-change="seclectChange"
    @on-row-click='rowClick'
    @on-row-dblclick='rowdblclick'
    @on-current-change='currentChange'
    @on-select-all='selectAll'
    @on-select-all-cancel='selectAllCancel'
    @on-sort-change='sortChange'
    @on-filter-change='filterChange'
    >
    <!-- 定義slot部分 -->
    <template slot-scope="{ row, index }" slot="operation">
      <Button size="small" type="primary" @click="clickBJ(row)">編輯</Button>
    </template>
    <template slot-scope="{ row, index }" slot="operationT">
      <Button size="small" type="primary" @click="clickZX(row)" style="margin-right:5px;">執行</Button>
      <Button size="small" type="primary" @click="clickTJ(row)">統計</Button>
    </template>
  </Table>
</template>

<script>
  export default {
    name:'iview-table',
    props:{
        columns: Array, // 表頭數據
        list: Array, // 表格數據
        width: [Number, String],//表格寬度
        height: [Number, String],//表格高度,單位 px,設置後,如果表格內容大於此值,會固定表頭-***注意傳進來是number的有滾動條,px的沒有
        stripe: { // 是否顯示間隔斑馬紋
            type: Boolean,
            default: false
        },
        border: { // 是否顯示縱向邊框
            type: Boolean,
            default: false
        },
        disabledHover: { // 禁用鼠標懸停時的高亮
            type: Boolean,
            default: false
        },
        highlightRow: { // 是否支持高亮選中的行,即單選
            type: Boolean,
            default: false
        }
    },
     data () {
      return {

      };
    },
    methods:{
      /**
       * 自帶事件
       */
      rowClick(data,index){//單擊某一行時觸發,data==當前行數據,index==當前行的下標
        let str={
          'data':data,
          'index':index
        }
        this.$emit("rowClick",str)
      },
      rowdblclick(data,index){//雙擊擊某一行時觸發,data==當前行數據,index==當前行的下標
        let str={
          'data':data,
          'index':index
        }
        this.$emit("rowdblclick",str)
      },
      currentChange(currentRow,oldCurrentRow){//開啓 highlight-row 後有效,當表格的當前行發生變化的時候會觸發,currentRow==當前高亮行數據,oldCurrentRow==上次高亮行數據
        let str={
          'data':currentRow,
          'oldData':oldCurrentRow
        }
        this.$emit("currentChange",str)
      },
      seclectChange(selection){//在多選模式下有效,只要選中項發生變化時就會觸發,selection==已選項數據
        let str={
          'data':selection
        }
        this.$emit("selectionData",str)
      },
      selectAll(selection){//在多選模式下有效,點擊全選時觸發,selection:已選項數據
        let str={
          'data':selection
        }
        this.$emit("selectAll",str)
      },
      selectAllCancel(selection){//在多選模式下有效,取消點擊全選時觸發,selection:已選項數據
        let str={
          'data':selection
        }
        this.$emit("selectAllCancel",str)
      },
      sortChange(column,key,order){//排序時有效,當點擊排序時觸發,column==當前列數據,key==排序依據的指標,order==asc/desc
        let str={
          'column':column,
          'order':order,
          'key':key
        }
        this.$emit("sortChange",str)
      },
      filterChange(column){//篩選時有效,篩選條件發生變化時觸發,column==當前列數據
        let str={
          'column':column
        }
        this.$emit("filterChange",str)
      },
      /**
       * slot事件
       */
      clickBJ(data){//編輯點擊事件
         this.$emit("clickBJ",data)
      },
      clickZX(data){//編輯執行事件
        this.$emit("clickZX",data)
      },
      clickTJ(data){//編輯統計事件
        this.$emit("clickTJ",data)
      }
    }
  }
</script>

其次:就是調用部分,我這裏簡單說下里面的步驟,最底下會把完整的調用代碼貼上的,方便直接用,

1、template部分:

2、script-data部分:

3、script-method部分:

接下來貼一下調用部分的完整代碼:

<template>
  <div>
    <CTable 
    :columns='this.dyydyl.col' 
    :list='this.dyydyl.list' 
    :height='this.dyydyl.height' 
    :stripe='this.dyydyl.stripe'
    @clickBJ='clickBJ'
    @clickZX='clickZX'
    @clickTJ='clickTJ'
    ></CTable>
  </div>
</template>

<script>
  
  import CTable from '@/components/comIview/ctable'//iview-table
  export default {
    name:'moral',//道德講堂
    props:[''],
    data () {
      return {
        dyydyl:{//黨員一帶一路
          height:280,
          stripe:true,//斑馬紋
          col:[
              // {//是否顯示序號-不分頁
              //     type: 'index',
              //     width: 60,
              //     align: 'center'
              // },
              // {//是否顯示覆選框
              //     type: 'selection',
              //     width: 60,
              //     align: 'center'
              // },
              {//是否顯示序號-分頁
				title: '序號',
				width: 50,
				align: 'center',
				render: (h,params) => {
					let rows = this.searchDTO.pageParamers.rows;//page每頁展示多少條
					let page = this.searchDTO.pageParamers.page;//page當前頁碼
					return h('span',params.index + (rows*(page-1)+1))
				    }
				},
             {
                title: '黨員',
                key: 'dy',
                align: 'center',
                width: 80,
              },
              {
                title: '等級',
                key: 'dj',
                align: 'center',
                width: 80,
                render: (h, params) => {//render函數,iview這裏可以直接用
                  let dj = params.row.dj;//params.row.dj==獲取到的值
                  let style={};
                  if(dj == '一般'){
                    style.color = '#00fffc';
                  }else if(dj == '重大'){
                    style.color = '#ff5816';
                  }else if(dj == '緊急'){
                    style.color = '#ffc000';
                  }
                  return h('div', {
                    style:style
                  } ,params.row.dj)
                }
              },
              {
                title: '目標',
                key: 'mb',
                align: 'center',
                width: 'auto',
              },
              {
                title: '操作',
                slot: 'operationT',
                align: 'center',
                width: 'auto',
              },
              {
                title: '操作',
                slot: 'operation',
                align: 'center',
                width: 'auto',
              },
                //這裏在加個在頁面通過render渲染兩個按鈕的方法
            //   {
            //     title: '培訓地點',
            //     align: 'center',
            //     width: 'auto',
            //     render: (h, params) => {
            //             return h("div", [
            //                 h(
            //                     "Button",
            //                     {
            //                     props: {
            //                         type: "primary",
            //                         size: "small"
            //                     },
            //                     style: {
            //                         marginRight: "5px"
            //                     },
            //                     on: {
            //                         click: (e) => {
            //                              e.stopPropagation();//阻止冒泡
            //                              alert('查看');
            //                         }
            //                     }
            //                     },
            //                     "查看"
            //                 ),
            //                 h(
            //                     "Button",
            //                     {
            //                     props: {
            //                         type: "primary",
            //                         size: "small"
            //                     },
            //                     style: {
            //                         marginRight: "5px"
            //                     },
            //                     on: {
            //                         click: (e) => {
            //                              e.stopPropagation();//阻止冒泡
            //                              alert('刪除');
            //                         }
            //                     }
            //                     },
            //                     "刪除"
            //                 )
            //             ]);
            //         }
            //    },



          ],
          list:[
            {
                'dy': '陳盛澤',
                'dj': '一般',
                'mb': '爭取在年底前超額完成任務',
              },
              {
                'dy': '張盛澤',
                'dj': '重大',
                'mb': '爭取在年底前超額完成任務',
              },
              {
                'dy': '張盛澤',
                'dj': '緊急',
                'mb': '爭取在年底前超額完成任務',
              },
              {
                'dy': '張盛澤',
                'dj': '一般',
                'mb': '爭取在年底前超額完成任務',
              },
              {
                'dy': '張盛澤',
                'dj': '黨員',
                'mb': '爭取在年底前超額完成任務',
              },
              {
                'dy': '張盛澤',
                'dj': '重大',
                'mb': '爭取在年底前超額完成任務',
              },
              {
                'dy': '張盛澤',
                'dj': '黨員',
                'mb': '爭取在年底前超額完成任務',
              },
              {
                'dy': '張盛澤',
                'dj': '黨員',
                'mb': '爭取在年底前超額完成任務',
              },
              {
                'dy': '張盛澤',
                'dj': '黨員',
                'mb': '爭取在年底前超額完成任務',
              },
              {
                'dy': '張盛澤',
                'dj': '黨員',
                'mb': '爭取在年底前超額完成任務',
              },
              {
                'dy': '張盛澤',
                'dj': '黨員',
                'mb': '爭取在年底前超額完成任務',
              },
              {
                'dy': '張盛澤',
                'dj': '黨員',
                'mb': '爭取在年底前超額完成任務',
              },
              {
                'dy': '張盛澤',
                'dj': '黨員',
                'mb': '爭取在年底前超額完成任務',
              },
              {
                'dy': '張盛澤',
                'dj': '黨員',
                'mb': '爭取在年底前超額完成任務',
              },
              {
                'dy': '張盛澤',
                'dj': '黨員',
                'mb': '爭取在年底前超額完成任務',
              },
          ]
        },
      };
    },

    components: {
      CTable
    },

    computed: {},

    beforeMount() {},

    mounted() {},

    methods: {
      clickBJ(){
        alert('編輯');
      },
      clickZX(){
        alert('執行');
      },
      clickTJ(){
        alert('統計');
      },
    },

    watch: {}

  }

</script>
<style lang='' scoped>

</style>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章