SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理

前提:

(1) 相关博文地址:

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(一):搭建基本环境:https://www.cnblogs.com/l-y-h/p/12930895.html
SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(二):引入 element-ui 定义基本页面显示:https://www.cnblogs.com/l-y-h/p/12935300.html
SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(三):引入 js-cookie、axios、mock 封装请求处理以及返回结果:https://www.cnblogs.com/l-y-h/p/12955001.html

(2)代码地址:

https://github.com/lyh-man/admin-vue-template.git

 

一、引入 vuex 进行状态管理

1、简介

  vuex指的是一种状态管理模式,集中式管理所有组件的状态(管理数据)。

【vuex 官方文档:】
    https://vuex.vuejs.org/zh/guide/

【vuex 参考地址:】
    https://www.cnblogs.com/l-y-h/p/11666653.html

 

使用场景分析:
  之前 Home.vue 页面中,Header 部分有个折叠按钮,点击之后,可以折叠与展开 Aside 组件,这之间就设计到数据在组件间的共享。
  之前使用 this.$emit 触发父组件的方法,然后通过 props 属性传递数据来实现的。

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第1张图片

 

 

 

  上面一种方式,虽然可以实现,但是组件太多的话,数据传递起来会很复杂。
  使用 vuex 后,数据统一管理,当数据发生变化时,其所有引用的地方均会修改。

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第2张图片

 

 

 

2、安装、模块化使用 vuex

(1)安装
  项目构建时,已经安装过了。
  可以使用 npm 手动安装,然后在 vuex 中全局引入。

【npm 安装:】
    npm install vuex

如下图:项目已经构建好了,在 store 文件夹下进行相关编写即可。

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第3张图片

 

 

(2)引入 vuex

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第4张图片

 

 

(3)根据功能拆分成各个模块
  所有的状态管理写在一个 js 里,不方便维护。
  可以根据不同的功能,抽取去不同的模块 js 进行处理。
比如:登录模块可以定义 user.js 去处理、公共模块可以定义 common.js 去处理。

如下:定义一个 user.js,其中 state 管理一个 userName 数据,当登录成功时,保存该数据,并显示在主页面的右上角。

export default {
    // 开启命名空间(防止各模块间命名冲突),访问时需要使用 模块名 + 方法名
    namespaced: true,
    // 管理数据(状态)
    state: {
        // 用于保存用户名
        userName: 'Admin'
    },
    // 更改 state(同步)
    mutations: {
        updateName(state, data) {
            if (data) {
                state.userName = data
            } else {
                state.userName = 'Admin'
            }
        }
    },
    // 异步触发 mutations
    actions: {
        updateName({commit, state}, data) {
            commit("updateName", data)
        }
    }
}

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第5张图片

 

 

(4)将定义好的模块,在 index.js 中引入。

import Vue from 'vue'
import Vuex from 'vuex'
import user from './module/user.js'

Vue.use(Vuex)

export default new Vuex.Store({
    modules: {
        user
    }
})

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第6张图片

 

 

(5)使用
  在组件中,可以引用 state、action 。
其中:
  使用 $store.state 可以引用 state 中的数据,也可使用 mapState 替代 $store.state。
  使用 $store.dispatch 可以引用 action 中的方法,也可使用 mapActions 替代·$store.dispatch。

如下:
  在 Header.vue 页面中,使用 mapState 引入 userName,并显示。
  在 computed 中 引入 state 定义的属性(可以使用 数组 或者 对象的形式)。
  由于使用了 模块进行封装,所以在引入时,第一个参数需要指定 模块名。

import {mapState} from 'vuex'
export default {
    computed: {
        // ...mapState('user', {userName: 'userName'}),
        ...mapState('user', ['userName'])
    }
}

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第7张图片

 

 

 

 

在 Login.vue 中引入 action 方法,用于修改 用户名。

import {mapActions} from 'vuex'

export default {
    data() {
        return {
            dataForm: {
                userName: '',
                password: ''
            }
        },
        methods: {
            ...mapActions('user', ['updateName'])
       }
    }
}

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第8张图片

 

简单测试一下:
  输入用户名,登录后,右上角显示 自定义用户名。
  不输入用户名,登录后,右上角显示 Admin(默认)。

 

 

二、引入 vue-i18n 进行国际化管理

1、简介

  一般项目都要求多语言显示,比如: 中文、英文 快速切换。
  使用 vue-i18n 插件可以快捷、方便的进行这种操作。

【官方文档:】
    https://kazupon.github.io/vue-i18n/zh/introduction.html

 

2、安装、使用

(1)npm 安装

npm install vue-i18n

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第9张图片

 

 

(2)引入 vue-i18n
  在 src 下新建一个 i18n 目录,并创建一个 index.js,用于引入 vue-i18n。
  并引入 各语言文件。

import Vue from 'vue'
// 引入 VueI18n
import VueI18n from 'vue-i18n'
// 全局挂载 VueI18n
Vue.use(VueI18n)

// 创建 i18n 实例,并引入语言文件(可以是 js 文件、也可以为 json 文件)
const i18n = new VueI18n({
    // locale 为语言标识,通过切换locale的值来实现语言切换( this.$i18n.locale )
    locale: 'zh',
    messages: {
        'zh': require('@/i18n/languages/zh.json'),
        'en': require('@/i18n/languages/en.json')
    }
})

export default i18n

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第10张图片

 

 

(3)定义各语言文件
  此处以 zh.json、en.json 为例(也可以定义成 js 文件)。

