vue动态添加store、路由和国际化配置方式

目录
  • vue动态添加store,路由和国际化
    • vue动态添加store
    • vue动态添加路由
    • vue动态加载国际化
  • 前端项目中用vue-i18n实现国际化
    • 在项目中安装国际化包的依赖
    • 配置文件
      • 异步方式引入,一次只加载一种国际化包
      • 非异步步方式,每次加载所有的包
    • 使用
    • 切语言

vue动态添加store,路由和国际化

vue动态添加store

想写组件库?用这个吧 …

// store module标准格式
import demo from '@/store/modules/demo'
$store.registerModule('demo', demo)

vue动态添加路由

从后端加载路由不再是梦 …

// 不加这个可以跳转,但是options里面没有新加的信息
$router.options.routes.push(...routerArray)
$router.beforeEach
$router.beforeResolve
$router.afterEach
$router.beforeHooks  // 数组
$router.afterHooks  // 数组

用这些修改全局路由守卫及守卫顺序

vue动态加载国际化

从后端加载国际化,so easy …

$i18n.setLocaleMessage('zh_CN', messageObject)
// or
$i18n.mergeLocaleMessage('zh_CN', messageObject)

前端项目中用vue-i18n实现国际化

在项目中安装国际化包的依赖

npm i vue-i18n --save

配置文件

作为独立的i18n文件,在main.js中引入。要是国际化文件不多,建议用非异步方式引入。

异步方式引入,一次只加载一种国际化包

lang/index.js

import Vue from 'vue';
// import Cookies from 'js-cookie'
import VueI18n from 'vue-i18n';
Vue.use(VueI18n);
class I18n extends VueI18n {
    constructor() {
        super({
            locale: '',
            message: {},
        });
    }
    // vue i18n init
    async init() {
        const sLang = this.getLang();
        await this.setLocale(sLang);
        return this;
    }
    // get/update language
    getLang() {
        // get define language
        // 需要取cookies里面的值的话就加上
        // sLang = Cookies.get('language') || navigator.language || 'zh-CN';
        let sLang = navigator.language || 'zh-CN';
        return sLang;
    }
    // set locale language
    async setLocale(sLang) {
        // async load language message
        const loadMessages = async function(sLang) {
            const oMessages = {};
            try {
                // local language file
                const oProjectMessage = await import(`./${sLang}`);
                // 需要 element 里面的语言包的话就加上
                // const oElementMessage = await import(
                //     `element-ui/lib/locale/lang/${sLang}`
                // );
                // assign language message
                Object.assign(
                    oMessages,
                    oProjectMessage.default,
                    // oElementMessage.default,
                );
            } catch (error) {
                throw new Error(error);
            }
            return oMessages;
        };
        const oMessages = await loadMessages(sLang);
        // vue-i18n的方法
        this.setLocaleMessage(sLang, oMessages);
        // update lang
        this.locale = sLang;
    }
}
export default new I18n();

*main.js

import Vue from 'vue';
import App from './App.vue';
import router from './router';
import i18n from './lang/index'; //引入i8n配置
import 'normalize.css';
Vue.config.productionTip = false;
// 初始化i18n和Vue
i18n.init().then(async (oI18n) => {
    new Vue({
        router,
        i18n: oI18n, //挂在在vue 下
        render: function(h) {
            return h(App);
        },
    }).$mount('#app');
});

以上异步方式适合应用在项目用默认的国际化语言,如果在页面上切语言的话,会很不方便,需要大刷。

下面推荐一下页面上有切语言的,非异步方式,一次加载所有的国际化文件。

非异步步方式,每次加载所有的包

lang/index.js

import Vue from 'vue'; // 引入Vue
import VueI18n from 'vue-i18n'; // 引入i18n
// import locale from 'element-ui/lib/locale' // 引入element 国际化配置
import cookie from 'js-cookie';
import cn from './zh-CN'; //简体中文语言文件
import tw from './zh-TW'; //繁体中文语言文件
import en from './en';
Vue.use(VueI18n);
const locale = cookie.get('language') || navigator.language || 'zh-CN';
// 创建实例并且挂在自定义语言包
const i18n = new VueI18n({
    locale: locale, // 默认语言为中文
    messages: {
        'zh-CN': cn,
        'zh-TW': tw,
        en,
    },
    silentTranslationWarn: true,
});
// locale.i18n((key, value) => i18n.t(key, value)); // 把element 的语言包挂在到i18n中
export default i18n; // 导出实例

