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

这篇具有很好参考价值的文章主要介绍了el-form表单中不同数据类型对应的时间格式化和校验规则。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

el-form表单中不同数据类型对应的时间格式化和校验规则,vue,web前端,JS,vue.js,elementui,javascript

el-form表单中不同数据类型对应的时间格式化和校验规则,vue,web前端,JS,vue.js,elementui,javascript

 el-form表单中不同数据类型对应的时间格式化和校验规则,vue,web前端,JS,vue.js,elementui,javascript

 el-form表单中不同数据类型对应的时间格式化和校验规则,vue,web前端,JS,vue.js,elementui,javascript文章来源地址https://www.toymoban.com/news/detail-699567.html

 <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 = "";
        }
      });
    },
  },

到了这里,关于el-form表单中不同数据类型对应的时间格式化和校验规则的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (vue)el-form表单隐藏校验星号

    写法:

    2024年02月08日
    浏览(32)
  • 封装通用el-form表单(2种方式)

              项目地址:git clone form-demo: 封装通用el-form         一个后台管理系统最常见的是 表单 ,表单最常见的是 输入框、下拉选择、日期选择、单选、复选框 等等, 系统添加若干模块,就复制粘贴若干个 el-form、el-form-item ,有一说一,完成需求快是快,但是代码冗

    2024年02月09日
    浏览(28)
  • vue3使用el-form实现登录、注册功能,且进行表单验证(Element Plus中的el-form)

    简介:Element Plus 中的 el-form 是一个表单组件,用于快速构建表单并进行数据校验。它提供了丰富的表单元素和验证规则,使表单开发变得更加简单和高效。可以搭配el-dialog实现当前页面的登录、注册页 ,这两天在vue3中用到了表单登录,特意记录一下,这里没有封装,直接使

    2024年02月07日
    浏览(43)
  • el-form表单el-form-item prop一次验证两个值

    1.表单添加两个框,prop写上 2.data里写,验证规则添加validator: this.validateFields 3.validateFields设置

    2024年02月10日
    浏览(32)
  • vue实现多个el-form表单提交统一校验

    通过以下两种方法实现多个表单的统一校验: 1. 定义模板内容 在 el-form 表单中添加 ref 属性来获取表单组件对象 2. 方法一 在上述代码中,我们给每个 el-form 表单添加了 ref 属性,分别为 form1 和 form2,在 submit 方法中,分别对两个表单使用 validate 方法进行表单校验 3. 方法二

    2024年02月13日
    浏览(37)
  • vue3使用响应式数据 + v-model导致响应式失效el-form表单无法输入的问题

    参考文章 重构vue2项目时发现的问题,原始项目使用的是 Element-ui 。 其实vue3可以使用适配的 Element-plus 问题描述 el-form表单无法输入 控制台报错 Avoid adding reactive properties to a Vue instance or its root $data at runtime - declare it upfront in the data option. 使用响应式变量时应先声明 解决办法

    2024年02月15日
    浏览(31)
  • Vue - Element el-form 表单对象多层嵌套校验

    针对el-form的数据源是对象嵌套对象,在进行数据绑定和校验时和单层的对象有一点区别, 具体是下面两部分: 数据源: 1、 给 el-form-item 的 prop 设为: prop=\\\"health.height\\\" 。 v-model 设为: v-model=\\\"fromData.health.height\\\" 2、校验规则 rules 对象对应的key设置为数据源内部的值: \\\'health.heig

    2024年02月14日
    浏览(42)
  • el-form表单全部/部分添加一样字段内容并表单校验(复制即可实现)

    需求:表单有俩个按钮,一个是全部添加,一个是部分添加默认如下:  点击添加饮品爱好后如下,可以添加多个 点击添加全部,并且点击提交按钮后的表单校验,如下图:  全部代码如下,可自行复制查看  得到的数据结构如下图,不会影响,都是单独的表单验证:  这样

    2024年02月08日
    浏览(29)
  • el-form 动态表单增减项 (vue+element ui)

    1、点击”+“,弹出弹窗,新增一项,点击”-“,删除当前项 代码展示: html代码: 注意: el-form-item(表单项)循环,绑定的数组写在form当中 表单: 新增参数弹框: data: methods: 1、点击新增,弹出新增弹窗,添加表单项 2、点击”-“,删除当前表单项

    2024年02月02日
    浏览(37)
  • 解决el-form一进页面就会触发表单校验问题

    预期效果是:打开页面,外出地点和其他属性一样,不会自动触发表单非空校验,而是在操作当前属性时触发。 解决思路: 设置初始值为空数组即可 若不是多选,是输入框或者其他就初始化对应的值即可。思路大概是这样~

    2024年02月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包