【zh.json】
{
    "login": {
        "title": "管理员登录",
        "userName": "用户名",
        "password": "密码",
        "language": "语言选择",
        "signIn": "登录",
        "userNameNotNull": "用户名不能为空",
        "passwordNotNull": "密码不能为空",
        "signInSuccess": "登录成功"
    },
    "language": {
        "setting": "设置",
        "languageSettings": "语言设置: ",
        "zh": "中文",
        "en": "英语"
    },
    "header": {
        "foldAside": "折叠侧边栏",
        "unFoldAside": "展开侧边栏",
        "setUp": "设置",
        "help": "帮助",
        "blogAddress": "博客地址",
        "codeAddress": "代码地址",
        "userSetUp": "用户设置",
        "updatePassword": "修改密码",
        "logOut": "退出"
    },
    "aside": {
        "adminCenter": "后台管理中心",
        "admin": "后台",
        "homePage": "首页"
    }
}


【en.json】
{
    "login": {
        "title": "Administrator Login",
        "userName": "UserName",
        "password": "Password",
        "language": "Language",
        "signIn": "SignIn",
        "userNameNotNull": "UserName Not Null",
        "passwordNotNull": "Password Not Null",
        "signInSuccess": "SignIn Success"
    },
    "language": {
        "setting": "Settings",
        "languageSettings": "Language Settings: ",
        "zh": "Chinese",
        "en": "English"
    },
    "header": {
        "foldAside": "Fold Aside",
        "unFoldAside": "Un Fold Aside",
        "setUp": "SetUp",
        "help": "Help",
        "blogAddress": "Blog Address",
        "codeAddress": "Code Address",
        "userSetUp": "User SetUp",
        "updatePassword": "Update Password",
        "logOut": "LogOut"
    },
    "aside": {
        "adminCenter": "Admin Center",
        "admin": "AC",
        "homePage": "Home Page"
    }
}

 

(4)在 main.js 中全局引入 定义好的 i18n。

import i18n from '@/i18n/index.js'

new Vue({
    router,
    store,
    i18n,
    render: h => h(App)
}).$mount('#app')

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第11张图片

 

 

(5)根据 zh.json、en.json 定义好的数据,将各个组件中的中文替换掉。
  使用 $t("") 去替换值。形式:{{$t("")}} 或者 this.$t("")。
如下例:
  替换 Login.vue 中的数据(留个坑)。

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第12张图片

 

 

(6)填坑
  上面我留了个坑,在 data 中使用 this.$t(""),修改语言后,不会变化。
  可以将其写在 computed 属性中。
如下例,在 Header.vue 中,使用一个 language 对象进行国际化管理。

computed: {
    // 定义国际化显示
    language() {
        return {
            foldAside: this.$t("header.foldAside"),
            unFoldAside: this.$t("header.unFoldAside"),
            setUp: this.$t("header.setUp"),
            help: this.$t("header.help"),
            blogAddress: this.$t("header.blogAddress"),
            codeAddress: this.$t("header.codeAddress"),
            userSetUp: this.$t("header.userSetUp"),
            updatePassword: this.$t("header.updatePassword"),
            logOut: this.$t("header.logOut")
        }
    }
}

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第13张图片

 

 

替换后的 Header.vue 如下,其余页面修改类似修改即可。





 

替换后的 Aside.vue 如下:





 

3、在主界面导航栏添加一个设置页面 Setup.vue

(1)简介
  用于定义系统设置,比如设置语言。

(2)定义页面内容:
  用于之前引入了 vuex,可以使用 vuex 保存 language 的状态。
  添加一个 common.js 模块,用于保存公共的状态。

export default {
    // 开启命名空间(防止各模块间命名冲突),访问时需要使用 模块名 + 方法名
    namespaced: true,
    // 管理数据(状态)
    state: {
        // 用于保存语言设置(国际化),默认为中文
        language: 'zh'
    },
    // 更改 state(同步)
    mutations: {
        updateLanguage(state, data) {
            state.language = data
        }
    },
    // 异步触发 mutations
    actions: {
        updateLanguage({commit, state}, data) {
            commit("updateLanguage", data)
        }
    }
}

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第14张图片

 

 

将定义好的模块在 vuex 的入口文件 index.js 中引入。

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第15张图片

 

 

引入 vuex,通过 ...mapState 以及 ...mapActions 引入。
{{$t("")}} 进行国际化处理。





SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第16张图片

 

 

(3)在 Header.vue 中引入,引入方式类似于 UpdatePassword.vue
大概步骤:
  Step1:import 导入 vue 组件。
  Step2:在 components 中声明组件。
  Step3:添加开关属性,并指定方法触发组件。

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第17张图片

 

 

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第18张图片

 

 

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第19张图片

 

 

(4)页面显示如下:

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第20张图片

 

 

4、在登录界面添加一个语言选择框

  上面在主界面的导航栏上添加了一个语言设置选项,但是登录界面没有语言设置选项,看着有点别扭,给登录界面加上一个语言选择框,可以将数据传向后台,控制后台的国际化。

(1)添加一个语言选择框


    



【样式显示有些问题,稍作调整】
.el-scrollbar__wrap {
    overflow-x: scroll !important;
}

.login-select {
    left: -120px;
    width: 120px;
}

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第21张图片

 

 

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第22张图片

 

 

(2)同样引入 vuex 对语言进行管理(写法类似于 Setup.vue)。
Step1:
  通过 mapActions 引入 common 模块中的方法:,并定义方法进行操作。

import { mapActions } from 'vuex'

...mapActions('common', {updateLang: "updateLanguage"})

updateLanguage() {
    this.$i18n.locale = this.dataForm.language
    this.updateLang(this.dataForm.language)
}

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第23张图片

 

 

Step2:
  定义触发方法,通过 el-select 标签的 change 事件可以触发。


    

SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理_第24张图片

 

 

完整的 Login.vue:



 

(3)页面显示

 

你可能感兴趣的:(SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):引入 vuex 进行状态管理、引入 vue-i18n 进行国际化管理)