javascript - element ui 表单验证不起作用

查看:140
本文介绍了javascript - element ui 表单验证不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

<template>
  <!-- 编辑模板代码 -->
  <div>
    <el-form ref="productForm" v-bind:rules="productRules" v-bind:model="productModel" label-width="80px" style="width: 80%">
      <el-form-item label="产品名称" prop="productName">
        <el-input type="text" auto-complete="off" v-model="productModel.product.name" placeholder="请输入产品名称"></el-input>
      </el-form-item>
      <el-form-item label="产品描述" prop="description">
        <el-input type="textarea" v-model="productModel.product.description" placeholder="请输入产品描述"></el-input>
      </el-form-item>
      <el-form-item label="产品类型" prop="sub_type">
        <el-select v-model="productModel.product.sub_type" placeholder="请选择产品类型">
          <el-option label="普通产品" value="1"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="产品分类" prop="category_id">
        <el-select v-model="productModel.product.category_id" placeholder="请选择产品分类">
          <el-option v-for="item in categoryList" v-bind:key="item.value" v-bind:label="item.label" v-bind:value="item.value"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="产品品牌" prop="trademark_id">
        <el-select v-model="productModel.product.trademark_id" placeholder="请选择产品品牌">
          <el-option v-for="item in trademarkList" v-bind:key="item.value" v-bind:label="item.label" v-bind:value="item.value"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="产品原价" prop="price">
        <el-input  v-model.number="productModel.product.price" placeholder="请输入产品原价"></el-input>
      </el-form-item>
      <el-form-item label="产品价格" prop="pay_price">
        <el-input  v-model.number="productModel.product.pay_price" placeholder="请输入产品价格"></el-input>
      </el-form-item>
      <el-form-item label="是否包邮" prop="pinkage">
        <el-switch on-text="" off-text="" v-model="productModel.product.pinkage"></el-switch>
      </el-form-item>
      <el-form-item label="是否可用" prop="enabled">
        <el-switch on-text="" off-text="" v-model="productModel.product.enabled"></el-switch>
      </el-form-item>
      <el-form-item label="是否有货" prop="stock">
        <el-switch on-text="" off-text="" v-model="productModel.product.stock"></el-switch>
      </el-form-item>
      <el-form-item label="特殊规格" prop="use_std">
        <el-switch on-text="" off-text="" v-model="productModel.product.use_std"></el-switch>
      </el-form-item>
      <el-form-item v-show="productModel.product.use_std">
        <el-button type="primary" v-on:click="addStandard"><i class="el-icon-plus"></i> 添加规格</el-button>
        <el-table border v-bind:data="productModel.stds" style="width: 100%; margin-top: 10px">
          <el-table-column label="类型">
            <template scope="scope">
              <template v-if="scope.row.type === '1'">尺码</template>
              <template v-else-if="scope.row.type === '2'">型号</template>
              <template v-else-if="scope.row.type === '3'">规格</template>
              <template v-else-if="scope.row.type === '4'">颜色</template>
            </template>
          </el-table-column>
          <el-table-column prop="name" label="名称"></el-table-column>
          <el-table-column label="是否有货">
            <template scope="scope">
              <template v-if="scope.row.stock === true">
                <i class="el-icon-check"></i>
              </template>
              <template v-else>
                <i class="el-icon-close"></i>
              </template>
            </template>
          </el-table-column>
          <el-table-column prop="remark" label="备注"></el-table-column>
        </el-table>
      </el-form-item>
      <el-form-item label="新增产品参数" prop="use_property">
        <el-switch on-text="" off-text="" v-model="productModel.product.use_property"></el-switch>
      </el-form-item>
      <el-form-item v-show="productModel.product.use_property">
        <el-button type="primary" v-on:click="addProperty"><i class="el-icon-plus"></i> 添加参数</el-button>
        <el-table border v-bind:data="productModel.properties" style="width: 100%; margin-top: 10px">
          <el-table-column prop="name" label="名称"></el-table-column>
          <el-table-column prop="content" label="内容"></el-table-column>
        </el-table>
      </el-form-item>
      <el-form-item label="封面图">
        <el-upload
          class="upload-demo"
          action="https://jsonplaceholder.typicode.com/posts/"
          :file-list="coverImgList"
          list-type="picture">
          <el-button size="small" type="primary">点击上传</el-button>
          <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
        </el-upload>
      </el-form-item>
      <el-form-item label="描述图">
        <el-upload
          class="upload-demo"
          action="https://jsonplaceholder.typicode.com/posts/"
          :file-list="coverImgList"
          list-type="picture">
          <el-button size="small" type="primary">点击上传</el-button>
          <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
        </el-upload>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" v-on:click="submitProductForm">立即创建</el-button>
      </el-form-item>
    </el-form>
    <el-dialog title="新增规格" v-bind:visible.sync="addStandardDialogFormVisible">
      <el-form v-bind:model="standard" v-bind:rules="standardRules">
        <el-form-item label="规格类型" prop="type" label-width="120px">
          <el-select v-model="standard.type" placeholder="请选择规格类型">
            <el-option label="尺码" value="1"></el-option>
            <el-option label="型号" value="2"></el-option>
            <el-option label="规格" value="3"></el-option>
            <el-option label="颜色" value="4"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="规格名称" prop="name" label-width="120px">
          <el-input type="text" v-model="standard.name" auto-complete="off" placeholder="请输入规格名称"></el-input>
        </el-form-item>
        <el-form-item label="规格备注" prop="remark" label-width="120px">
          <el-input type="text" v-model="standard.remark" auto-complete="off" placeholder="请输入规格备注"></el-input>
        </el-form-item>
        <el-form-item label="是否有货" prop="stock" label-width="120px">
          <el-switch on-text="" off-text="" v-model="standard.stock"></el-switch>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button v-on:click="addStandardDialogFormVisible = false">取 消</el-button>
        <el-button type="primary" v-on:click="confirmAddStandard">确 定</el-button>
      </div>
    </el-dialog>
    <el-dialog title="新增产品参数" v-bind:visible.sync="addPropertyDialogFormVisible">
      <el-form v-bind:model="property" v-bind:rules="propertyRules">
        <el-form-item label="参数名" prop="name" label-width="120px">
          <el-input type="text" v-model="property.name" auto-complete="off" placeholder="请输入参数名"></el-input>
        </el-form-item>
        <el-form-item label="参数值" prop="content" label-width="120px">
          <el-input type="text" v-model="property.content" auto-complete="off" placeholder="请输入参数值"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button v-on:click="addPropertyDialogFormVisible = false">取 消</el-button>
        <el-button type="primary" v-on:click="confirmAddProperty">确 定</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
  /* 再此定义JS,采用ES6标准格式 */
  export default {
    name: 'Add',
    data () {
      return {
        addStandardDialogFormVisible: false,
        standard: {
          type: null,
          name: '',
          stock: true,
          remark: ''
        },
        standardRules: {
          type: [
            {
              required: true,
              message: '规格类型不能为空',
              trigger: 'blur'
            }
          ],
          name: [
            {
              required: true,
              message: '规格名称不能为空',
              trigger: 'blur'
            }
          ]
        },
        property: {
          name: '',
          content: ''
        },
        addPropertyDialogFormVisible: false,
        propertyRules: {
          name: [
            {
              required: true,
              message: '参数名不能为空',
              trigger: 'blur'
            }
          ],
          content: [
            {
              required: true,
              message: '参数值不能为空',
              trigger: 'blur'
            }
          ]
        },
        productRules: {
          productName: [
            { required: true, message: '商品名称不能为空', trigger: 'blur' },
            { min: 2, max: 22, message: '长度在2到22个字符', trigger: 'blur' }
          ],
          sub_type: [
            {
              required: true,
              message: '类型不能为空',
              trigger: 'blur'
            }
          ],
          category_id: [
            {
              required: true,
              message: '分类不能为空',
              trigger: 'blur'
            }
          ],
          trademark_id: [
            {
              required: true,
              message: '品牌不能为空',
              trigger: 'blur'
            }
          ],
          price: [
            {
              required: true,
              message: '原价不能为空',
              trigger: 'blur'
            }
          ],
          pay_price: [
            {
              required: true,
              message: '价格不能为空',
              trigger: 'blur'
            }
          ]
        },
        // 产品模型
        productModel: {
          // 产品基本信息
          product: {
            name: '',
            description: '',
            type: null,
            sub_type: null,
            price: null,
            pay_price: null,
            face_url: '',
            pinkage: true,
            enabled: true,
            stock: true,
            use_stock: true,
            size: 0,
            use_size: false,
            multi_cover: false,
            use_std: false,
            use_std_price: false,
            multi_intro: false,
            use_property: false,
            category_id: 1,
            trademark_id: 0
          },
          // 产品图片信息
          productPics: [],
          // 产品属性信息
          properties: [],
          // 产品规格信息
          stds: [],
          // 是否更新过图片
          updatePic: true,
          // 是否更新过属性
          updateProperty: true,
          // 是否更新过规格
          updateStd: true
        },
        // 分类数据
        categoryList: [
          {
            value: 1,
            label: '无分类'
          }
        ],
        // 商品品牌
        trademarkList: [
          {
            value: 0,
            label: '无品牌'
          }
        ],
        // 封面图片
        coverImgList: [
          {
            name: 'food.jpeg',
            url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'
          },
          {
            name: 'food2.jpeg',
            url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'
          }
        ],
        introImgList: [
          {
            name: 'food.jpeg',
            url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'
          },
          {
            name: 'food2.jpeg',
            url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'
          }
        ]
      }
    },
    methods: {
      addStandard: function () {
        this.addStandardDialogFormVisible = true
      },
      confirmAddStandard: function () {
        var vue = this
        let flag = false
        for (let i in vue.productModel.stds) {
          let std = vue.productModel.stds[i]
          if (std.name === vue.standard.name && std.type === vue.standard.type) {
            flag = true
            break
          }
        }
        if (flag) {
          vue.$message({
            showClose: true,
            message: '该规格已经存在',
            type: 'warning'
          })
          return
        }
        vue.productModel.stds.push({
          type: vue.standard.type,
          name: vue.standard.name,
          stock: vue.standard.stock,
          remark: vue.standard.remark
        })
        vue.addStandardDialogFormVisible = false
      },
      addProperty: function () {
        var vue = this
        vue.addPropertyDialogFormVisible = true
      },
      confirmAddProperty: function () {
        var vue = this
        let flag = false
        for (let i in vue.productModel.properties) {
          let property = vue.productModel.properties[i]
          if (property.name === vue.property.name) {
            flag = true
            break
          }
        }
        if (flag) {
          vue.$message({
            showClose: true,
            message: '该属性已经存在',
            type: 'warning'
          })
          return
        }
        vue.productModel.properties.push({
          name: vue.property.name,
          content: vue.property.content
        })
        console.log(vue.productModel.properties)
        vue.addPropertyDialogFormVisible = false
      },
      submitProductForm () {
        console.log('submitProductForm!')
      }
    }
  }
</script>
<style scoped>
  /* 在此定义当前页面css */

</style>

贴上全部代码
明明已经输入了,但是离开该焦点,还是提示不能为空

解决方案

<el-form-item label="产品名称" prop="productName">
   <el-input type="text" auto-complete="off" v-model="productModel.productName"         placeholder="请输入产品名称"></el-input>
</el-form-item>
  
  data()--->productName: '',
  

我把v-model改成这样就正常了,可能是prop内容和你下面的v-model不一样造成的

这篇关于javascript - element ui 表单验证不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