<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        對ElementUItable組件的源碼的詳細分析

        來源:懂視網 責編:小采 時間:2020-11-27 19:33:13
        文檔

        對ElementUItable組件的源碼的詳細分析

        對ElementUItable組件的源碼的詳細分析:本文章從如下圖所示的最基本的table入手,分析table組件源代碼。本人已經對table組件原來的源碼進行削減。本文只對重要的代碼片段進行講解,推薦下載代碼把項目運行起來,跟著文章的思路閱讀。思路<template> <p class="el-t
        推薦度:
        導讀對ElementUItable組件的源碼的詳細分析:本文章從如下圖所示的最基本的table入手,分析table組件源代碼。本人已經對table組件原來的源碼進行削減。本文只對重要的代碼片段進行講解,推薦下載代碼把項目運行起來,跟著文章的思路閱讀。思路<template> <p class="el-t
        本文章從如下圖所示的最基本的table入手,分析table組件源代碼。本人已經對table組件原來的源碼進行削減。本文只對重要的代碼片段進行講解,推薦下載代碼把項目運行起來,跟著文章的思路閱讀。

        思路

        <template>
         <p class="el-table">
         <!-- 隱藏列: slot里容納table-column -->
         <p class="hidden-columns" ref="hiddenColumns">
         <slot></slot>
         </p>
        
         <p class="el-table__header-wrapper"
         ref="headerWrapper">
         <table-header ref="tableHeader"
         :store="store">
         </table-header>
         </p>
        
         <p class="el-table__body-wrapper"
         ref="bodyWrapper">
         <table-body :context="context"
         :store="store"> 
         </table-body>
         </p>
         </p>
        </template>

        table、table-header、table-body、table-column之間通過table-store進行狀態管理。table-header、table-body對table-store數據進行監聽,每當table改變table-store數據時觸發table-header、table-body重新渲染。

        table-column為列數據column綁定相應的renderCell函數,供table-body渲染時使用。table-column這個組件自身不做任何渲染。所以會看到模板將其隱藏。還有就是table-header、table-body通過render函數進行渲染。

        初始化順序

        3596660871-5b57ca0dcc1eb_articlex.jpeg

        table

        1. 初始化store

          data() {
           const store = new TableStore(this);
           return {
           store,
           };
          }
        2. 將store共享給table-header、table-body

           <p class="el-table__header-wrapper"
           ref="headerWrapper">
           <table-header :store="store"></table-header>
           </p>
          
           <p class="el-table__body-wrapper"
           ref="bodyWrapper">
           <table-body :store="store"></table-body>
           </p>
        3. 將數據存儲到store,供table-body獲取data將其渲染

          watch: {
           data: {
           immediate: true,
           handler(value) {
           // 供 table-body computed.data 使用 
           this.store.commit('setData', value);
           // ......
           }
           },
          },
        4. 設置tableId

          created() {
           //.....
           this.tableId = `el-table_${tableIdSeed}`;
           //.....
           }
        5. 調用 updateColumns 觸發 table-header、table-body 二次render更新,標記mounted完成

          mounted() {
           // .....
           this.store.updateColumns();
           // .....
           this.$ready = true;
          }

        table-column

        1. 生成column,并為column綁定renderCell函數供table-body使用

          created(){
           // .........
           let column = getDefaultColumn(type, {
           id: this.columnId,
           columnKey: this.columnKey,
           label: this.label,
           property: this.prop || this.property,// 舊版element ui為property,現在的版本是prop
           type, // selection、index、expand
           renderCell: null,
           renderHeader: this.renderHeader, // 提供給table-column, table-column.js line 112
           width,
           formatter: this.formatter,
           context: this.context,
           index: this.index,
           });
           // .........
           
           // 提table-body使用, table-body.js line 69
           column.renderCell = function (createElement, data) {
           if (_self.$scopedSlots.default) {
           renderCell = () => _self.$scopedSlots.default(data);
           //<template slot-scope="{row}">
           //<span>{{row.frequentlyUsed | formatBoolean}}</span>
           //</template>
           }
           
           if (!renderCell) {// table-header不渲染index列的走這里,
           /*<p className="cell">王小虎</p>*/
           renderCell = DEFAULT_RENDER_CELL;
           }
           
           // <ElTableColumn
           // type="index"
           // width="50"/>
           return <p className="cell">{renderCell(createElement, data)}</p>;
           };
           
          }
        2. 給store.state._columns數組填充數據

          mounted() {
           // ...... 
           owner.store.commit('insertColumn', this.columnConfig, columnIndex, this.isSubColumn ? parent.columnConfig : null);
          }

        table-store

        table-store有兩個很重要的屬性_columns、data,_columns保存列的相關信息,data則保存開發者傳入的表格數據。還有兩個重要的函數insertColumn與updateColumns。

        1. insertColumn為_columns填充數據

          TableStore.prototype.mutations = {
           insertColumn(states, column, index, parent) {
           let array = states._columns;
           // ......
          
           if (typeof index !== 'undefined') {
           // 在index的位置插入column
           array.splice(index, 0, column);
           } else {
           array.push(column);
           }
          
           // .....
           },
          }
        2. updateColumns 對_columns進行過濾得到columns

          TableStore.prototype.updateColumns = function() {
           const states = this.states;
           const _columns = states._columns || [];
           
           const notFixedColumns = _columns.filter(column => !column.fixed);
           // .....
           const leafColumns = doFlattenColumns(notFixedColumns);
           // .....
           
           states.columns = [].concat(leafColumns);
           // ....
          }

        table-header、table-body

        table-header、table-body都擁有以下屬性

        props: {
         store: {
         required: true
         },
        }
        
        computed: {
         columns() {
         return this.store.states.columns;
         },
        },
        
        render(){
         // 渲染columns的數據
        }

        這兩個組件的工作原理是監聽columns數據變化以觸發render渲染。在table組件的mounted階段會調用 updateColumns 更新 columns,從而觸發 table-header、table-body 重新渲染。

        另外table-body還會監聽data變化,觸發render。例如當組件加載后發送請求,待請求響應賦值data,重新渲染table-body。

         computed: {
         data() {
         // table.vue watch.data 中 調用 setData 在store 中存儲 data
         return this.store.states.data;
         },
         },

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        對ElementUItable組件的源碼的詳細分析

        對ElementUItable組件的源碼的詳細分析:本文章從如下圖所示的最基本的table入手,分析table組件源代碼。本人已經對table組件原來的源碼進行削減。本文只對重要的代碼片段進行講解,推薦下載代碼把項目運行起來,跟著文章的思路閱讀。思路<template> <p class="el-t
        推薦度:
        標簽: 代碼 的代碼 分析
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 日韩午夜理论免费TV影院| 日韩在线一区二区三区免费视频 | 日本一道在线日本一道高清不卡免费| 国产精品jizz在线观看免费| 亚洲日韩AV一区二区三区四区| 59pao成国产成视频永久免费| 亚洲春色在线视频| 国产精品美女久久久免费 | 国产成人精品日本亚洲网址 | 亚洲欧美第一成人网站7777| 成人一a毛片免费视频| 亚洲国产精品成人午夜在线观看| 中文字幕无码免费久久99| 亚洲免费福利在线视频| 国产成人精品免费视频大全五级| 久久亚洲精品无码网站| 亚洲国产成人乱码精品女人久久久不卡 | 久久精品国产亚洲av瑜伽| 国产精品酒店视频免费看| 男男黄GAY片免费网站WWW| 四虎影永久在线高清免费| 国产真人无码作爱免费视频| 久久久无码精品亚洲日韩按摩| 一级毛片全部免费播放| 亚洲av专区无码观看精品天堂| 免费无码黄十八禁网站在线观看| 亚洲日本VA午夜在线电影| 亚洲国产一级在线观看 | 免费观看在线禁片| 亚洲一区二区三区免费在线观看 | 91精品手机国产免费| 亚洲人成人网站18禁| 亚洲精品综合久久| 免费A级毛片无码无遮挡内射| 亚洲国产成人精品无码区在线秒播| 永久免费的网站在线观看| 老司机免费午夜精品视频| 亚洲AV无码不卡无码| 黄a大片av永久免费| 中文在线免费观看| 亚洲看片无码在线视频|