element-ui Steps步驟條組件源碼分析整理筆記(九)

来源:https://www.cnblogs.com/fangnianqin/archive/2018/12/12/10107581.html
-Advertisement-
Play Games

Steps步驟條組件源碼: steps.vue step.vue ...


Steps步驟條組件源碼:

steps.vue

<template>
    <!--設置 simple 可應用簡潔風格,該條件下 align-center / description / direction / space 都將失效。-->
  <div
    class="el-steps"
    :class="[
       !simple && 'el-steps--' + direction,
       simple && 'el-steps--simple'
     ]">
      <slot></slot>
  </div>
</template>

<script>
import Migrating from 'element-ui/src/mixins/migrating';

export default {
  name: 'ElSteps',

  mixins: [Migrating],

  props: {
    space: [Number, String], //每個 step 的間距,不填寫將自適應間距。支持百分比。
    active: Number, //設置當前激活步驟
    direction: {  //顯示方向
      type: String,
      default: 'horizontal'
    },
    alignCenter: Boolean, //進行居中對齊
    simple: Boolean, // 是否應用簡潔風格
    finishStatus: { //設置結束步驟的狀態
      type: String,
      default: 'finish'
    },
    processStatus: { //設置當前步驟的狀態
      type: String,
      default: 'process'
    }
  },

  data() {
    return {
      steps: [], //記錄步驟數數組
      stepOffset: 0
    };
  },

  methods: {
    //  屬性遷移
    getMigratingConfig() {
      return {
        props: {
          'center': 'center is removed.'
        }
      };
    }
  },

  watch: {
    active(newVal, oldVal) {
      // 當前激活步驟改變時,觸發父組件的change方法,將改變前和改變後的步驟作為參數傳遞出去
      this.$emit('change', newVal, oldVal);
    },

    steps(steps) {
      steps.forEach((child, index) => {
        child.index = index;
      });
    }
  }
};
</script>

step.vue

