VUE-Element UIカスタムLoading図操作


必要:
element ui loading図は自分のloading図しか使えません。
しかし、多くの場面では、自分のgif図に切り替える必要があります。
文書にはいくつかありますが、element-loading-spinner=「el-inon-loading」はカスタム図を指定できます。
しかし、テストしても、もうelemenuiのアイコンライブラリの中の図だけです。私たちが考えているカスタム図類の意味ではありません。
カスタム図の方法:
1)カスタムelement UI loadingスタイルを追加する

astertsの下でCSSフォルダとCSSファイルを新規作成します。たとえば、mys.cssです。
また、カスタムのelement類CSSスタイルを書き込みます。

.el-loading-spinner{
  /*          gif     */
  background-image:url('../img/loading.gif');
  background-repeat: no-repeat;
  background-size: 200px 120px;
  height:100px;
  width:100%;
  background-position:center;
  /*   element-ui     50%        height:100%,       ,      ,   top    */
  top:40%;
 }
.el-loading-spinner .circular {
 /*      element-ui     loading   */
 
 display: none; 
} 
.el-loading-spinner .el-loading-text{
 /*       loading   */
 margin:85px 0px; 
}
CSSの詳細は、ブラウザのデバッグツールで詳しく調整する必要があります。

2)main.jsはカスタムスタイルを導入する。
ここでは、element UIを導入してから、自分のスタイルを導入します。そうでないと、element UIに上書きされます。

import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI); //element 
 
//    element UI loading  
import './assets/css/myCss.css'
3)v-loading

 <el-container
   v-loading="loading"
   element-loading-background="rgba(255, 255,255, 0.5)"
   element-loading-text="   ..." 
 >
ここではelement-loading-spinner=「el-incon-loading」を追加しないでください。そうでないと、elementライブラリに対応するloading図も同時に現れます。
4)ロードロジック対応

 data () {
 return { 
  loading: true 
 }
 }, 
 startLoading()
 { 
  this.loading=true; 
 },
 
 endLoading(){
   this.loading=false;
  },
axiosがインターフェースを要求する時、loadingを始めて、データを受け取った後に、loadingは終わります。

  Ajx_GetClassList()
  {
   this.startLoading(); 
    this.$axios(
    {
     url: url,
     method:'POST',
    }
   ).then(res=>{
 
     this.endLoading();
 
    }) 
  },
5)実行時は正常に表示されますが、コンパイル後はカスタムイメージリソースが見えなくなりました。
理由は、VUE項目を包装した後、スタイルディレクトリ構造がstatic/cssになります。
解決
build->utils.jsプロファイル追加
publicPath:'./''

 // Extract CSS when that option is specified
 // (which is the case during production build)
 if (options.extract) {
  return ExtractTextPlugin.extract({
  use: loaders,
  publicPath:'../../', //   element-ui          
  fallback: 'vue-style-loader'
  })
このようにコンパイルしたelemen-uiリソースも正常にアクセスできます。

カスタムloading図の効果

追加知識:vue+element UIカスタム共通tableコンポーネント
共通のテーブルコンポーネントをカスタマイズして、改ページ、バックエンドの順序付け、ルートのパラメータジャンプ、複数の選択ボックス、フィールドのフォーマットがあります。
1.テーブルListコンポーネント

<!--          -->
<template>
  <div class="table-temp">
    <el-table
      :data="tableData"
      border
      size="mini"
      fit
      highlight-current-row
      height="500"
      v-loading="loading"
      @selection-change="handleSelectionChange"
      @sort-change="sortChange"
    >
      <el-table-column type="selection" width="55" align="center"></el-table-column>
      <el-table-column type="index" label="  " align="center" fixed></el-table-column>
      <!-- prop:    name, label:      , fixed:       (left, right), minWidth:         (     ), active:       
      active.name:        , active.clickFun:        , formatData:      -->
      <el-table-column
        v-for="(item, key) in tableHeader"
        :key="key"
        :prop="item.prop"
        :label="item.label"
        :fixed="item.fixed"
        :min-widitem="item.minWidth"
        align="center"
        :sortable="item.sortable"
      >
        <template slot-scope="scope">
          <div v-if="item.active">
            <el-button
              v-for="(o, key) in item.active"
              :key="key"
              @click="handleActive(scope.row, o.router, o.routerId)"
              type="text"
              size="small"
            >{{o.name}}</el-button>
          </div>
          <div v-else>
            <a class="btn-a"
              v-if="item.router"
              @click="handleActive(scope.row,item.router, item.routerId)"
            >
              <span v-if="!item.formatData">{{ scope.row[item.prop] }}</span>
              <span v-else>{{ scope.row[item.prop] | formatters(item.formatData) }}</span>
            </a>
            <div v-else>
              <span v-if="!item.formatData">{{ scope.row[item.prop] }}</span>
              <span v-else>{{ scope.row[item.prop] | formatters(item.formatData) }}</span>
            </div>
          </div>
        </template>
      </el-table-column>
    </el-table>
    <div class="pagination">
      <el-pagination
        background
        layout="total, prev, pager, next"
        :current-page="pagination.pageIndex"
        :page-size="pagination.pageSize"
        :total="pagination.pageTotal"
        @current-change="handlePageChange"
      ></el-pagination>
    </div>
  </div>
</template>
<script>
var _ = require('lodash');
export default {
  props: {
    tableData: {
      type: Array,
      default: function() {
        return [];
      }
    },
    tableHeader: {
      type: Array,
      default: function() {
        return [];
      }
    },
    loading: {
      type: Boolean,
      default: false
    },
    pagination: {
      type: Object,
      default: {
        pageIndex: 0,
        pageSize: 15,
        pageTotal: 0
      }
    }
  },
  data() {
    return {
      multipleSelection: [],
      newPagination: {
        pageIndex: 0,
        pageSize: 15,
        pageTotal: 0
      }
    };
  },
  methods: {
    //     
    handleSelectionChange(val) {
      this.multipleSelection = val;
      this.$emit('selectFun', { backData: this.multipleSelection });
    },
    //     
    handlePageChange(val) {
      console.log('handlePageChange:', val);
      this.$set(this.pagination, 'pageIndex', val);
      //       
      this.$emit('pageChange', { backData: this.pagination});
    },
    // row:    ,route:        ,       routeId
    handleActive(row, route, routeId) {
      console.log(row);
      this.$router.push({
        path: '/' + route,
        query: {
          id: row[routeId]
        }
      });
    },
    //    
    sortChange(column) {
      //console.log('sortChange:', column);
      //       
      this.$emit('sortChange', { backData: column });
    }
  },
  watch: {
    
    }
  },
  computed: {
  },
  created() {
  }
};
</script>
<style scoped>
.btn-a{
  color: #409EFF
}
</style>
2.コンポーネント使用

