Vue3 + Vite项目,使用i18n插件,导致element-plus日期控件错乱

如图:

img

网上相关问题较少,参考他人的解决办法,均无法解决,问题依然存在。升、降插件版本无用。

这个问题可能与 Element Plus 的样式表错乱有关。使用 i18n 插件后,可能会改变 CSS 类名,从而干扰 Element Plus 的样式表。
 你可以尝试以下几个解决方案:
 1. 修改 Element Plus 的样式表:在你的 Vue 项目中,查找 Element Plus 的样式表文件,例如  `element-plus/lib/theme-chalk/date-picker.css` ,将其中的 CSS 类名全部替换为在 i18n 插件中使用的类名,然后重新编译运行。这个方法比较麻烦,需要手动修改样式表,并且可能会影响项目的维护性。
 2. 使用 Element Plus 的自定义主题功能:Element Plus 提供了自定义主题的功能,你可以通过修改主题变量来自定义样式。在你的 Vue 项目中,创建一个自定义主题的文件,如  `src/theme/variables.scss` ,定义你所需的主题变量,例如:
scss
$--color-primary: #007bff;
$--border-radius: 4px;
然后在应用程序的入口文件中,使用  `ElementPlus`  的  `ElConfigProvider`  组件来加载自定义主题,如下所示:
vue
<template>
  <el-config-provider
    :i18n="i18n"
    :locale="locale"
    :element-plus="elementPlusConfig"
  >
    <router-view />
  </el-config-provider>
</template>
 <script>
import { defineComponent } from 'vue';
import { ElConfigProvider } from 'element-plus';
import 'element-plus/theme-chalk/base.scss';
import 'element-plus/theme-chalk/index.scss';
 import i18n from './i18n';
 export default defineComponent({
  components: {
    ElConfigProvider,
  },
  data() {
    return {
      locale: 'zh-cn',
      elementPlusConfig: {
        size: 'small',
        zIndex: 3000,
      },
    };
  },
  provide() {
    return {
      i18n: this.$i18n,
    };
  },
  i18n,
});
</script>
3. 在页面中手动添加类名:当 Element Plus 的样式表和 i18n 插件中的 CSS 类名冲突时,你可以手动在页面中为 Element Plus 的组件添加正确的类名。例如,为  `el-date-picker`  组件添加一个  `date-picker`  类名:
vue
<el-date-picker
  v-model="form.date"
  :editable="false"
  :clearable="false"
  :placeholder="formatMessage('datepicker.placeholder')"
  class="date-picker"
/>
希望这些解决方案可以帮助你解决问题。

img


首次登录,都会这样,在该页面重刷,才恢复正常

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你看下这篇博客吧, 应该有用👉 :Vite2+Vue3学习笔记(四):引入Vue-i18n并实现按钮切换页面语言
  • 除此之外, 这篇博客: Vue3 + Vite 实现项目搭建中的 Element Plus 组件库安装 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    vue2 的项目使用的组件库是 ElementUI,但是 vue3 项目使用的组件库是 Element Plus。

    Element Plus 官网:

    https://element-plus.gitee.io/zh-CN/

    安装方法呢,也很简单。

    npm install element-plus
    

    安装完成,在 main.js 中引入。

    import ElementPlus from 'element-plus'
    import 'element-plus/dist/index.css'
    
    const app = createApp(App)
    app.use(ElementPlus)
    app.mount('#app')
    

    然后就可以在页面实验一下了!

    <el-button type="primary" @click="show">Primary</el-button>
    
    import { ElMessage } from 'element-plus'
    
    setup() {
      function show() {
        ElMessage('王佳伟,你好棒啊!')
      }
      return { show }
    }
    

    在这里插入图片描述

  • 以下回答来自chatgpt:

    对于这个问题,可以尝试以下几个步骤:

    1. 将element-plus和i18n的版本都升级到最新版本,尤其是Vue3和Vite的环境下会有更好的兼容性。

    2. 在使用日期控件的组件中,手动设置el-date-picker的宽度,如下所示:

    <el-date-picker v-model="date" type="date" style="width: 100%" />
    
    1. 如果使用了el-form等组件,在i18n中翻译的时候可以使用scoped slots中的scope.label来保证正确的排版。例如:
    <el-form-item label="labelKey" :labelWidth="formLabelWidth">
      <template #label="{label}">
        <span>{{ $t(label) }}</span>
      </template>
      <el-input v-model="form.name" />
    </el-form-item>
    

    其中,labelKey是在i18n中定义的key,formLabelWidth是指定的表单项label宽度。

    1. 如果以上方法仍然不能解决问题,可以考虑禁用Vite的HMR(模块热更替)功能。具体方法是在vite.config.js中添加如下代码:
    // vite.config.js
    export default {
      optimizeDeps: {
        // disable HMR
        exclude: ['element-plus']
      }
    }
    

    这样可以禁用掉element-plus的HMR,可能可以解决排版错乱的问题。

    如果以上方案都尝试过了还是不能解决问题,建议到element-plus的GitHub上提交issue进行反馈,或者找vue-i18n的开发者进一步探讨。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^