main.js

* import Vue from 'vue';
import App from './App.vue';
import router from './router';
import i18n from './lang/index'; //引入i8n配置
import 'normalize.css';
// import common plugins
import utils from './utils';
Vue.config.productionTip = false;
// install utils
Vue.use(utils);
new Vue({
    router,
    i18n, // 挂在在vue 下
    render: function(h) {
        return h(App);
    },
}).$mount('#app');
/* 路由发生变化修改页面title */
router.beforeEach((to, from, next) => {
    if (to.name) {
        document.title = `${i18n.t('title')}-${i18n.t(to.name)}`;
    }
    next();
});

lang/zh-CN.js

 export default {
    title: '梦醒在笑-标题',
    edit: '修改',
    }

lang/cn.js

 export default {
    title: 'title',
    edit: 'edit',
    }

lang/zh-TW.js

 export default {
    title: '繁體﹣標題',
    edit: '編輯',
    }

使用

在HTML中使用

 <div>{{ $i18n.t('title')}}</div>

在JS中使用

this.$i18n.t('title')

切语言

非异步方式切换完页面不用刷新。

//在页面上这样调用 changeLang('zh-TW')changeLang('zh-CN')changeLang('en')
changeLang(lang) {
   //切换语言
   this.lang = lang;
   this.$i18n.locale = lang;
   this.$utils.cookie.set('language', lang);
},

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 关于vue中根据用户权限动态添加路由的问题

    根据用户的权限,展示不同的菜单页. 知识点 路由守卫(使用了前置守卫):根据用户角色判断要添加的路由 vuex:保存动态添加的路由 难点 每次路由发生变化时都需要调用一次路由守卫,并且store中的数据会在每次刷新的时候清空,因此需要判断store中是否有添加的动态路由. (若没有判断 则会一直添加 导致内存溢出) 根据角色判断路由 过滤动态路由 判断每条路由角色是否与登录传入的角色一致 <template> <div> <el-menu :default-active=&q

  • vue实现动态路由详细

    目录 一.前端控制 1.在router.js文件(把静态路由和动态路由分别写在router.js) 2.store/permission.js(在vuex维护一个state,通过配角色来控制菜单显不显示) 3.src/permission.js 4.侧边栏的可以从vuex里面取数据来进行渲染 二.后端控制路由 1.store/permission.js,在vuex里面发送请求获取数据 2.整理一份数据结构,存到表里 3.写一个转化方法,把获取到的数据转换成router结构 主流的实现方式: 简单

  • vue后台管理之动态加载路由的方法

    在这里我们将会实现一个vue动态路由的案列,当用户登陆成功后,根据用户的角色,拿到他对应的菜单信息,并将它动态的载入到我们的路由中. 我们的通用的后台管理系统中,我们会根据权限的粗细不同,会对每个角色每个权限每个资源进行控制.同样的我们也需要实现一个这样的功能. 这篇文章我将主要讲vue端的实现,关于后台接口我就不会涉及,当我接触的时候我们的后台接口是springcloud实现. 一.思路 在vue-router对象中首先初始化公共路由,比如(404,login)等,然后在用户登陆成功,根据用户

  • vue动态路由配置及路由传参的方式

    动态路由: 当我们很多个页面或者组件都要被很多次重复利用的时候,我们的路由都指向同一个组件,这时候从不同组件进入一个"共用"的组件,并且还要传参数,渲染不同的数据 这就要用到动态路由跟路由传参了! 首先我们来了解下router-link这个组件: 简单来说,它是个导航器,利用to属性导航到目标组件,并且在渲染的时候会自动生成一个a标签,当然官方也有说明,加个tag标签属性就可以渲染不同的标签,可以浏览器端查看到 并且当一个导航器被激活的时候,会自动加上一个css的激活样式,可以全局在路

  • vue动态添加store、路由和国际化配置方式

    目录 vue动态添加store,路由和国际化 vue动态添加store vue动态添加路由 vue动态加载国际化 前端项目中用vue-i18n实现国际化 在项目中安装国际化包的依赖 配置文件 异步方式引入,一次只加载一种国际化包 非异步步方式,每次加载所有的包 使用 切语言 vue动态添加store,路由和国际化 vue动态添加store 想写组件库?用这个吧 … // store module标准格式 import demo from '@/store/modules/demo' $store

  • vue 动态添加的路由页面刷新时失效的原因及解决方案

    目录 问题描述 场景 接口返回 前端菜单定义 vuex中的方法 出现的问题 原因分析 解决方案 实现代码 route/index.js的导航守卫中添加逻辑判断 总结 问题描述 昨天在做vue后台管理系统有关权限页面动态添加到路由的功能时,遇到一个问题:动态添加的路由页面,在页面刷新时出现了404的情况. 场景 后台管理系统的权限控制是通过在前端页面定义权限code, 把code给后台同学保存配置到表中,之后根据后台返回的权限code列表与前端页面配置的code菜单列表做筛选匹配,code相等的页

  • vue动态添加路由addRoutes之不能将动态路由存入缓存的解决

    在我不知道vue的路由还可以通过addRoutes动态添加时,我只知道vue的路由都是写死在路由表中的,每当跳转时再去加载相应的路由.直到在一个新公司接到需要根据用户的权限显示不同的菜单的需求时才知道了原来vue-router还有一个addRoutes的API,立马研究了一下. router.addRoutes: 函数签名: router.addRoutes(routes: Array<RouteConfig>) 动态添加更多的路由规则.参数必须是一个符合routes选项要求的数组. 点这里去

  • vue 动态添加class,三个以上的条件做判断方式

    如果 status为1,样式为redRoom 如果 status为2,样式为greenRoom1 如果 status为其他,样式为greenRoom2 :class="{'redRoom': Number(items.status) === 1, 'greenRoom1': Number(items.status) === 2, greenRoom2: Number(items.status) > 2}" 补充知识:vue 根据变量值来判断显示class 我就废话不多说了,大家还

  • vue 动态添加el-input的实现逻辑

    目录 一.效果图 二.实现逻辑 一.效果图 二.实现逻辑 将需要动态添加的表单项项的绑定值存为一个数组 以循环的方式展示form表单 点击`+`按钮触发事件,向数组中新加一个item 点击`-`按钮触发事件,根据循环的得到的index来删除数组中相对应位置的item三.代码实现 <template> <div> <el-button @click="isDilogShow = true" plain>动态添加input</el-button&g

  • vue动态子组件的两种实现方式

    文章目录 方式一:局部注册所需组件 使用缓存 方式二:动态注册组件实现 让多个组件使用同一个挂载点,并动态切换,这就是动态组件. 通过使用保留的 <component>元素,动态地绑定到它的 is 特性,可以实现动态组件. 方式一:局部注册所需组件 <div id="example"> <button @click="change">切换页面</button> <component :is="curre

  • Vue 动态添加路由及生成菜单的方法示例

    写后台管理系统,估计有不少人遇过这样的需求:根据后台数据动态添加路由和菜单. 为什么这么做呢?因为不同的用户有不同的权限,能访问的页面是不一样的. 在网上找了好多资料,终于想到了解决办法. 动态生成路由 利用 vue-router 的 addRoutes 方法可以动态添加路由. 先看一下官方介绍: router.addRoutes router.addRoutes(routes: Array<RouteConfig>) 动态添加更多的路由规则.参数必须是一个符合 routes 选项要求的数组.

  • 详解Vue 动态添加模板的几种方法

    以下方法只适用于 Vue1.0 版本,推荐系数由高到低排列. 通常我们会在组件里的 template 属性定义模板,或者是在 *.vue 文件里的 template 标签里写模板.但是有时候会需要动态生成模板的需求,例如让用户自定义组件模板,或者设置组件的布局. 例如要做一个类 select 的组件,用户传入 options 数据,通过 value prop 获取选中值,最基本的原型如下. Vue.component('XSelect', { template: ` <div class="

  • vue proxyTable的跨域中pathRewrite配置方式

    目录 vue浏览器跨域问题和vue proxyTable跨域中pathRewrite配置 vue浏览器跨域问题 为什么会跨域 什么是同源策略 解决办法 pathRewrite 代理配置proxy下pathrewrite失效踩坑 vue浏览器跨域问题和vue proxyTable跨域中pathRewrite配置 vue浏览器跨域问题 当浏览器报如下错误时,则说明请求跨域了. localhost/:1 Failed to load http://www.thenewstep.cn/test/test

随机推荐