ant-design-vue低版本浏览器兼容问题解决办法

2,171 阅读2分钟

项目版本:antdv:4.1.2,vue:3.4.19,vite:5.1.3

打开antdv的官网,我们可以看到其对环境的兼容情况

image.png

由于我手上的项目需要部署的是73版本的谷歌,部署上去之后发现,antd的表格,表单,按钮,样式全都失效,十分丑陋。于是开始找解决办法。翻阅官方文档后,发现可用如下方法解决样式兼容

image.png

image.png

App.vue代码如下:

<template>
  <ConfigProvider :locale="getAntdLocale" :theme="themeConfig">
    <AppProvider>
      <!-- {{ currentEnv }} -->
      <!-- 开发环境不需要样式降级,否则会报错 -->
      <RouterView v-if="currentEnv === 'development'" />
      <!-- 发布到生产环境需要解开以下兼容性代码 -->
      <div v-else>
        <StyleProvider hash-priority="high" :transformers="[legacyLogicalPropertiesTransformer]">
          <RouterView />
        </StyleProvider>
      </div>
    </AppProvider>
  </ConfigProvider>
</template>

<script lang="ts" setup>
import { AppProvider } from '@/components/Application';
import { useTitle } from '@/hooks/web/useTitle';
import { useLocale } from '@/locales/useLocale';
import { ConfigProvider, StyleProvider } from 'ant-design-vue';
import { legacyLogicalPropertiesTransformer } from 'ant-design-vue';
import { useDarkModeTheme } from '@/hooks/setting/useDarkModeTheme';
import 'dayjs/locale/zh-cn';
import { computed,onMounted,ref } from 'vue';

// support Multi-language
const { getAntdLocale } = useLocale();

const { isDark, darkTheme } = useDarkModeTheme();

const themeConfig = computed(() =>
  Object.assign(
    {
      token: {
        /** 
         * app内部的颜色依赖注入,适用于组件的默认背景色,改动后可直接生效
         */
        colorPrimary: '#1890FF',
        colorSuccess: '#55D187',
        colorWarning: '#EFBD47',
        colorError: '#ED6F6F',
        colorInfo: '#1890FF',
      },
    },
    isDark.value ? darkTheme : {},
  ),
);
/** 当前环境变量 */
const currentEnv = ref(import.meta.env.MODE);

onMounted(() => {
console.log('currentEnv', currentEnv.value);
  
})
useTitle();
</script>

再次部署,表格和表单样式正常,但是message的样式没出来,这个后面再调。未完待续。。。

4月18日更新,message和modal样式兼容配置解决办法。

由于在上文中设置了全局的样式降级,在各个组件中使用时,用静态方法调用的方法将不能正常挂载message实例,因为获取不到全局的configProvider,解决办法:使用官方提供hooks方式调用。modal组件同理,并在组件中放上contextHolder组件以获取provider。代码如下:

<template>
  <div class="my-container">
      <contextHolder />
      <modalContext />
  </div>
</template>
<script setup lang="ts">
import { message,Modal } from 'ant-design-vue'
const [messageApi, contextHolder] = message.useMessage();
const [modal, modalContext] = Modal.useModal();
const test = ()=>{
    messageApi.success('编辑成功').then(()=>{
      loading.value = false
      isFormSubmit.value = true
      backToIndex()
    })
}
const test2 = ()=>{
    modal.confirm({
      title: '你填写的内容还未保存,确定关闭此页面吗?',
      icon: createVNode(ExclamationCircleOutlined),
      // content: createVNode('div', { style: 'color:red;' }, 'Some descriptions'),
      onOk() {
        okCallback()
      },
      centered: true,
      onCancel() {
        cancelCallback && cancelCallback()
      },
      class: 'test',
    });
}
</script>

需要注意的是,messageApi返回一个promise,可以在.then的回调中进行后续逻辑,更严谨一点。