el-form表单中不同数据类型对应的时间格式化和校验规则

35 篇文章 1 订阅
29 篇文章 0 订阅

 1. 在表单中, 当选择不同的数据类型时, 需要在下面选择时间时和数据类型对应上, 通过监听数据类型的变化, 给时间做格式化,

2. 但是当不按顺序选择数据类型后, 再选时间可能会报错, 所以需要在dom更新后, 再清空表单.

3. 校验规则, 结束时间需要大于开始时间, 但是不能选当前的时间, 所以需要转换时间戳.

 

 

 <el-form
        ref="formRef1"
        :model="form1"
        :rules="rules1"
        label-width="110px"
        :inline="true"
        class="demo-form-inline"
      >

        <el-form-item label="数据类型" prop="type">
          <el-select v-model="form1.type" placeholder="请选择">
            <el-option
              v-for="item in dataList"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="开始时间" prop="startTime">
          <el-date-picker
            ref="startTimePickerRef"
            v-model="form1.startTime"
            :type="dateType"
            :format="timeFormat"
            :value-format="timeFormat"
            placeholder="开始时间"
          >
          </el-date-picker>
        </el-form-item>
        <el-form-item label="结束时间" prop="endTime">
          <el-date-picker
            ref="endTimePickerRef"
            v-model="form1.endTime"
            :type="dateType"
            :format="timeFormat"
            :value-format="timeFormat"
            placeholder="结束时间"
          >
          </el-date-picker>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="resetForm('formRef1')">取 消</el-button>
        <el-button type="primary" @click="submitData('formRef1', 1)">生成数据</el-button>
      </span>
    </el-dialog>
<script>
import moment from "moment";

