jeecg-vue3 UI框架升级到antd4.x

antd官方升级文档
jeecg-vue3 从ant-design-vue3.x升级4.x需要做的工作及注意事项

一、针对4.x API变动对项目代码进行更改:

  • 组件弹框的class统一由 dropdownClassName 改成 popupClassName
    涉及的组件:
    • AutoComplete
    • Cascader
    • Select
    • TreeSelect
    • TimePicker
    • DatePicker
    • Mentions
<template>
  <a-select
--  dropdownClassName="my-popup"
++  popupClassName="my-popup"
  />
</template>
  • 组件弹窗受控可见统一由 visible 改成 open。(封装组件 BasicDrawerBasicModal 组件做了兼容可不调整)
    涉及的组件:
    • Drawer
    • Modal
    • Dropdown
    • Tooltip
    • Popover (绝大多属性同Tooltip)
    • Popconfirm
<template>
	<a-modal 
	 -- :visible="visible"
	 ++ :open="visible"
	>
		content
	</a-modal>
</template>
  • 组件弹窗事件由 visibleChange 改成 openChange
    涉及的组件:
    • Drawer
    • Modal
    • Tooltip
    • Dropdown
    • Popover (绝大多属性同Tooltip)
    • Popconfirm
<template>
	<a-modal 
	 -- :visibleChange="handleVisibleChange"
	 ++ @openChange="handleVisibleChange"
	>
		content
	</a-modal>
</template>
  • 封装组件 BasicDrawerBasicModal 组件做了兼容,既支持原先的 visiblevisibleChange 也支持 openopenChange,升级之后可不调整。
  • Tag 组件 visible 已移除。
<template>
	<a-tag 
		-- :visible="visible"
		++ :if="visible"
	>
		tag
	</a-tag>
</template>
  • Slider 组件 tooltip 相关 API 收敛到 tooltip 属性中。
<a-slider 
	-- :tooltipVisible="visible"
	++ :tooltip="{ open: visible }" 
/>

二、系统主题:

因antd4.x放弃了less,但是jeecg-vue3中还要大量less变量,所以要兼容两者。

main.ts

import 'uno.css';
import '/@/design/index.less';
+ import 'ant-design-vue/dist/reset.css';

build/vite/plugin/theme.ts 文件
在这里插入图片描述
build/generate/generateModifyVars.ts 文件
在这里插入图片描述

import { primaryColor } from '../config/themeConfig';
// import { getThemeVariables } from 'ant-design-vue/dist/theme';
import { resolve } from 'path';
import { generate } from '@ant-design/colors';
import { theme } from 'ant-design-vue/lib';
import convertLegacyToken from 'ant-design-vue/lib/theme/convertLegacyToken';
const { defaultAlgorithm, defaultSeed } = theme;
function generateAntColors(color: string, theme: 'default' | 'dark' = 'default') {
  return generate(color, {
    theme,
  });
}
/**
 * less global variable
 */
export function generateModifyVars() {
  const palettes = generateAntColors(primaryColor);
  const primary = palettes[5];

  const primaryColorObj: Record<string, string> = {};

  for (let index = 0; index < 10; index++) {
    primaryColorObj[`primary-${index + 1}`] = palettes[index];
  }

  const mapToken = defaultAlgorithm(defaultSeed);
  const v3Token = convertLegacyToken(mapToken);
  console.log(v3Token)
  return {
    ...v3Token,
    // ...modifyVars,
    // Used for global import to avoid the need to import each style file separately
    // reference:  Avoid repeated references
    hack: `true; @import (reference) "${resolve('src/design/config.less')}";`,
    'primary-color': primary,
    ...primaryColorObj,
    'info-color': primary,
    'processing-color': primary,
    'success-color': '#55D187', //  Success color
    'error-color': '#ED6F6F', //  False color
    'warning-color': '#EFBD47', //   Warning color
    //'border-color-base': '#EEEEEE',
    'font-size-base': '14px', //  Main font size
    'border-radius-base': '2px', //  Component/float fillet
    'link-color': primary, //   Link color
    'app-content-background': '#fafafa', //   Link color
  };
}

src/App.vue 文件
在这里插入图片描述

<template>
  <ConfigProvider :theme="appTheme" :locale="getAntdLocale">
    <AppProvider>
      <RouterView />
    </AppProvider>
  </ConfigProvider>
</template>

<script lang="ts" setup>
  import { watch, ref } from 'vue';
  import { theme } from 'ant-design-vue';
  import { ConfigProvider } from 'ant-design-vue';
  import { AppProvider } from '/@/components/Application';
  import { useTitle } from '/@/hooks/web/useTitle';
  import { useLocale } from '/@/locales/useLocale';
  import { useAppStore } from '/@/store/modules/app';
  import { useRootSetting } from '/@/hooks/setting/useRootSetting';
  import { ThemeEnum } from '/@/enums/appEnum';
  import { changeTheme } from '/@/logics/theme/index';

  const appStore = useAppStore();
  // 解决日期时间国际化问题
  import 'dayjs/locale/zh-cn';
  // support Multi-language
  const { getAntdLocale } = useLocale();

  useTitle();
  // update-begin--author:liaozhiyang---date:20231215---for:【QQYUN-6366】升级到antd4.x
  const appTheme: any = ref({});
  const { getDarkMode } = useRootSetting();
  watch(
    () => getDarkMode.value,
    (newValue) => {
      delete appTheme.value.algorithm;
      if (newValue === ThemeEnum.DARK) {
        appTheme.value.algorithm = theme.darkAlgorithm;
      }
      appTheme.value = {
        ...appTheme.value,
      };
    },
    { immediate: true }
  );
  watch(
    appStore.getProjectConfig,
    (newValue) => {
      const primary = newValue.themeColor;
      appTheme.value = {
        ...appTheme.value,
        ...{
          token: {
            colorPrimary: primary,
            wireframe: true,
            fontSize: 14,
            colorSuccess: '#55D187',
            colorInfo: primary,
            borderRadius: 2,
            sizeStep: 4,
            sizeUnit: 4,
            colorWarning: '#EFBD47',
            colorError: '#ED6F6F',
          },
        },
      };
    },
    { immediate: true }
  );
  setTimeout(() => {
    appStore.getProjectConfig?.themeColor && changeTheme(appStore.getProjectConfig.themeColor);
  }, 300);
  // update-end--author:liaozhiyang---date:20231215---for:【QQYUN-6366】升级到antd4.x