<template>
    <!--每一步驟的最外層包裹div-->
  <div
    class="el-step"
    :style="style"
    :class="[
      !isSimple && `is-${$parent.direction}`,
      isSimple && 'is-simple',
      isLast && !space && !isCenter && 'is-flex',
      isCenter && !isVertical && !isSimple && 'is-center'
     ]">
    <!-- 步驟的數字圖標和步驟條直線 -->
    <div class="el-step__head" :class="`is-${currentStatus}`">
        <!--步驟條直線-->
        <!--如果是最後一步,margin-right不存在;如果不是,則為0-->
      <div class="el-step__line" :style="isLast ? '' : { marginRight: $parent.stepOffset + 'px' }">
        <i class="el-step__line-inner" :style="lineStyle"></i>
      </div>
        <!--步驟條的數字圖標-->
      <div class="el-step__icon" :class="`is-${icon ? 'icon' : 'text'}`">
          <!--如果當前狀態為:wait、process、finish-->
        <slot v-if="currentStatus !== 'success' && currentStatus !== 'error'" name="icon">
            <!--如果是圖標則顯示對應的圖標-->
          <i v-if="icon" class="el-step__icon-inner" :class="[icon]"></i>
            <!--如果圖標和未設置isSimple簡潔風格時,則顯示步驟文字-->
          <div class="el-step__icon-inner" v-if="!icon && !isSimple">{{ index + 1 }}</div>
        </slot>
        <!--如果當前狀態為:success、error-->
        <i v-else :class="['el-icon-' + (currentStatus === 'success' ? 'check' : 'close')]" class="el-step__icon-inner is-status"></i>
      </div>
    </div>
    <!-- 步驟條下麵每一步的標題和描述 -->
    <div class="el-step__main">
        <!--每一步的標題-->
      <div class="el-step__title" ref="title" :class="['is-' + currentStatus]">
        <slot name="title">{{ title }}</slot>
      </div>
        <!--簡潔模式下會有>圖標-->
      <div v-if="isSimple" class="el-step__arrow"></div>
        <!--每一步的描述-->
      <div v-else class="el-step__description" :class="['is-' + currentStatus]">
        <slot name="description">{{ description }}</slot>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'ElStep',

  props: {
    title: String, //標題
    icon: String, //圖標
    description: String, //描述性文字
    status: String //設置當前步驟的狀態,不設置則根據 steps 確定狀態。 wait(灰色)/ process(黑色)/ finish(藍色)/ error / success(綠色)
  },

  data() {
    return {
      index: -1,
      lineStyle: {}, //步驟條直線的樣式
      internalStatus: ''
    };
  },

  beforeCreate() {
    this.$parent.steps.push(this);
  },
  mounted() {
     const unwatch = this.$watch('index', val => {
        this.$watch('$parent.active', this.updateStatus, { immediate: true });
        unwatch();
     });
  },
  beforeDestroy() {
    const steps = this.$parent.steps;
    const index = steps.indexOf(this);
    if (index >= 0) {
      steps.splice(index, 1);
    }
  },

  computed: {
    // 返回當前步驟的狀態
    currentStatus() {
      return this.status || this.internalStatus;
    },
    prevStatus() {
      const prevStep = this.$parent.steps[this.index - 1];
      return prevStep ? prevStep.currentStatus : 'wait';
    },
    // 返回是否是居中對齊
    isCenter() {
      return this.$parent.alignCenter;
    },
    // 返回顯示的方向:豎直(false)或者水平(true)
    isVertical() {
      return this.$parent.direction === 'vertical';
    },
    // 返回是否應用簡潔風格
    isSimple() {
      return this.$parent.simple;
    },
    // 判斷當前是不是最後步驟
    isLast() {
      const parent = this.$parent;
      return parent.steps[parent.steps.length - 1] === this;
    },
    //  返回總步驟數
    stepsCount() {
      return this.$parent.steps.length;
    },
    // 返回每個step的間距。
    space() {
      const { isSimple, $parent: { space } } = this;
      // isSimple為true時,space將失效
      return isSimple ? '' : space ;
    },
    style: function() {
      const style = {};
      const parent = this.$parent;
      const len = parent.steps.length; //總步驟
      // 每個step的間距
      const space = (typeof this.space === 'number'  //如果設置的space是number
        ? this.space + 'px'   //space等於設置的space
        : this.space ? this.space : 100 / (len - (this.isCenter ? 0 : 1)) + '%'); //如果未設置space,未設置居中,則等於100除以(總步驟數-1);設置居中顯示,則等於00除以總步驟數。
      // flex-basis 屬性用於設置或檢索彈性盒伸縮基準值。
      style.flexBasis = space;
      //如果是水平方向則直接返回設置的樣式
      if (this.isVertical) return style;
      //如果是最後的步驟,設置最大寬度等於(100/總步驟數)%
      if (this.isLast) {
        style.maxWidth = 100 / this.stepsCount + '%';
      } else {
          //如果不是最後的步驟,marginRight為0
        style.marginRight = -this.$parent.stepOffset + 'px';
      }
      return style;
    }
  },

  methods: {
    updateStatus(val) {
      const prevChild = this.$parent.$children[this.index - 1];
      if (val > this.index) { //如果是下一步
        //  internalStatus 等於用戶設置的結束步驟狀態
        this.internalStatus = this.$parent.finishStatus;
      } else if (val === this.index && this.prevStatus !== 'error') {
          //  internalStatus 等於用戶設置的當前步驟狀態
        this.internalStatus = this.$parent.processStatus;
      } else {
        this.internalStatus = 'wait';
      }
      if (prevChild) prevChild.calcProgress(this.internalStatus);
    },
    //設置步驟間直線的樣式
    calcProgress(status) {
      let step = 100;
      const style = {};
      // transitionDelay在過渡效果開始前等待的秒數:
      style.transitionDelay = 150 * this.index + 'ms';
      if (status === this.$parent.processStatus) {
        step = this.currentStatus !== 'error' ? 0 : 0;
      } else if (status === 'wait') {
        step = 0;
        //為負數的時候過渡的動作會從該時間點開始顯示,之前的動作被截斷;為正數的時候過渡的動作會延遲觸發。
        style.transitionDelay = (-150 * this.index) + 'ms';
      }

      style.borderWidth = step ? '1px' : 0;
      this.$parent.direction === 'vertical'
        ? style.height = step + '%'
        : style.width = step + '%';

      this.lineStyle = style;

    }
  }


};
</script>

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JavaScript是運行在客戶端的腳本,因此一般是不能夠設置Session的,因為Session是運行在伺服器端的。 而cookie是運行在客戶端的,所以可以用JS來設置cookie. 假設有這樣一種情況,在某個用例流程中,由A頁面跳至B頁面,若在A頁面中採用JS用變數temp保存了某一變數的值, ...
  • 本文由雲+社區發表 本文主要講述瞭如何一步步在生產環境上部署django和vue,操作系統預設為centos 說明 :後文中出現的以下字元串均表示具體的路徑或者名稱,含義如下: DJANGO_DIR 表示django的工程根目錄 DJANGO_NAME 表示django的工程名稱 VUE_HTML_ ...
  • Collapse 摺疊面板源碼: collapse.vue collapse item.vue ...
  • 嗷嗷方便的文字轉語音,不過用的時候記得到百度語音上申請key,免費的.之前在網路上看到有人寫了一部分,自己豐富下,以後用也方便 ...
  • 來自:https://blog.csdn.net/m0_37068028/article/details/72898154 侵刪 來自:https://segmentfault.com/a/1190000010378259 侵刪 第一種: //date.jsexport function forma ...
  • tofixed方法 四捨五入 toFixed() 方法可把 Number 四捨五入為指定小數位數的數字。例如將數據Num保留2位小數,則表示為:toFixed(Num);但是其四捨五入的規則與數學中的規則不同,使用的是銀行家舍入規則,銀行家舍入:所謂銀行家舍入法,其實質是一種四舍六入五取偶(又稱四舍 ...
  • 示例html代碼: 示例html代碼: 示例html代碼: 示例html代碼: 示例html代碼: <div id="test"> <span style="color:red">test1</span> test2 </div> 獲得id為test的DOM對象,下麵就不一一獲取了。 var tes ...
  • 面向對象的語言有一個標誌,那就是它們都有類的概念,而通過類可以創建任意多個具有相同屬性和方法的對象。 理解對象 創建自定義對象的最簡單的方法就是創建一個Object的實例,然後再為它添加屬性和方法。例如: 同樣上面的例子可以通過對象字面量語法寫成如下: 屬性類型 ECMAScript中有兩種屬性:數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...