2017-02-25 68 views
0

我的部分是這樣的:如何在搜索時添加加載圖標? (Vue.js 2)

<template> 
    ... 
     <input type="text" class="form-control" v-model="rawFilter" placeholder="Search" @keyup="getPlayers"> 
    ... 
</template> 

<script> 
    import _ from 'lodash' 
    ... 
    export default { 
     ... 
     data() { 
      return{ 
       msg:'hello vue', 
       rawFilter:'', 
       loading:false 
      } 
     }, 
     ... 
     methods: { 
      getPlayers: _.debounce(function(e) { 
       const text = e.target.value.trim() 
       this.$store.dispatch('getPlayers', { 
        q: text 
       }) 
      },1000), 
      ... 
     } 
    } 
</script> 

當我搜索,之前顯示的數據,我想添加一個加載圖標

我怎樣才能做到這一點在vue.js 2 ?

回答

0

您可以在您的模板上添加一個加載div,並根據loading標誌切換它的顯示。這樣

new Vue({ 
 
    el: '#app', 
 
    data: { 
 
    show: true, 
 
\t isLoading: false, 
 
    }, 
 
\t methods:{ 
 
\t \t loadData: function(){ 
 
\t \t \t this.isLoading = true; 
 
\t \t \t setTimeout(function(){ 
 
\t \t \t \t this.isLoading = false; 
 
\t \t \t }.bind(this),1000); 
 
\t \t } 
 
\t } 
 
})
.loading{ 
 
\t display: none; 
 
\t position: absolute; 
 
    width: 100%; 
 
    height: 100%; 
 
    top: 0; 
 
    background: rgba(128, 128, 128, 0.5); 
 
} 
 
.loading.show{ 
 
\t display: initial; 
 
}
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <meta name="viewport" content="width=device-width"> 
 
    <title>JS Bin</title> 
 
</head> 
 
<body> 
 
<div id="app"> 
 
\t <div class="loading" v-bind:class="{ show: isLoading }"> 
 
\t \t <span>Loading</span> 
 
\t </div> 
 
\t <button @click="loadData">Load</button> 
 
</div> \t 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.3/vue.js"></script> 
 
</body> 
 
</html>

東西,你可以使負載指示漂亮的CSS,也可以使用已有的一個,例如,你可以使用http://tobiasahlin.com/spinkit/http://loading.io/

1

你只需要將其附加到標誌並使用v-if,如果您使用的是vue資源,則可以在before回調中將loading標誌設置爲true,並在收到重新設置後將其設回false sponse:

Vue的實例

methods: { 
    loadData() { 
     this.$http.get('/search', { 
     before:() => { 
      this.loading = true; 
     } 
     }).then(response => { 
     // Deal with response 
     }).then(() => { 
      //set loading flag to false 
      this.loading = false; 
     }) 
    } 
    }, 
    data: { 
    loading: false 
    } 

HTML

<div id="app"> 
    <button @click="loadData"> 
    Get Data 
    </button> 

    <!-- Only show if loading is true --> 
    <div v-if="loading" v-cloak> 
    <i class="fa fa-circle-o-notch fa-spin fa-3x fa-fw"></i> 
    <span>Loading...</span> 
    </div> 
</div> 

這裏的的jsfiddle:https://jsfiddle.net/hyeycoan/

4

可用性的緣故,我會建議使用具有裝載機其自己的vuex狀態。

  1. 這將允許您從任何組件控制它。
  2. 您可以通過簡單的函數調用輕鬆使用它。
  3. 自然避免道具和事件。

首先定義,你需要這種特殊的裝載機:

  1. 是它被用於所有的API調用?
  2. 一些瀏覽器密集型任務(如處理加載的文件)。
  3. 或者在本質上更具體的東西(也許只顯示當用戶試圖登錄裝載機)

如果加載程序不嚴格的情況下,1連接到任何組件像然後會更有SENS繼續在主VUE文件的加載器(如果您正在使用VUE-CLI然後App.vue)

事情是這樣:

<template> 
    <div id="app"> 
    <loader></loader> 
    <router-view></router-view> 
    </div> 
</template> 

<script> 
import Loader from './components/shared/loader/Loader' 

export default { 
    name: 'app', 
    components: { 
    Loader 
    } 
} 
</script> 

有了這個,你不必添加loader.vue在每個其他組件文件中。但首先,我將向您展示我正在使用的加載程序組件和商店。

<template> 
    <div class='loader-container' :class='{"show": show, "hidden": !show}'> 
    <div class="curved-div"> 
     <div class="colour-magic"> 
     <i class='fa fa-circle-o-notch rotate'></i> 
     </div> 
     <div class="loading"> 
     {{ loading }} 
     </div> 
    </div> 
    </div> 
