index.vue 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <template>
  2. <el-dropdown placement="bottom" size="small" @command="handleChange">
  3. <el-button class="ibps-mr btn-text can-hover" type="text">
  4. <ibps-icon name="language" size="16" />
  5. </el-button>
  6. <el-dropdown-menu slot="dropdown">
  7. <el-dropdown-item
  8. v-for="lang in languageList"
  9. :key="lang.value"
  10. :disabled="value===lang.value"
  11. :command="lang.value"
  12. >
  13. <ibps-icon :name="iconName(lang.value)" class="ibps-mr-5" />{{ lang.label }}
  14. </el-dropdown-item>
  15. </el-dropdown-menu>
  16. </el-dropdown>
  17. </template>
  18. <script>
  19. import { mapState, mapMutations, mapActions } from 'vuex'
  20. import setting from '@/setting.js'
  21. export default {
  22. name: 'ibps-plugins-language',
  23. data() {
  24. return {
  25. languageList: setting.system.languageList
  26. }
  27. },
  28. computed: {
  29. ...mapState('ibps/language', [
  30. 'value'
  31. ])
  32. },
  33. watch: {
  34. // 注意 这里是关键
  35. // 因为需要访问 this.$i18n 所以只能在这里使用这种方式
  36. value: {
  37. handler(val, oldVal) {
  38. if (val === '') {
  39. return this.handleChange(this.$i18n.locale || setting.system.language)
  40. }
  41. if (oldVal) {
  42. // 这个情况在已经加载完页面 用户改变了国际化时触发
  43. this.$i18n.locale = val
  44. // 由于已经加载过设置 需要清空缓存设置
  45. this.pageKeepAliveClean()
  46. // 由于已经加载过设置 需要刷新此页面
  47. this.$router.replace('/refresh')
  48. } else {
  49. // 这个情况在刷新页面时触发
  50. this.$i18n.locale = val
  51. }
  52. },
  53. immediate: true
  54. }
  55. },
  56. methods: {
  57. ...mapMutations({
  58. pageKeepAliveClean: 'ibps/page/keepAliveClean'
  59. }),
  60. ...mapActions({
  61. languageSet: 'ibps/language/set'
  62. }),
  63. handleChange(value) {
  64. this.languageSet(value)
  65. },
  66. iconName(name) {
  67. return name === this.value ? 'dot-circle-o' : 'circle-o'
  68. }
  69. }
  70. }
  71. </script>