Skip to content
On this page

FAQ


1. select 原件怎么支持异步加载 options

TIP

其他原件类似:tree-select, multi-select, cascader, cascader-lazy


方式 1: 直接传入一个异步函数

查看代码
tsx
import { defineFatForm } from '@wakeadmin/components';
import { ref } from 'vue';

export default defineFatForm(({ item, group }) => {
  const callTime = ref(0);

  const getList = () => {
    callTime.value++;

    return Promise.resolve([
      {
        label: '选项1',
        value: 1,
      },
      {
        label: '选项2',
        value: 2,
      },
    ]);
  };

  return () => ({
    children: [
      item({
        prop: 'option1',
        label: '选项1',
        valueType: 'select',
        initialValue: 1,
        valueProps: {
          options: getList,
        },
      }),
      item({
        prop: 'option2',
        label: '选项1',
        valueType: 'select',
        initialValue: 2,
        valueProps: {
          options: getList,
        },
      }),
      group({
        label: '调用次数',
        children: [<span>{callTime.value}</span>],
      }),
    ],
  });
});

要点:

  • 异步函数只会在原件挂载(setup)时执行一次。后续原件重新渲染不会被执行
  • 重复的异步函数会被自动合并。所以可以放心地在表格(FatTable)等场景使用它。


方式 2: 手动维护

可以自己手动请求数据,并通过 ref 保存起来。这种方式适用于需要手动控制请求时机、刷新时机的场景。

示例:配合 swrv 使用:

查看代码
tsx
import { defineFatForm } from '@wakeadmin/components';
import { ref } from 'vue';
import useSwrv from 'swrv';
import { ElButton } from 'element-plus';

export default defineFatForm(({ item, group }) => {
  const callTime = ref(0);
  let uuid = 0;
  const { data, mutate: reload } = useSwrv('/your/api', () => {
    callTime.value++;
    return Promise.resolve([
      {
        label: `选项1 ${uuid++}`,
        value: 1,
      },
      {
        label: `选项2 ${uuid++}`,
        value: 2,
      },
    ]);
  });

  return () => ({
    children: [
      item({
        prop: 'option1',
        label: '选项1',
        valueType: 'select',
        initialValue: 1,
        valueProps: {
          options: data.value,
        },
      }),
      item({
        prop: 'option2',
        label: '选项1',
        valueType: 'select',
        initialValue: 2,
        valueProps: {
          options: data.value,
        },
      }),
      group({
        label: '刷新',
        children: [<ElButton onClick={() => reload()}>reload: {callTime.value}</ElButton>],
      }),
    ],
  });
});