【antd-vue 4.x transfer 穿梭框40w条数据全选卡死优化】

Ant Design Vue 4.x 版本穿梭框大数据下全选时卡死排查优化

10w条数据时点击右边全选框,出现卡死现象。

  1. 下载并运行antdv源码,使用for循环模拟10w条数据在穿梭框中,从右往左点击全选。
    在这里插入图片描述
  2. 通过浏览器性能分析记录,可以看到js代码执行花了31218毫秒,大约31秒。
    在这里插入图片描述
  3. 排查:
    在这里插入图片描述
  4. 在transfer的源码中发现
...filter(....indexOf())  这儿存在问题,可能会导致双重for循环操作

打印执行时间看,这里确实存在问题。
在这里插入图片描述
5. 优化使用for 循环 + map 解决此类问题

// 优化测试代码 使用此代码替换途中watch
    watch(
      () => props.selectedKeys,
      () => {
        const sKeys = props.selectedKeys || [];
        const tkeys = props.targetKeys || [];
        const sourceKeys = [];
        const targetKeys = [];
        const map = {};

        for (const key of tkeys) {
          map[key] = key;
        }

        for (const key of sKeys) {
          const hasKey = map[key];

          if (hasKey) {
            targetKeys.push(key);
          } else {
            sourceKeys.push(key);
          }
        }

        sourceSelectedKeys.value = sourceKeys;
        targetSelectedKeys.value = targetKeys;
        // sourceSelectedKeys.value =
        //   props.selectedKeys?.filter(key => props.targetKeys.indexOf(key) === -1) || [];
        // targetSelectedKeys.value =
        //   props.selectedKeys?.filter(key => props.targetKeys.indexOf(key) > -1) || [];
      },
      { immediate: true },
    );
  1. 优化后 10w 40w全选数据如下图
    在这里插入图片描述
    在这里插入图片描述
  • 操作40w 条数据内存占用
    在这里插入图片描述
  1. 把更改后的组件集成到项目中,替换原有的组件(这里就不描述了,欢迎私信讨论)。

  2. 优化完成,还有许多不足,欢迎讨论。

### 实现 ant-design-vue 4.x 的深色主题 在 ant-design-vue 4.x 中实现深色主题可以通过配置 `ConfigProvider` 组件以及自定义 CSS 变量来完成。以下是详细的说明: #### 配置 ConfigProvider 使用深色主题 通过 `ConfigProvider` 提供的主题配置选项可以全局设置组件库的主题风格。具体来说,`theme` 属性中的 `compact` 和 `primaryColor` 等参数可用于调整整体视觉效果[^2]。 ```javascript import { ConfigProvider } from 'ant-design-vue'; import Vue from 'vue'; new Vue({ el: '#app', components: { ConfigProvider, }, template: ` <ConfigProvider :theme="{ token: { colorPrimary: '#00ff00' }, algorithm: darkAlgorithm }"> <App /> </ConfigProvider> `, }); ``` 上述代码片段展示了如何利用 `darkAlgorithm` 来启用暗色模式。需要注意的是,`darkAlgorithm` 是由 Ant Design 官方提供的算法函数,用于计算并生成适用于暗色背景的颜色方案[^1]。 #### 自定义 CSS 变量覆盖默认样式 除了通过 JavaScript 动态注入外,还可以直接修改项目的根级 CSS 文件以引入特定变量覆盖默认值。例如: ```css /* 在 main.css 或 global.scss 中 */ :root { --ant-primary-color: #1890ff; } html[data-theme='dark'] { --ant-component-background: #141414; --ant-fill-color-base: rgba(25, 25, 25, 0.8); } ``` 此部分操作主要针对需要更精细控制的情况,比如某些特殊场景下的颜色微调或者适配品牌色彩需求[^3]。 #### 示例代码:动态切换明暗模式 如果希望提供给用户手动选择的能力,则需结合状态管理逻辑一起工作。下面是一个简单的例子演示如何基于按钮交互改变当前页面主题: ```vue <template> <div id="app" :class="{'dark-mode': isDark}"> <button @click="toggleTheme">Toggle Theme</button> <!-- Wrap your app content inside ConfigProvider --> <ConfigProvider :theme="currentTheme"> <router-view></router-view> </ConfigProvider> </div> </template> <script> export default { data() { return { isDark: false, }; }, computed: { currentTheme() { const algo = this.isDark ? require('antd/es/theme/darkAlgorithm') : null; return { algorithm: algo }; }, }, methods: { toggleTheme() { this.isDark = !this.isDark; }, }, }; </script> <style scoped> .dark-mode { background-color: black; color: white; } </style> ``` 以上实现了基本的功能——允许用户点击按钮后即时生效新的显示偏好设定[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值