Skip to content

需求背景

  • 需要使用动态增加和删除表单来动态添加游戏应用,动态表单中需要动态绑定ref,写rule来对表单内容校验

解决方法

js

  <div v-for="form, formidx in state.game_apps">
    <el-form :ref="el => formRefs[formidx] = el" label-position="right" label-width="150px" :model="form"
      :rules="rules">
      <el-form-item label="应用名称" prop="game_app_name">
      </el-form-item>
    </el-form>
  </div>

  const rules = {
    game_app_name: [{ required: true, message: '请输入应用名称', trigger: 'blur' }],
  };
  const formRefs: Ref<any>[] = [];
  const validate = async () => {
    const results = await Promise.all(formRefs.filter(Boolean).map(formRef => formRef?.validate()));
    return results.every(result => result);
  };

:ref="el => formRefs[formidx] = el"的作用是什么,可以写成:ref=" formRefs[formidx]l"吗

一、:ref="el => formRefs[formidx] = el" 的作用**

这段代码的作用是动态地将每个 el-form 组件的实例引用存储到 formRefs 数组的对应索引位置中。

  • el:是当前 el-form 组件的实例。
  • formRefs[formidx] = el:将当前 el-form 的实例存储到 formRefs 数组的 formidx 索引位置。

这种写法适用于动态生成的表单(如通过 v-for 渲染的表单),因为 formidx 是动态的索引,能够确保每个表单实例都存储在正确的位置。

二、是否可以写成 :ref="formRefs[formidx]"?

不可以,原因如下:

ref 属性的工作机制: ref 的值需要是一个字符串(Vue 2)或一个函数(Vue 3)。 如果直接写成 :ref="formRefs[formidx]",Vue 会尝试将 formRefs[formidx] 的值作为 ref 的目标,而不是将组件实例赋值给 formRefs[formidx]。 动态索引的需求:

在动态生成的表单中,formidx 是一个动态的索引,必须通过函数的方式将实例存储到正确的索引位置。 如果直接写成 :ref="formRefs[formidx]",无法动态地将实例存储到数组的对应位置。

总结

  • 动态表单:必须使用:ref="el => formRefs[formidx] = el"的写法,确保每个表单实例都存储在 formRefs 数组的正确位置。
  • 静态表单:如果表单是静态的,可以直接使用字符串形式的 ref,例如 ref="formRef"。