在Vuejs中创建全局变量

时间:2016-01-11 23:33:08

标签: javascript global-variables

我正在 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,以了解用户是否正在请求某些内容。

3 个答案:

答案 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'
    ]),
},