本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

element-ui 动态添加校验

发布于2021-11-20 17:10     阅读(1154)     评论(0)     点赞(20)     收藏(3)


这个功能为当一个下拉菜单选中某个值,确定另一个下拉框是否拥有校验规则

如图

 此时活动区域未选择值,所以测试这个下拉菜单不需要有校验

 此时活动区域选择区域一,测试拥有校验规则,非空校验

  1. <template>
  2. <div id="app">
  3. <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
  4. <el-form-item label="活动名称" prop="name">
  5. <el-input v-model="ruleForm.name"></el-input>
  6. </el-form-item>
  7. <el-form-item label="活动区域" prop="region">
  8. <el-select v-model="ruleForm.region" placeholder="请选择活动区域" @change="isRules(ruleForm.region)">
  9. <el-option label="区域一" value="1"></el-option>
  10. <el-option label="区域二" value="2"></el-option>
  11. </el-select>
  12. </el-form-item>
  13. <!-- 测试 -->
  14. <el-form-item label="测试" prop="test">
  15. <el-select v-model="ruleForm.test" placeholder="请选择活动区域">
  16. <el-option label="区域一" value="shanghai"></el-option>
  17. <el-option label="区域二" value="beijing"></el-option>
  18. </el-select>
  19. </el-form-item>
  20. <el-form-item label="活动时间" required>
  21. <el-col :span="11">
  22. <el-form-item prop="date1">
  23. <el-date-picker type="date" placeholder="选择日期" v-model="ruleForm.date1" style="width: 100%;"></el-date-picker>
  24. </el-form-item>
  25. </el-col>
  26. <el-col class="line" :span="2">-</el-col>
  27. <el-col :span="11">
  28. <el-form-item prop="date2">
  29. <el-time-picker placeholder="选择时间" v-model="ruleForm.date2" style="width: 100%;"></el-time-picker>
  30. </el-form-item>
  31. </el-col>
  32. </el-form-item>
  33. <el-form-item label="即时配送" prop="delivery">
  34. <el-switch v-model="ruleForm.delivery"></el-switch>
  35. </el-form-item>
  36. <el-form-item label="活动性质" prop="type">
  37. <el-checkbox-group v-model="ruleForm.type">
  38. <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
  39. <el-checkbox label="地推活动" name="type"></el-checkbox>
  40. <el-checkbox label="线下主题活动" name="type"></el-checkbox>
  41. <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
  42. </el-checkbox-group>
  43. </el-form-item>
  44. <el-form-item label="特殊资源" prop="resource">
  45. <el-radio-group v-model="ruleForm.resource">
  46. <el-radio label="线上品牌商赞助"></el-radio>
  47. <el-radio label="线下场地免费"></el-radio>
  48. </el-radio-group>
  49. </el-form-item>
  50. <el-form-item label="活动形式" prop="desc">
  51. <el-input type="textarea" v-model="ruleForm.desc"></el-input>
  52. </el-form-item>
  53. <el-form-item>
  54. <el-button type="primary" @click="submitForm('ruleForm')">立即创建</el-button>
  55. <el-button @click="resetForm('ruleForm')">重置</el-button>
  56. </el-form-item>
  57. </el-form>
  58. </div>
  59. </template>
  60. <script>
  61. export default {
  62. data() {
  63. return {
  64. ruleForm: {
  65. name: '',
  66. region: '',
  67. date1: '',
  68. date2: '',
  69. delivery: false,
  70. type: [],
  71. resource: '',
  72. desc: ''
  73. },
  74. rules: {
  75. name: [
  76. { required: true, message: '请输入活动名称', trigger: 'blur' },
  77. { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
  78. ],
  79. region: [
  80. { required: true, message: '请选择活动区域', trigger: 'change' }
  81. ],
  82. date1: [
  83. { type: 'date', required: true, message: '请选择日期', trigger: 'change' }
  84. ],
  85. date2: [
  86. { type: 'date', required: true, message: '请选择时间', trigger: 'change' }
  87. ],
  88. type: [
  89. { type: 'array', required: true, message: '请至少选择一个活动性质', trigger: 'change' }
  90. ],
  91. resource: [
  92. { required: true, message: '请选择活动资源', trigger: 'change' }
  93. ],
  94. desc: [
  95. { required: true, message: '请填写活动形式', trigger: 'blur' }
  96. ]
  97. }
  98. };
  99. },
  100. methods: {
  101. isRules(val) {
  102. if(val === '1') {
  103. this.rules.test = [
  104. { required: true, message: '请选择测试', trigger: 'change' }
  105. ]
  106. this.rules = JSON.parse(JSON.stringify(this.rules))
  107. } else {
  108. this.rules.test = null
  109. this.rules = JSON.parse(JSON.stringify(this.rules))
  110. }
  111. },
  112. submitForm(formName) {
  113. this.$refs[formName].validate((valid) => {
  114. if (valid) {
  115. alert('submit!');
  116. } else {
  117. console.log('error submit!!');
  118. return false;
  119. }
  120. });
  121. },
  122. resetForm(formName) {
  123. this.$refs[formName].resetFields();
  124. }
  125. }
  126. }
  127. </script>

想要动态添加校验规则

  1. this.rules.test = [
  2.             { requiredtruemessage'请选择测试'trigger'change' }
  3.           ]
  4.           this.rules = JSON.parse(JSON.stringify(this.rules))

 this.rules = JSON.parse(JSON.stringify(this.rules))必须这样或者用扩展运算符进行重新赋值,才能添加到规则里,并且展示出来,直接将校验规则添加进去,是不会被直接渲染出来的

但是这么写,你会发现,当选完区域一后,会直接触发类似于兜底验证

如图

 会把其他的校验都给触发了,所以可能你会想到在这些代码后直接使用element-UI自带的this.$refs[formName].clearValidate();

但是你会发现并不起效果

所以这时候就需要vue中的$nextTick上场了

  1. this.$nextTick(() => {
  2. this.$refs.ruleForm.clearValidate();
  3. })

$nextTick大家应该都理解这个的作用, 大概就是内的代码会在当下一次DOM循环的时候执行

此时就解决了这个问题

原文链接:https://blog.csdn.net/m0_57482145/article/details/121396624




所属网站分类: 技术文章 > 博客

作者:Jjxj

链接:http://www.qianduanheidong.com/blog/article/237568/2867468816690f9255a6/

来源:前端黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

20 0
收藏该文
已收藏

评论内容:(最多支持255个字符)