【问题标题】:Creating global variables in Vuejs在 Vuejs 中创建全局变量
【发布时间】:2016-01-11 23:33:07
【问题描述】:

我正在 VueJS 中创建一个应用程序,我想创建一个服务或全局变量来存储客户端是否向服务器发出请求。 我一直在考虑配置一个中断器,它在发出请求时将全局变量设置为 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,让每个视图知道用户是否在请求某些东西。

【问题讨论】:

    标签: javascript global-variables


    【解决方案1】:

    答案是在我的 app.vue 中创建一个变量 is_loading,它是应用容器 ($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 调用它。

    :)

    【讨论】:

      【解决方案2】:

      你试过了吗:

      window.is_loading = true;
      
      if (window.is_loading) { }
      

      更新每条评论:

      该变量的范围对模板不可用。如果您可以为 ajax 响应引发启动/完成事件,您可以在模板之外处理它。代替模板中的条件,始终将其包含在模板中,但将 DIV CSS 属性设置为 display:none。然后在 start 的事件处理程序中,将其设置为 display: inline 和 event handler for response received 再次将其设置为 display:none。

      【讨论】:

      • 这是个好主意,但是,它对我没有帮助,因为它必须是反应式的,如果你阅读了我想使用 v-if="" 的模板。你的回答是行不通的。 :(
      • 啊,更仔细地阅读您的问题,我发现您希望根据连接是否处于活动状态将变量设置为 true/false。你的意思是用户提交后应该为真,服务器返回响应时为假?
      • 是的,像这样,但连接不活跃,这是当您通过 Ajax 发出请求时,在创建 ajax 请求之前我需要设置 $is_loading = true,并且当解析 ajax 请求时 $is_loading =错误,我不仅需要一个变量,我还需要一个反应变量,我尝试使用 Vue.prototype.$is_loading 在 Vue 原型中扩展它并且它可以工作,但是当我使用 {{ $is_loading 将它渲染到视图中时}} 它不是被动的。 :)
      【解决方案3】:

      您可以制作一个 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;
      

      或通过映射getter:

      computed:{
          ...mapGetters([
              'is_loading'
          ]),
      },
      

      【讨论】:

        猜你喜欢
        • 2017-12-20
        • 2016-10-25
        • 2015-03-24
        • 2013-03-23
        • 2017-11-12
        • 2021-12-11
        • 2011-01-02
        相关资源
        最近更新 更多