Skip to content

表单方法

动态表单实例上提供了如下方法,方便你的使用。

获取表单组件实例引用

可以通过 getFormRef 实例函数获取到内置 Form 组件的实例引用。

注意,这个 Form 取决于你使用的 Form 组件, 例如,你使用了Arco Desgin的 Form 组件,那么获取的类型就是 Arco 的 FormInstance。

默认的内置 Form 组件类型是 import { Form } from '@imengyu/vue-dynamic-form';

vue
<template>
  <DynamicForm
    ref="formRef"
    :options="formOptions"
    :model="formModel"
  />
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { FormInstance } from '@arco-design/web-vue';

//这个是外层动态表单的引用
const formRef = ref<IDynamicFormRef>();

onMounted(() => {
  //可以通过
  const form = formRef.value?.getFormRef<FormInstance>();
  //手动调用form上的validate校验表单方法
  form.validate().then((res) => {
    console.log(res); 
  }).catch((e) => {
    console.log(e);
  })
});

</script>

获取表单项组件实例引用

某些情况下,你可能需要直接操作自己的表单自定义组件。例如,你写了一个动态加载数据的下拉框,表单外部有一些条件, 要求是表单某几项参数变化时,需要重新加载下拉框的数据。

你可以通过 getFormItemControlRef 实例函数获取到指定表单项组件的实例引用,获取引用后,你就可以自由进行调用了。

下方是一个例子。他的效果是当 type 更改时,调用 my-select 去加载数据

vue
<template>
  <DynamicForm
    ref="formRef"
    :options="formOptions"
    :model="formModel"
    @ready="onReady"
  />
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { FormInstance } from '@arco-design/web-vue';
import { BaseCheckProps, BaseRadioProps, BaseSelectProps, BaseTextAreaProps, DynamicForm, IDynamicFormOptions } from '@imengyu/vue-dynamic-form';

//这个是外层动态表单的引用
const formRef = ref<IDynamicFormRef>();

const formModel = ref({
  type: 0,
  item_id: 0,
});
const formOptions : IDynamicFormOptions = {
  formRules: {},
  formLabelCol: { span: 6 },
  formWrapperCol: { span: 18 },
  formItems: [
    { 
      type: 'base-radio', label: '会员类型', name: 'type', 
      additionalProps: {
        items: [
          { label: '短期', value: 1 },
          { label: '长期', value: 2 },
          { label: '试用', value: 3 },
        ]
      } as BaseRadioProps,
    },
    {
      //my-select 是一个自定义的组件
      type: 'my-select', label: '选择套餐', name: 'item_id', 
      additionalProps: { placeholder: '请选择套餐' },
    },
  ],
};

function loadPackageSelect(newType: number) {
  //这里是写死手动判断了,实际在这里你可以去请求后端数据
  let newData = [] as IDynamicFormItemSelectValueOption[];
  switch (newType) {
    case 1:
      newData = [
        { text: '短期合作套餐', value: 0 },
        { text: '短期高级套餐', value: 1 },
      ];
      break;
    case 2:
      newData = [
        { text: '基础套餐', value: 0 },
        { text: '商业套餐', value: 1 },
        { text: '贵宾套餐', value: 2 },
      ];
      break;
    case 3:
      newData = [
        { text: '试用套餐', value: 0 },
      ];
      break;
  }
  //更改后调用实例方法,重新加载数据
  formRef.value?.getFormItemControlRef<SimpleSelectValueFormItemRef>('item_id')?.setData(newData);

  formModel.value.item_id = null;
}

//监听 type 属性的更改
watch(() => formModel.value.type, (newType) => {
  //更改后重新加载数据
  loadPackageSelect(newType);
});
function onReady() {
  //初始化的时候也加载一下数据
  loadPackageSelect(1);
}

</script>

Released under the MIT License.