【问题标题】:how to define global variables in Nuxt to be accessed anywhere如何在 Nuxt 中定义全局变量以在任何地方访问
【发布时间】:2020-09-13 14:17:19
【问题描述】:

当我开始扩展我的应用程序时,我发现了一个大问题!我正在开发一个没有i18n 的多语言双向应用程序。基本上我有一个像下面这样的语言 json 文件:

{
  "fa":{
    "dir": "rtl",
    // ....
  },
  "en":{
    "dir": "ltr",
    //....
  }
}

我将它存储在我的 vuex 状态 lang 在 nuxtInitServer 上。但我有两个问题。

首先,如何在我的 scss 文件中访问它来更改字体系列?

其次,如何在我的插件中访问它? 至于插件,我的解释如下:link to question

顺便说一句,有没有办法在 nuxt 中定义一个全局变量,以便在任何地方访问,当然是可变的(不像 env 那样是静态的)。例如,当我更改语言时,能够访问 .js 和 .scss 文件中的当前语言。

更新 这是我需要访问存储的实际插件代码:

import Vue from 'vue'
import { required, email , alpha , alpha_spaces , numeric , confirmed } from 'vee-validate/dist/rules'
import { extend, ValidationObserver, ValidationProvider, setInteractionMode } from 'vee-validate'
import { store } from 'vuex'

Vue.prototype.$something= function (){
    let lang = store.state.lang
}

setInteractionMode('eager')

extend('required', {
    ...required,
    message: `{_field_} ${$lang.error_required}` // this is were i'm gonna use my vuex state
})
extend('email', email)
extend('alpha', alpha)
extend('numeric', numeric)
extend('alpha_spaces', alpha_spaces)
extend('confirmed', confirmed)
extend("decimal", {
    validate: (value, { decimals = '*', separator = '.' } = {}) => {
        if (value === null || value === undefined || value === '') {
            return {
                valid: false
            };
        }
        if (Number(decimals) === 0) {
            return {
                valid: /^-?\d*$/.test(value),
            };
        }
        const regexPart = decimals === '*' ? '+' : `{1,${decimals}}`;
        const regex = new RegExp(`^[-+]?\\d*(\\${separator}\\d${regexPart})?([eE]{1}[-]?\\d+)?$`);

        return {
            valid: regex.test(value),
        };
    },
    message: '{_field_} ' + ''
})
Vue.component('ValidationProvider', ValidationProvider);
Vue.component("ValidationObserver", ValidationObserver);

【问题讨论】:

    标签: vue.js vuejs2 vuex nuxt.js


    【解决方案1】:
    1. 您无法在 Scss 代码中访问 javascript 变量。但是您可以为每个语言环境定义一个 Css 类,并将正确的类设置为一个主 div,并在布局文件中使用计算属性。
    <template>
      <div :class="containerLangClass">
        <nuxt />
      </div>
    </template>
    <script>
    export default {
      computed: {
        containerLangClass() {
          return "container-" + this.$store.getters.lang;
        }
      }
    };
    </script>
    
    <style lang="scss">
    .container-fa {
      font-family: "Franklin Gothic Medium", "Arial Narrow", Arial, sans-serif;
    }
    .container-en {
      font-family: "Gill Sans", "Gill Sans MT", Calibri, "Trebuchet MS", sans-serif;
    }
    </style>
    
    1. 您可以在插件中导入 vuex 存储,并在自定义方法、指令和 co 中使用它。但我认为您想在创建插件之前访问存储值。

    所以你不能只导入商店

    import {store} from './store';
    

    并使用它的值

    store.getters.lang
    

    因为此时存储尚未初始化。

    更新 当然,您可以在自定义函数中使用 store getter、action 等,例如:

    import Vue from "vue";
    
    Vue.prototype.$something = function (){
                
    let lang = this.$store.getters.lang; //...etc
    
            }
    

    更新 2 要在您的自定义验证消息中使用您的商店,您可以添加一个 mixin,您可以在 mount 钩子中添加您的验证。此时您可以访问您的 vuex 商店。

    插件代码:

    import Vue from "vue";
    import { extend } from "vee-validate";
    import { required } from "vee-validate/dist/rules";
    
    Vue.mixin({
      mounted() {
        extend("required", {
          ...required,
          message: fieldName => {
            return `${fieldName} ${this.$store.getters.$lang.error_required}`;
          }
        });
      }
    });
    
    

    请注意,每次调用 mount 时都会调用此代码。所以我建议只在需要的页面中使用此验证。

    【讨论】:

    • 我试过这个,但在我的 cmd 中得到 "export 'store' was not found in 'vuex' 错误。也不会定义 lang !我用我想要在其中存储访问权限的插件代码更新了我的问题。还尝试使用$something 并在另一个js文件中使用您的代码并将其导入此处,但没有运气
    • 我的错,对不起!你不能像 "import {store} from "vuex" "那样导入商店。我刚刚修正了我的答案。
    • 所以我无法在我的插件中访问我的商店!?该验证是vee-validate 模块,该代码用于plugins 文件夹中的配置,veevalidate.js 文件。如果我想在每个页面上使用它,我可以在那个页面脚本部分配置它。我认为使用 mixin 会让事情变得复杂!
    • 我写的 mixin 代码,代表 plugins 文件夹中的 veevalidate.js 文件。所以你只需要写一次。正如我所说,可以在自定义原型函数(更新 1)中访问存储,但您无权访问主插件范围内的注册存储。 (您在哪里调用了 extend 方法)。这就是为什么我将它添加到安装的钩子中,这样您就可以轻松地注册您的自定义验证并返回您的商店变量。混合就在那里,在每个页面中注册它。
    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 2019-05-02
    • 2016-09-16
    相关资源
    最近更新 更多