</template> 

<script> 
import { mapGetters } from 'vuex' 
import * as NameSpace from '../../../store/NameSpace' 

export default { 
    data() { 
    return { 
     loading: 'Loading...' 
    } 
    }, 
    computed: { 
    ...mapGetters({ 
     show: NameSpace.GET_LOADER_STATE 
    }) 
    } 
} 
</script> 

<style scoped> 
.loader-container { 
    position: fixed; 
    width: 100%; 
    height: 100%; 
    background: rgba(0,0,0,0.8); 
} 

.curved-div { 
    position: absolute; 
    top: 50%; 
    left: 50%; 
    transform: translateX(-50%); 
    border-radius: .3rem; 
    width: 20rem; 
    padding:1rem; 
    background: white; 
    box-shadow: 0 0 .1rem #fefefe; 
} 

.curved-div > * { 
    display: inline-block; 
} 

.rotate { 
    border-radius: 50%; 
    padding: .5rem; 
    animation-name: rotate; 
    animation-duration: .7s; 
    animation-iteration-count: infinite; 
    animation-delay: 0s; 
} 

.loading { 
    text-align: center; 
    width: 12rem; 
    font-size: 1.8rem; 
} 

.show { 
    visibility: visible; 
    opacity: 1; 
    z-index: 1; 
    transition: opacity 0.5s ease-out, visibility 0.5s ease-out, z-index 0.5s ease-out; 
} 

.hidden { 
    opacity: 0; 
    visibility: hidden; 
    z-index: 0; 
    transition: opacity 0.5s ease-out, visibility 0.5s ease-out, z-index 0.5s ease-out; 
} 

@keyframes rotate { 
    0% { 
    transform: rotateZ(0deg); 
    } 
    100% { 
    transform: rotateZ(360deg); 
    } 
} 

.colour-magic { 
    animation-name: colorMagic; 
    animation-duration: 20s; 
    animation-iteration-count: infinite; 
    animation-delay: 0s; 
} 

@keyframes colorMagic { 
    0% { color: rgb(179,10,10); } 
    10% { color: rgb(227,132,22); } 
    20% { color: rgb(164,153,7); } 
    30% { color: rgb(26,171,19); } 
    40% { color: rgb(19,144,177); } 
    50% { color: rgb(14,16,221); } 
    60% { color: rgb(27,9,98); } 
    70% { color: rgb(58,11,111); } 
    80% { color: rgb(126,14,129); } 
    90% { color: rgb(208,19,121); } 
    100% { color: rgb(198,18,18); } 
} 
</style> 

請注意,我正在使用font-awesome來裝載程序。

和這裏是商店:

import * as NameSpace from '../NameSpace' 
// you can also use the namespace: true in your store and eliminate the need of NameSpace.js  

const state = { 
    [NameSpace.LOADER_STATE]: false 
} 

const getters = { 
    [NameSpace.GET_LOADER_STATE]: state => { 
    return state[NameSpace.LOADER_STATE] 
    } 
} 

const mutations = { 
    [NameSpace.MUTATE_LOADER_STATE]: (state, payload) => { 
    state[NameSpace.LOADER_STATE] = payload 
    } 
} 

const actions = { 
    [NameSpace.LOADER_SHOW_ACTION]: ({ commit }, payload) => { 
    commit(NameSpace.MUTATE_LOADER_STATE, payload) 
    } 
} 

export default { 
    state, 
    getters, 
    mutations, 
    actions 
} 

甲使用例如:

// This is not a .vue file it is a .js file, therefore a different way of using the store. 
import Vue from 'vue' 
import * as NameSpace from 'src/store/NameSpace' 
import loaderState from 'src/store/modules/loader' 

/** 
* Pass the mutation function to reduce the text length 
* This function can now be used in the api calls to start/stop the loader 
* as the api starts and finishes. 
*/ 
let loaderSwitch = loaderState.mutations[NameSpace.MUTATE_LOADER_STATE].bind(null, loaderState.state) 

login (username, password) { 
    loaderSwitch(true) 
    return new Promise((resolve, reject) => { 
    SomeEndpoint.logIn(username, password, { 
     success (user) { 
     loaderSwitch(false) 
     resolve(user.attributes) 
     }, 
     error (user, error) { 
     loaderSwitch(false) 
     reject(errorHelper(error.code)) 
     } 
    }) 
    }) 

現在,不論在使用登錄的組分,所述加載器組件不需要有保持。