返回

赋能级联选择器,单击即达

前端

在软件开发的征途上,我们时常会遇到一些看似简单实则颇具挑战性的需求。近期,我在项目中就遇到了这样一个需求:使用 Element-ui 级联选择器组件时,既要实现数据的懒加载,又要能够单击选中任意一项。

接到需求后,我自信满满地拍着胸脯向产品经理保证一定完成任务。然而,当我在开发过程中吭哧吭哧地写完懒加载功能后,却发现只能选中最后一项!刹那间,我如遭雷击,内心充满了挫败感。

经过一番冥思苦想,我终于找到了问题所在:如果需要选中任意一项,就不能对数据进行懒加载。因为懒加载的本质是按需加载,只有当用户展开某一项时,才会加载其子项数据。这样一来,单击其他项时,由于没有加载子项数据,自然无法选中。

意识到问题的关键后,我开始寻找解决方案。经过一番搜索,我发现有两种方法可以解决这个问题:

  1. 使用虚拟滚动 :虚拟滚动是一种常见的技术,它可以在不加载所有数据的情况下模拟出滚动效果。这样一来,用户就可以在不加载所有数据的情况下选择任意一项。

  2. 使用本地数据 :如果数据量不大,也可以将所有数据加载到本地,这样就可以实现单击选中任意一项的功能。

考虑到性能因素,我最终选择了第一种解决方案。通过使用虚拟滚动,我成功地实现了级联选择器组件的懒加载功能,同时又保证了单击选中任意一项的功能。

这次开发经历让我深刻地认识到,在软件开发中,看似简单的问题背后往往隐藏着不小的挑战。只有不断学习、不断钻研,才能不断提升自己的能力,解决更多的问题。

最后,将我的解决方案与大家分享一下,希望能够帮助到有需要的朋友。

// 导入 Element-ui 级联选择器组件
import { Cascader } from 'element-ui';

// 定义级联选择器组件
const app = new Vue({
  el: '#app',
  components: { Cascader },
  data() {
    return {
      // 懒加载数据
      lazyData: [],
      // 是否加载完成
      isLoaded: false,
    };
  },
  methods: {
    // 加载数据
    loadData(node, callback) {
      // 模拟异步加载数据
      setTimeout(() => {
        // 这里假设数据是通过接口获取的
        const data = [
          {
            id: 1,
            label: '选项 1',
            children: [
              {
                id: 11,
                label: '选项 1-1',
              },
              {
                id: 12,
                label: '选项 1-2',
              },
            ],
          },
          {
            id: 2,
            label: '选项 2',
            children: [
              {
                id: 21,
                label: '选项 2-1',
              },
              {
                id: 22,
                label: '选项 2-2',
              },
            ],
          },
        ];

        // 将数据返回给回调函数
        callback(data);

        // 数据加载完成后,设置 isLoaded 为 true
        this.isLoaded = true;
      }, 500);
    },
  },
  template: `
    <div>
      <el-cascader
        v-model="value"
        :options="lazyData"
        :props="{ lazy: true, expandTrigger: 'hover' }"
        @expand-change="loadData"
      />
    </div>
  `,
});

希望这篇博文能对大家有所启发。如果您有其他问题,欢迎随时与我联系。