我正在 VueJS 中创建一个应用程序,我想创建一个服务或全局变量,存储客户端是否向服务器发出请求。 我一直在考虑配置一个interruptor,它在发出请求时将全局变量设置为true,当请求完成时将变量设置为false。
因此,当我使用加载程序组件时,它仅在变量为真时显示。
示例:
// As i do
<form @submit.prevent="save">
<h2>{{ $t('organization.labels.organization')}}</h2>
<div class="row">
<div class="col m6 s12" v-if="$route.name == 'organization'">
<form-input-text :title="$t('organization.labels.client_number')" :model.sync="form.client.client_number" ></form-input-text>
</div>
<div class="col m6 s12">
<div class="center" v-if="loader.is_loading">
<material-loader></material-loader>
<br> <small>{{ $t('organization.labels.loading')}}</small>
</div>
</div>
</div>
</form>
// As it should work
<form @submit.prevent="save">
<h2>{{ $t('organization.labels.organization')}}</h2>
<div class="row">
<div class="col m6 s12" v-if="$route.name == 'organization'">
<form-input-text :title="$t('organization.labels.client_number')" :model.sync="form.client.client_number" ></form-input-text>
</div>
<div class="col m6 s12">
<div class="center" v-if="$loader.is_loading"> <== $loader
<material-loader></material-loader>
<br> <small>{{ $t('organization.labels.loading')}}</small>
</div>
</div>
</div>
</form>
任何想法? 主要思想是必须为每个视图创建一个变量is_loading,以了解用户是否正在请求某些内容。
答案 0 :(得分:5)
答案是在我的app.vue中创建一个变量 is_loading ,它是app容器($ root)。
<template>
<div id="app">
<navigation></navigation>
<div class="main-container">
<router-view></router-view>
</div>
<!-- <binnacle-footer></binnacle-footer> -->
</div>
</template>
<script>
import UserProvider from 'users/provider/User.provider'
import session from 'session/index'
export default {
data() {
return{
loader : {
is_loading : false
}
}
},
methods :{
getUser(){
var self = this;
self.$root.loader.is_loading = true;
UserProvider.get().then((user)=>{
self.$root.loader.is_loading = false;
self.current_user = user;
}).catch((err)=>{
self.$root.loader.is_loading = false;
})
}
},
ready(){
this.getUser();
},
}
</script>
然后你必须只使用$ root在任何你想要的地方调用它。
:)
答案 1 :(得分:1)
你试过了吗?
window.is_loading = true;
if (window.is_loading) { }
每条评论更新:
该变量的范围不适用于模板。如果您可以为ajax响应引发事件以启动/结束,则可以在模板之外处理它。而不是模板中的条件,将其始终包含在模板中,但将DIV CSS属性设置为display:none。然后在事件处理程序中启动,将其设置为display:inline和事件处理程序,用于收到响应,将其设置为display:none。
答案 2 :(得分:0)
你可以创建一个VUEX模块并将其命名为ajax.js,如下所示:
const state = {
ajax: {is_loading: false}
};
const mutations = {
'SET_LOADING' (state, status){
state.ajax.is_loading = status;
},
};
const actions = {
set_loading: ({commit}, status) => {
commit('SET_LOADING', status);
},
};
const getters = {
is_loading: state => {
return state.ajax.is_loading;
},
};
export default {
state,
mutations,
actions,
getters
};
然后你必须在store.js文件中注册它。
现在,您可以在Vue实例旁边全局使用此代码:
import store from "./store/store";
window.axios.interceptors.request.use(function (config) {
store.state.ajax.ajax.is_loading = true;
return config;
}, function (error) {
store.state.ajax.ajax.is_loading = false;
return Promise.reject(error);
});
axios.interceptors.response.use(function (response) {
store.state.ajax.ajax.is_loading = false;
return response;
}, function (error) {
store.state.ajax.ajax.is_loading = false;
return Promise.reject(error);
});
我尝试使用此代码:
store.state.dispatch('set_loading', true);
但是没有工作!所以我使用另一种语法来改变 is_loading 的价值!
现在,在您的组件中,您可以通过以下方式访问is_loading变量:
this.$store.getters.is_loading;
或通过映射getteres:
computed:{
...mapGetters([
'is_loading'
]),
},