vue表单多种语言录入校验

实现思路

1.首先理清数据格式,多语言和内容都是数组格式

2.所以需要有2次的for循环

提交的时候有两种方式校验

第一种:

<template>
  <div>
    <div class="main">
      <el-form ref="form" :model="form" label-width="80px" :rules="rules">

        <el-form-item label="名称" prop="name">
          <el-input v-model="form.name"></el-input>
        </el-form-item>

        <el-tabs v-model="activeName">
          <el-tab-pane v-for="(item,index) in form.list" :key="index" :label="langEum[item.lang]" :name="item.lang">
            <el-form :ref="`form${item.lang}${index}`" :model="item" label-width="80px" :rules="rules">
              <el-form-item label="标题" prop="title">
                <el-input v-model="item.title" style="width:90%"></el-input>
              </el-form-item>
              <el-form-item label="内容" v-for="(item2,index2) in item.content" :key="index2" :prop="'content.'+index2+'.value'" :rules="rules.value">
                <el-input v-model="item2.value" style="width:90%"></el-input>
                <i class="el-icon-circle-plus-outline" @click="add(item)"></i>
                <i class="el-icon-remove-outline" @click="del(item,index2)" v-if="item.content.length>1 && item.content.length -1 === index2"></i>
              </el-form-item>
            </el-form>
          </el-tab-pane>
        </el-tabs>

      </el-form>
      <el-button type="primary" @click="btn()">提交</el-button>
    </div>
  </div>
</template>

<script>
export default {
  data () {
    return {
      activeName: 'cn',
      form: {
        name: '',
        list: [
          {
            lang: 'cn',
            title: '',
            content: [
              { value: '' }
            ]
          },
          {
            lang: 'dn',
            title: '',
            content: [
              { value: '' }
            ]
          },
          {
            lang: 'en',
            title: '',
            content: [
              { value: '' }
            ]
          }
        ]
      },
      langEum: {
        cn: '中',
        dn: '英',
        en: '的'
      },
      rules: {
        name: [
          { required: true, message: '请输入名称', trigger: 'blur' }
        ],
        title: [
          { required: true, message: '请输入标题', trigger: 'blur' }
        ],
        value: [
          { required: true, message: '请输入内容', trigger: 'blur' }
        ]
      }
    }
  },
  methods: {
    btn () {
      // 定义一个变量
      let arr = true
      //校验整个的
      this.$refs['form'].validate((valid) => {
        if (!valid) {
          arr = false
        }
        // 校验单个的
        for (let i = 0; i < this.form.list.length; i++) {
          let item = this.form.list[i]
          this.$refs[`form${item.lang}${i}`][0].validate((valid) => {
            if (!valid) {
              arr = false
            }
          })
        }
        // 校验不通过
        if (!arr) {
          this.$message.error('未填写完成')
          return false
        }
        // 校验通过
        if (arr) {
          console.log('成功');
        }
      })
    },
    add (item) {
      item.content.push({ value: '' })
    },
    del (item, index2) {
      item.content.splice(index2, 1)
    }
  }
}
</script>

<style lang="less" scoped>
.main {
  width: 1080px;
  margin: 0 auto;
  border: 1px solid black;
  padding: 20px;
}
</style>

 第二种

<template>
  <div>
    <div class="main">
      <el-form ref="form" :model="form" label-width="80px" :rules="rules">

        <el-form-item label="名称" prop="name">
          <el-input v-model="form.name"></el-input>
        </el-form-item>

        <el-tabs v-model="activeName">
          <el-tab-pane v-for="(item,index) in form.list" :key="index" :label="langEum[item.lang]" :name="item.lang">
            <el-form :ref="`form${item.lang}${index}`" :model="item" label-width="80px" :rules="rules">
              <el-form-item label="标题" prop="title">
                <el-input v-model="item.title" style="width:90%"></el-input>
              </el-form-item>
              <el-form-item label="内容" v-for="(item2,index2) in item.content" :key="index2" :prop="'content.'+index2+'.value'" :rules="rules.value">
                <el-input v-model="item2.value" style="width:90%"></el-input>
                <i class="el-icon-circle-plus-outline" @click="add(item)"></i>
                <i class="el-icon-remove-outline" @click="del(item,index2)" v-if="item.content.length>1 && item.content.length -1 === index2"></i>
              </el-form-item>
            </el-form>
          </el-tab-pane>
        </el-tabs>

      </el-form>
      <el-button type="primary" @click="btn()">提交</el-button>
    </div>
  </div>
</template>

<script>
export default {
  data () {
    return {
      activeName: 'cn',
      form: {
        name: '',
        list: [
          {
            lang: 'cn',
            title: '',
            content: [
              { value: '' }
            ]
          },
          {
            lang: 'dn',
            title: '',
            content: [
              { value: '' }
            ]
          },
          {
            lang: 'en',
            title: '',
            content: [
              { value: '' }
            ]
          }
        ]
      },
      langEum: {
        cn: '中',
        dn: '英',
        en: '的'
      },
      rules: {
        name: [
          { required: true, message: '请输入名称', trigger: 'blur' }
        ],
        title: [
          { required: true, message: '请输入标题', trigger: 'blur' }
        ],
        value: [
          { required: true, message: '请输入内容', trigger: 'blur' }
        ]
      }
    }
  },
  methods: {
    btn () {
      this.$refs['form'].validate(async (valid) => {
        // 校验单个的
        let arr = []
        for (let i = 0; i < this.form.list.length; i++) {
          let item = this.form.list[i]
          try {
            await this.$refs[`form${item.lang}${i}`][0].validate()
            arr.push(true)
          } catch (error) {
            arr.push(false)
          }
        }
        // 判断校验是否都成功,有一项不成功就是false
        let falg = arr.every(item => item)
        // 校验不成功
        if (!valid || !falg) {
          this.$message.error('未填写')
        }
        // 校验成功
        if (valid && falg) {
          this.$message.success('成功')
          console.log(this.form);
        }
      })
    },
    add (item) {
      item.content.push({ value: '' })
    },
    del (item, index2) {
      item.content.splice(index2, 1)
    }
  }
}
</script>

<style lang="less" scoped>
.main {
  width: 1080px;
  margin: 0 auto;
  border: 1px solid black;
  padding: 20px;
}
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学不会•

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值