export default {
 
  data() {
    var checkTime = (rule, value, callback) => {
      // console.log(value, "---value---"); // value 是endTime

      // 获取开始时间和结束时间的时间戳
      const startTime = moment(this.form1.startTime).format("yyyy-MM-DD HH:mm:ss");
      const endTime = moment(value).format("yyyy-MM-DD HH:mm:ss");

      const startTimeStamp = new Date(startTime).getTime();
      const endTimeStamp = new Date(endTime).getTime();

      if (this.form1.type === "2") {
        // 小时数据,不能大于等于当前小时
        const currentDate = new Date(); // 获取当前日期和时间
        currentDate.setMinutes(0, 0, 0); // 将分钟、秒、毫秒都设置为0,表示0分0秒
        const currentHourTimeStamp = currentDate.getTime(); // 获取当前小时时间戳

        if (endTimeStamp < startTimeStamp) {
          callback(new Error("结束时间应该大于或等于开始时间"));
        } else if (endTimeStamp >= currentHourTimeStamp) {
          callback(new Error("结束时间应该早于当前时间"));
        } else {
          callback();
        }
      } else if (this.form1.type === "3" || this.form1.type === "4") {
        // 日数据或周数据,不能大于等于当日
        const currentDateTimeStamp = new Date().setHours(0, 0, 0, 0); //将小时、分钟、秒和毫秒设置为0

        if (endTimeStamp < startTimeStamp) {
          callback(new Error("结束时间应该大于或等于开始时间"));
        } else if (endTimeStamp >= currentDateTimeStamp) {
          callback(new Error("结束时间应该早于当前时间"));
        } else {
          callback();
        }
      } else if (this.form1.type === "5") {
        // 月数据,不能大于等于当月
        const currentDate = new Date();
        currentDate.setDate(1); // 将日期设置为1,表示当前月的第一天
        currentDate.setHours(0, 0, 0, 0); // 将小时、分钟、秒、毫秒都设置为0,表示0点0分0秒
        const firstDayOfMonthTimestamp = currentDate.getTime(); // 获取时间戳

        if (endTimeStamp < startTimeStamp) {
          callback(new Error("结束时间应该大于或等于开始时间"));
        } else if (endTimeStamp >= firstDayOfMonthTimestamp) {
          callback(new Error("结束时间应该早于当前月"));
        } else {
          callback();
        }
      } else {
        // 分钟数据,不能大于等于当前分钟
        const currentDate = new Date(); // 获取当前日期和时间
        currentDate.setMinutes(0, 0); // 将秒、毫秒都设置为0,表示0分0秒
        const currentMinTimeStamp = currentDate.getTime(); // 获取时间戳

        if (endTimeStamp < startTimeStamp) {
          callback(new Error("结束时间应该大于或等于开始时间"));
        } else if (endTimeStamp >= currentMinTimeStamp) {
          callback(new Error("结束时间应该早于当前时间"));
        } else {
          callback();
        }
      }
    };
    return {
  
      form1: {
        stationCodes: [], // 数据生成配置里可多选
        type: "", // 数据类型
        startTime: "",
        endTime: "",
        precisionNum: null, // 精确位数
        remark: "", // 备注
      },

      // 数据类型
      dataList: [
        // {
        //   label: "分钟数据",
        //   value: "1",
        // },
        {
          label: "小时数据",
          value: "2",
        },
        {
          label: "日数据",
          value: "3",
        },
        {
          label: "周数据",
          value: "4",
        },
        {
          label: "月数据",
          value: "5",
        },
      ],
      dateType: "date", // 时间类型
      timeFormat: "", // 默认时间格式
     
      rules1: {
        type: [{ required: true, message: "请选择数据类型", trigger: "change" }],
        startTime: [
          {
            required: true,
            message: "请选择开始时间",
            trigger: "blur",
          },
        ],
        endTime: [
          {
            required: true,
            message: "请选择结束时间",
            trigger: "blur",
          },
          {
            validator: checkTime,
            trigger: "blur",
          },
        ],
    };
  },

  watch: {

    "form1.type": function (newType) {
      if (newType === "1") {
        // 设置时间格式为分钟
        this.dateType = "datetime";
        this.timeFormat = "yyyy-MM-dd HH:mm";
      } else if (newType === "2") {
        // 设置时间格式为小时
        this.dateType = "datetime";
        this.timeFormat = "yyyy-MM-dd HH";
      } else if (newType === "3") {
        // 设置时间格式为日期
        this.dateType = "date";
        this.timeFormat = "yyyy-MM-dd";
      } else if (newType === "4") {
        // 设置时间格式为周,这里周德格式后台要求还显示日的
        this.dateType = "date";
        this.timeFormat = "yyyy-MM-dd";
      } else if (newType === "5") {
        // 设置时间格式为月份
        this.dateType = "month";
        this.timeFormat = "yyyy-MM";
      }
      // 更新值和格式,如果不按顺序选择类型的话可能会报错,所以dom更新后清空
      this.$nextTick(() => {
        this.form1.startTime = "";
        this.form1.endTime = "";
        if (this.$refs.startTimePickerRef) {
          this.$refs.startTimePickerRef.$el.querySelector("input").value = "";
        }
        if (this.$refs.endTimePickerRef) {
          this.$refs.endTimePickerRef.$el.querySelector("input").value = "";
        }
      });
    },
  },

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
el-form 表单组件可以使用 `rules` 属性来添加校验规则,具体步骤如下: 1. 在表单控件上添加 `prop` 属性,该属性的值对应表单数据对象的属性。 2. 在 el-form 上添加 `rules` 属性,该属性的值是一个对象,对象的 key 是对应表单控件的 prop 值,value 是一个数组,数组包含校验规则。 3. 在表单控件上添加 `v-model` 属性,该属性的值对应表单数据对象的属性。 例如,在一个登录表单,需要对用户名和密码进行校验,可以这样写: ```html <template> <el-form :model="loginForm" :rules="loginRules"> <el-form-item label="用户名" prop="username"> <el-input v-model="loginForm.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input type="password" v-model="loginForm.password"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm">登录</el-button> </el-form-item> </el-form> </template> <script> export default { data() { return { loginForm: { username: '', password: '', }, loginRules: { username: [ { required: true, message: '请输入用户名', trigger: 'blur' }, { min: 3, max: 10, message: '长度在 3 到 10 个字符', trigger: 'blur' }, ], password: [ { required: true, message: '请输入密码', trigger: 'blur' }, { min: 6, max: 20, message: '长度在 6 到 20 个字符', trigger: 'blur' }, ], }, }; }, methods: { submitForm() { this.$refs.loginForm.validate((valid) => { if (valid) { // 表单校验通过,可以提交表单 console.log(this.loginForm); } else { // 表单校验未通过,不可以提交表单 return false; } }); }, }, }; </script> ``` 在这个例子,我们使用了两个 el-form-item 组件来包含用户名和密码的输入框,分别对应 loginForm 对象的 username 和 password 属性。在 el-form 上设置了 loginRules 对象来指定校验规则,其 username 和 password 分别指定了两个校验规则。在 submitForm 方法,我们使用了 `$refs` 来获取表单组件,并调用了 validate 方法来进行表单校验。`validate` 方法的回调函数,如果校验通过,则会返回 `true`,否则会返回 `false`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值