<template>
  <div>
<!--    -->
      <table-List
        :tableData="tableData"
        :tableHeader="tableHeader"
        :loading="loading"
        :pagination="pagination"
        @pageChange="pageChange"
        @selectFun="selectFun"
        @sortChange="sortChange"
      ></table-List>
  </div>
</template>
<script>
import appMain from '../../../utils/app_main';
export default {
  data() {
    return {
//        
      loading: false,
      //     
      pagination: {
        pageIndex: 1,
        pageSize: 10,
        pageTotal: 60
      },
      tableHeader: [
        //     
        { prop: 'id', label: '    ', minWidth: '100px', router: 'quitDetail', routerId: 'id', sortable: 'custom' },
        {
          prop: 'resignationUserName',
          label: '  ',
          router: 'employeeDetail',
          routerId: 'resignationUserId',
          sortable: 'custom'
        },
        { prop: 'departName', label: '  ', minWidth: '100px', sortable: 'custom' },
        { prop: 'jobRole', label: '    ', sortable: 'custom' },
        {
          prop: 'onbordingTime',
          label: '    ',
          formatData: function(val) {
            let date = new Date(val);
            return appMain.formatDate(date, 'yyyy-MM-dd');
          },
          sortable: 'custom'
        },
        {
          prop: 'resignationTime',
          label: '    ',
          formatData: function(val) {
            let date = new Date(val);
            return appMain.formatDate(date, 'yyyy-MM-dd');
          },
          minWidth: '100px',
          sortable: 'custom'
        },
        { prop: 'resignationReason', label: '    ', minWidth: '100px', sortable: 'custom' },
        { prop: 'status', label: '    ', minWidth: '100px', sortable: 'custom' }
      ],
      tableData: [],
      multipleSelection: [],
    };
  },
 
  methods: {
    //             
    selectFun(data) {
      this.multipleSelection = data.backData;
    },
    //          
    sortChange(data) {
      let column = data.backData;
      //  
      if (column.order) {
        //  
        if (column.order === 'descending') {
          // this.query.sortColumn = column.prop + ' ' + 'desc';
        } else {
          // this.query.sortColumn = column.prop;
        }
      } else {
        //   
        // this.query.sortColumn = '';
      }
      //    
    },
   
    //    
    pageChange(data) {
      this.pagination = data.backData;
      console.log('pageChange:', this.pagination);
      //    --    
    },  
  }
};
</script>
3.appMain.js

 class appMain {
 
  }
//      
  formatDate(date, fmt) {
    var date = new Date(date)
    if (/(y+)/.test(fmt)) {
      fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
    }
    let o = {
      'M+': date.getMonth() + 1,
      'd+': date.getDate(),
      'h+': date.getHours(),
      'm+': date.getMinutes(),
      's+': date.getSeconds()
    };
    for (let k in o) {
      if (new RegExp(`(${k})`).test(fmt)) {
        let str = o[k] + '';
        fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : this.padLeftZero(str));
      }
    }
    return fmt;
  };
  padLeftZero(str) {
    return ('00' + str).substr(str.length);
  }
export default new appMain()
以上のVUE-ElementoUIのユーザー定義Loading図操作は小編集が皆さんに提供したすべての内容です。参考にしていただければと思います。どうぞよろしくお願いします。