vue element ui From表单校验不生效问题解决

vue element ui From表单校验不生效问题解决


仅供参考 自我记录.

解决方案① el-from上要使用:model不要使用v-model

 <el-form ref="ruleForm" :model="testForm" label-width="100px" :rules="rules">

解决方案② el-from-item上是否有加prop,并确定prop是不是和编写的规则相同

  <el-form-item label="活动名称" prop="name">
    <el-input v-model="testForm.name"></el-input>
  </el-form-item>
  // 校验规则 prop name相同
   rules: {
    	name: [
            { required: true, message: '请输入活动名称', trigger: 'blur' },
            { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
          ]
       }

解决方案③$refs[formName]$refs.formName注意事项 前者提交的时候要传参@click="submitForm('ruleForm')" 不然不生效

//官方的写法是$refs[formName]  
 <el-form ref="ruleForm" :model="testForm" label-width="100px" :rules="rules">
  <el-form-item label="活动名称" prop="name">
    <el-input v-model="testForm.name"></el-input>
  </el-form-item>
  <el-form-item>
    <el-button type="primary" @click="submitForm('ruleForm')">提交</el-button>
  </el-form-item>
 <el-form>
 data() {
    return {
    testForm:{
        name:'',
      },
   rules: {
    	name: [
            { required: true, message: '请输入活动名称', trigger: 'blur' },
            { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
          ]
       }
    }
  },
 methods: {
    // 第一种方法要接收参数 并且$refs[formName]
      submitForm(formName) {
        this.$refs[formName].validate((valid) => {
          if (valid) {
            alert('submit!');
          } else {
            console.log('error submit!!');
            return false;
          }
        });
      },
//网上也有用 $refs.formName 第二种写法的 
 <el-form ref="ruleForm" :model="testForm" label-width="100px" :rules="rules">
  <el-form-item label="活动名称" prop="name">
    <el-input v-model="testForm.name"></el-input>
  </el-form-item>
  <el-form-item>
  // 不需要传参 第二种方式
    <el-button type="primary" @click="submitForm()">提交</el-button>
  </el-form-item>
 <el-form>
 data() {
    return {
    testForm:{
        name:'',
      },
   rules: {
    	name: [
            { required: true, message: '请输入活动名称', trigger: 'blur' },
            { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
          ]
       }
    }
  },
 methods: {
    // 第二种方法不需要接收参数 并且$refs.formName
      submitForm() {
        this.$refs.formName.validate((valid) => {
          if (valid) {
            alert('submit!');
          } else {
            console.log('error submit!!');
            return false;
          }
        });
      },

解决方案④网上有人说 未在data里面声明初始数据也会报错(未复现.解决方案仅供参考)

  <el-form-item label="活动名称" prop="name">
    <el-input v-model="testForm.name"></el-input>
  </el-form-item>
 data() {
    return {
  // 校验规则 prop name相同
    testForm:{
        name:'',//意思是这个位置没有声明 name 也会不生效 我测试了一下不声明也生效 仅供参考
      },
   rules: {
    	name: [
            { required: true, message: '请输入活动名称', trigger: 'blur' },
            { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
          ]
       }
    }
  }

平时遇到的一些小问题 自我记录 有补充的地方希望大家多多提出意见 共同学习!
如有转载 请备注原文地址!

<think>我们已知用户输入的总天数(例如10000天),需要计算出对应的出生日期(即从今天往前推这么多天的日期)。思路:1.获取当前日期(作为参考点)。2.将总天数转换为毫秒数(因为JavaScriptDate对象处理的是毫秒)。注意:1天=24小时*60分钟*60秒*1000毫秒=86400000毫秒。3.用当前日期的毫秒数减去总天数对应的毫秒数,得到出生日期的毫秒数。4.使用新的Date对象表示出生日期。5.注意:由于时区问题,我们可能需要考虑将时间调整到当天的开始(00:00:00),以避免时差影响。但是,用户输入的总天数是整数,我们通常希望出生日期是当天的零点(即不考虑时间部分)。然而,这里有一个问题:我们计算的是从当前时间点往前推若干天,那么结果会包含时间部分。如果我们希望得到的是日期(年月日),那么需要将时间部分忽略,或者格式化为日期字符串。步骤:-获取当前日期的毫秒数(当前时间戳)-减去天数转换的毫秒数-用得到的时间戳创建新的Date对象-然后我们可以将这个Date对象格式化为YYYY-MM-DD的字符串但是,由于时区的原因,直接使用newDate(timestamp)可能会得到前一天的结果(如果时间戳对应的本地时间在零点之前)。为了避免这个问题,我们可以将时间戳调整为本地时间的零点。另一种方法是:我们只关心日期部分,所以可以提取年、月、日来构建日期字符串。然而,用户要求的是出生日期,所以我们可以直接输出日期字符串。具体步骤:1.获取当前日期对象,并获取其时间戳(毫秒数)。2.计算出生日期的时间戳=当前时间戳-(输入天数*86400000)3.使用计算出的时间戳创建新的Date对象(birthDate)。4.然后,我们可以使用这个birthDate对象来获取年、月、日,并格式化为字符串。注意:月份是从0开始的,所以需要加1。但是,这里有一个潜在问题:夏令时。使用固定毫秒数(86400000)可能会因为夏令时调整而差一个小时,但因为我们计算的是天数(整数天),并且我们只关心日期部分,所以实际上影响不大。因为即使差几个小时,我们取日期部分时,只要不超过一天,日期就不会变。然而,为了确保安全,我们可以使用UTC日期来避免时区影响。但用户通常需要的是本地日期。因此,我们使用本地日期,并按照本地时间格式化。示例代码:假设用户输入的天数为days,则:```javascriptfunctioncalculateBirthDate(days){//获取当前日期对象constnow=newDate();//计算当前时间戳(毫秒)constnowTime=now.getTime();//计算出生日期的时间戳constbirthTime=nowTime-(days*24*60*60*1000);constbirthDate=newDate(birthTime);//格式化出生日期为YYYY-MM-DDconstyear=birthDate.getFullYear();constmonth=String(birthDate.getMonth()+1).padStart(2,'0');constday=String(birthDate.getDate()).padStart(2,'0');return`${year}-${month}-${day}`;}```但是,上述方法可能会因为夏令时调整而出现一天的误差?实际上,由于我们计算的是整数天的毫秒数,而夏令时调整通常只有一小时,所以不会影响日期的变化(因为24小时的倍数减去一小时,日期会多算一天?)。实际上,我们需要考虑的是:我们减去的是固定的24小时/天,而实际的一天可能不一定是24小时(有23、24、25小时的情况)。所以严格来说,这样计算会有问题。为了避免这个问题,我们可以使用另一种方法:调整日期对象的天数部分。更好的方法:使用UTC日期或者使用setDate方法。我们可以使用当前日期的Date对象,然后使用setDate(now.getDate()-days)来调整日期。这样会自动处理月份和年份的进位,而且不会受时区影响(因为操作的是本地日期)。改进方案:```javascriptfunctioncalculateBirthDate(days){constnow=newDate();//复制当前日期对象,避免修改原对象constbirthDate=newDate(now);//设置日期为当前日期减去输入的天数birthDate.setDate(now.getDate()-days);//格式化constyear=birthDate.getFullYear();constmonth=String(birthDate.getMonth()+1).padStart(2,'0');constday=String(birthDate.getDate()).padStart(2,'0');return`${year}-${month}-${day}`;}```这种方法更可靠,因为它直接操作本地日期的天数,并且会自动处理跨月、跨年以及夏令时等问题。测试:假设今天是2023-10-01,减去1天得到2023-09-30;减去365天得到2022-10-01(非闰年)或2022-09-30(闰年?)等,但setDate方法会自动处理。因此,我们采用第二种方法。但是,用户输入的总天数可能是小数?根据需求,我们假设用户输入的是整数。如果是小数,我们可以取整。另外,如果用户输入的天数很大(比如几万年),JavaScript的Date对象能表示的范围是有限的(大约从1970年1月1日前后285616年),所以一般情况下没问题。因此,我们编写函数如下:注意:我们要求输入的总天数是一个整数(或可以转换为整数的字符串),如果不是整数,我们可以使用Math.floor或Math.ceil,但这里我们按照整数处理。代码实现:我们将创建一个函数,接收一个参数days(总天数),返回一个格式为"YYYY-MM-DD"的字符串。如果用户输入的是小数,我们可以四舍五入或者取整,这里我们使用Math.floor(days)来取整(因为通常天数是整数)。但用户可能输入负数?我们不考虑负数,因为出生日期不能在未来。如果输入负数,我们可以返回错误或者返回未来日期?根据需求,我们可以做校验。这里我们先不考虑校验,只实现功能。最终代码:```javascriptfunctioncalculateBirthDate(days){//将输入的天数转换为整数(向下取整)days=Math.floor(days);constnow=newDate();constbirthDate=newDate(now);birthDate.setDate(now.getDate()-days);constyear=birthDate.getFullYear();constmonth=String(birthDate.getMonth()+1).padStart(2,'0');constday=String(birthDate.getDate()).padStart(2,'0');return`${year}-${month}-${day}`;}```示例:如果用户输入10000天,那么就会返回从今天往前推10000天的日期。但是,这里有一个问题:如果当前日期是2023年10月1日,减去10000天,那么得到的是1996年6月6日?我们可以验证一下。不过,由于我们使用本地日期,所以结果是准确的。另外,我们也可以考虑使用UTC日期来避免时区问题?但是用户通常需要的是本地日期,所以使用本地日期即可。因此,这个函数可以满足需求。下面我们提供完整的示例,包括一个简单的HTML页面,用户输入天数,点击按钮,显示出生日期。HTML部分:```html<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><title>根据总天数计算出生日期</title></head><body><h1>根据总天数计算出生日期</h1><labelfor="daysInput">输入总天数:</label><inputtype="number"id="daysInput"min="0"><buttononclick="calculate()">计算出生日期</button><pid="result"></p><script>functioncalculate(){constdays=parseInt(document.getElementById('daysInput').value,10);if(isNaN(days)||days<0){alert('请输入一个非负整数!');return;}constbirthDate=calculateBirthDate(days);document.getElementById('result').textContent=`您的出生日期是:${birthDate}`;}functioncalculateBirthDate(days){days=Math.floor(days);constnow=newDate();constbirthDate=newDate(now);birthDate.setDate(now.getDate()-days);constyear=birthDate.getFullYear();constmonth=String(birthDate.getMonth()+1).padStart(2,'0');constday=String(birthDate.getDate()).padStart(2,'0');return`${year}-${month}-${day}`;}</script></body></html>```注意:这里我们做了简单的输入校验,要求输入非负整数。这样,用户就可以在网页上输入总天数,然后计算出对应的出生日期。但是,需要注意的是,这种方法计算出的出生日期是公历日期。如果用户需要农历,则需要额外的转换。根据用户的需求,我们只提供公历日期的计算。综上所述,我们使用JavaScript的Date对象的setDate方法来实现,避免了直接计算毫秒数可能遇到的时区和夏令时问题,并且代码简单可靠。相关问题:1.如何根据出生日期计算年龄(精确到天)?2.如何计算两个日期之间相差的天数?3.如何处理日期计算中的时区问题?4.如何将公历日期转换为农历日期?</think>### JavaScript 根据总天数计算出生日期 以下是完整的实现方案,使用 JavaScript 根据用户输入的总天数计算出对应的出生日期: #### 实现原理 1. **获取当前日期**:使用 `new Date()` 获取当前日期和时间 2. **计算出生时间戳**:当前时间戳减去总天数对应的毫秒数 3. **转换时间戳为日期**:将计算结果转换为日期对象 4. **格式化输出**:将日期对象格式化为 YYYY-MM-DD 的字符串 #### 完整代码实现 ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>根据天数计算出生日期</title> </head> <body> <h1>根据生活天数计算出生日期</h1> <label for="daysInput">输入您生活的总天数:</label> <input type="number" id="daysInput" min="0"> <button onclick="calculateBirthDate()">计算出生日期</button> <p id="result"></p> <script> function calculateBirthDate() { // 获取用户输入的天数 const totalDays = parseInt(document.getElementById('daysInput').value); if (isNaN(totalDays) || totalDays < 0) { alert('请输入有效的正整数!'); return; } // 1. 获取当前日期(包含时间) const currentDate = new Date(); // 2. 计算总毫秒数(1天=86400000毫秒) const totalMilliseconds = totalDays * 24 * 60 * 60 * 1000; // 3. 计算出生日期的时间戳 const birthTimestamp = currentDate.getTime() - totalMilliseconds; // 4. 创建出生日期对象 const birthDate = new Date(birthTimestamp); // 5. 格式化日期为 YYYY-MM-DD const year = birthDate.getFullYear(); const month = String(birthDate.getMonth() + 1).padStart(2, '0'); const day = String(birthDate.getDate()).padStart(2, '0'); // 6. 显示结果 document.getElementById('result').textContent = `您的出生日期是:${year}-${month}-${day}`; } </script> </body> </html> ``` #### 关键代码说明 1. **日期计算核心逻辑**: ```javascript // 当前时间戳 const currentTime = new Date().getTime(); // 计算出生时间戳 const birthTime = currentTime - (totalDays * 86400000); // 转换为日期对象 const birthDate = new Date(birthTime); ``` 2. **日期格式化**: ```javascript // 使用padStart确保两位数格式 const month = String(birthDate.getMonth() + 1).padStart(2, '0'); const day = String(birthDate.getDate()).padStart(2, '0'); ``` 3. **输入验证**: ```javascript // 确保输入是有效的正整数 if (isNaN(totalDays) || totalDays < 0) { alert('请输入有效的正整数!'); return; } ``` #### 注意事项 1. **时区处理**:该方法使用用户本地时区进行计算,结果会因用户所在时区不同而有细微差异 2. **精度问题**:计算结果精确到天,不包括时间部分 3. **大数值处理**:JavaScript 日期对象支持范围约在 1970 年 ±285,616 年,能满足常规需求 #### 示例使用 1. 用户输入:`10000` 天 2. 当前日期:2023-10-01 3. 计算结果:1996-06-06(具体结果取决于当前日期) 此实现基于 JavaScript 日期对象的基本原理,通过时间戳运算避免了复杂的日期边界问题[^1][^2][^4]。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值