</script>
<style lang="less">
  // update-begin--author:liaozhiyang---date:20230803---for:【QQYUN-5839】windi会影响到html2canvas绘制的图片样式
  img {
    display: inline-block;
  }
  // update-end--author:liaozhiyang---date:20230803---for:【QQYUN-5839】windi会影响到html2canvas绘制的图片样式
</style>

三、需要注意事项:

  • columns.customRender返回** cell props 被废弃,须使用columns.customCell**替代。
  • 某些组件 css选择器权重 有变动。(所有选择器都必须在组件根类名之后)
3.x .ant-layout-header{height: 64px;}
4.x .ant-layout .ant-layout-header{height: 64px;}

3.x .ant-drawer-header{position: relative;display: flex;}
4.x .ant-drawer .ant-drawer-header{position: relative;display: flex;}
  • 某些组件样式有被舍掉。
 3.x 组件自带样式
 .ant-modal-close-x{
 	display: block;
    width: 56px;
    height: 56px;
    font-size: 16px;
    font-style: normal;
    line-height: 56px;
    text-align: center;
    text-transform: none;
    text-rendering: auto;
 }
 4.x 组件自带样式
.ant-modal .ant-modal-close-x {
    display: block;
    font-size: 16px;
    font-style: normal;
    line-height: 22px;
    text-align: center;
    text-transform: none;
    text-rendering: auto;
}
  • table中 #headerCell 作用域插槽 column.title 可能会得到对象。
当table有展开行时:
3.x  第一列#headerCell中column.title是""
4.x  第一列#headerCell中column.title是对象
  • 打包生产访问有报错,如果报错信息是在手工分包中可以试着在vite.config.js去掉这个手工分包。
  • Drawer组件的 classstyle 作用于 .ant-drawer-content 元素上,原先作用于根元素(.ant-drawer)。如果需要作用于根元素需要改成rootClassNamerootStyle.
    在这里插入图片描述
    在这里插入图片描述
  • Drawer组件的 zIndex 作用于Drawer( .ant-drawer-content-wrapper),3.x是作用最外层容器。如想作用于最外层容器可写在rootStyle里面。
    在这里插入图片描述
    在这里插入图片描述
  • drawer组件打开状态3.x在挂载元素上会自动添加 overflow:hidden 属性和ant-scrollling-effect类名。4.x这俩都没了,目前检查看是没影响。overflow:hidden可能特殊情况下有影响需要手动添加。
    在这里插入图片描述
    在这里插入图片描述
  • getPopupContainer 在4.x版本特殊应用场景(其他大多数没问题,根本原因待查)下回调函数的 node 会有 undefined 的情况,这时候可使用可选链写法兼容下(会执行多次)。在3.x版本没问题(只执行一次)。
<template>
  <TimePicker
    :value="innerTimeValue"
    allowClear
    :format="format"
    popupClassName="j-vxe-time-picker"
    style="min-width: 0"
    v-model:open="openPicker"
    v-bind="cellProps"
    @change="handleChange"
    :getPopupContainer="(node) => {console.log('- node -:',node);return node?.parentNode;}"
  />
</template>

在这里插入图片描述

Jeecg-Boot是一款基于Spring Boot和Mybatis-Plus的开发平台,主要用于快速开发企业级的后台管理系统。而Vue.js是一款流行的前端JavaScript框架。在Jeecg-Boot中使用Vue.js可以实现前后端分离的开发模式,提高开发效率和可维护性。 针对将.xls文件转为.zip文件的需求,你可以在Vue.js中使用jsZip库来实现。具体步骤如下: 1.安装jsZip库 可以使用npm安装jsZip库: ``` npm install jszip --save ``` 2.在Vue.js中导入jsZip库 在需要使用jsZip的组件中,导入jsZip库: ``` import JSZip from 'jszip' ``` 3.编写jsZip代码 在Vue.js组件中,可以编写如下代码将.xls文件转为.zip文件: ``` // 读取.xls文件 axios.get('/api/getExcel') .then(res => { const fileData = res.data // 实例化jsZip对象 const zip = new JSZip() // 将.xls文件添加到zip包中 zip.file('example.xls', fileData, { binary: true }) // 生成zip包 zip.generateAsync({ type: 'blob' }) .then(content => { // 下载zip包 const link = document.createElement('a') link.href = URL.createObjectURL(content) link.download = 'example.zip' link.click() }) }) ``` 这段代码通过axios库向服务器请求获取.xls文件,然后使用jsZip库将文件添加到zip包中,并生成zip包并下载。需要注意的是,这里使用了二进制方式读取文件内容,需要在axios请求中设置responseType为'arraybuffer'。 以上就是在Jeecg-Boot框架中使用Vue.js将.xls文件转为.zip文件的方法,希望能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值