当前位置:   article > 正文

vue3动态切换表单校验_vue3 vue-i18n表单验证切换

vue3 vue-i18n表单验证切换

在项目中,通常会有切换表单需求,然后会遇到切换后表单校验会被触发的问题

第一种方法,使用template包含el-form+v-if区分,缺点是el-form会被定义两次,表单model也会多次被定义及使用,后续维护会较难。

  1. <template>
  2. <el-row style="margin-left: 20px">
  3. <el-radio-group v-model="type" @change="onChangeType">
  4. <el-radio :label="1">表单一</el-radio>
  5. <el-radio :label="2">表单二</el-radio>
  6. </el-radio-group>
  7. </el-row>
  8. <template v-if="type === 1">
  9. <el-form :model="formOne" :rules="rulesOne" ref="formOneRef" label-width="90px">
  10. ....
  11. </el-form>
  12. </template>
  13. <template v-else>
  14. <el-form :model="formTwo" :rules="rulesTwo" ref="formTwoRef" label-width="90px">
  15. ....
  16. </el-form>
  17. </template>
  18. </template>
  19. <script setup>
  20. import { ref, reactive, toRefs, getCurrentInstance } from "vue";
  21. const { proxy } = getCurrentInstance();
  22. const type = ref(1);
  23. const data = reactive({
  24. formOne: {},
  25. formTwo: {},
  26. rulesOne: {},
  27. rulesTwo: {}
  28. });
  29. const { formOne, formTwo, rulesOne, rulesTwo } = toRefs(data);
  30. function onChangeType() {
  31. // vue3 不推荐使用proxy代替this,另一种方法定义ref,使用ref.value.resetFields() 触发
  32. proxy.$refs['formOneRef'].resetFields();
  33. proxy.$refs['formTwoRef'].resetFields();
  34. }
  35. </script>

第二种方法,使用el-form包含template+v-if区分,推荐使用这种,减少代码冗余,并且也利于维护

  1. <template>
  2. <el-row style="margin-left: 20px">
  3. <el-radio-group v-model="type" @change="onChangeType">
  4. <el-radio :label="1">表单一</el-radio>
  5. <el-radio :label="2">表单二</el-radio>
  6. </el-radio-group>
  7. </el-row>
  8. <el-form :model="form" :rules="{ 1: rulesOne, 2: rulesTwo }[type]" ref="formRef">
  9. <template v-if="type === 1">
  10. ...
  11. </template>
  12. <template v-else>
  13. ...
  14. </template>
  15. </el-form>
  16. </template>
  17. <script setup>
  18. import { ref, reactive, toRefs, getCurrentInstance } from "vue";
  19. const { proxy } = getCurrentInstance();
  20. const type = ref(1);
  21. const data = reactive({
  22. form: {},
  23. rulesOne: {},
  24. rulesTwo: {}
  25. });
  26. const { formOne, formTwo, rulesOne, rulesTwo } = toRefs(data);
  27. function onChangeType() {
  28. // vue3 不推荐使用proxy代替this,另一种方法定义ref,使用ref.value.resetFields() 触发
  29. proxy.$refs['formRef'].resetFields();
  30. }
  31. </script>

 但是很抱歉,第二种方法依然会触发校验,因为vnode没有变,v-if执行后还是上一个vnode,所以需要添加key来区分,也就是

  1. <el-form :key="type" :model="form" :rules="{ 1: rulesOne, 2: rulesTwo }[type]" ref="formRef">
  2. </el-form>

这样的话,就可以取消主动校验了。

 再补充两点

1、名称后台请求检验,需要注意的是,校验时要考虑是新增状态,还是编辑状态

  1. const validateNameRepate = async (rule, value, callback) => {
  2. if (value) {
  3. await validNameUnique({ name: value })
  4. .then((res) => {
  5. if (res?.code === 200) {
  6. const { data = 0 } = res;
  7. if (data === 0) callback();
  8. if (data === 1) callback(new Error("名称已存在"));
  9. }
  10. })
  11. .catch((e) => {
  12. callback(new Error(e));
  13. });
  14. }
  15. };
  16. const data = reactive({
  17. rules: {
  18. name: [
  19. { required: true, message: "名称不能为空", trigger: ["blur", "change"] },
  20. {
  21. min: 2,
  22. max: 20,
  23. message: "名称长度必须介于 2 和 20 之间",
  24. trigger: ["blur", "change"],
  25. },
  26. {
  27. validator: validateNameRepate,
  28. trigger: "blur",
  29. },
  30. ],
  31. },
  32. });

2、el-form-item使用v-if动态校验,需要使用el-form-item 的属性rules来单独定义校验,切换时校验才不会主动触发

  1. <el-form-item v-if="type === '1'" label="测试" prop="test" :rules="[{ required: true, message: '不能为空', trigger: 'change' } ]">
  2. <el-select v-model="missSat" placeholder="请选择" multiple clearable collapse-tags collapse-tags-tooltip>
  3. <el-option v-for="item in list" :key="item.id" :label="item.name" :value="item.id" />
  4. </el-select>
  5. </el-form-item>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/438268
推荐阅读
相关标签
  

闽ICP备14008679号