最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用el-form之表單校驗(yàn)自動(dòng)定位到報(bào)錯(cuò)位置問題

 更新時(shí)間:2023年05月20日 10:17:48   作者:清阿哥、  
這篇文章主要介紹了使用el-form之表單校驗(yàn)自動(dòng)定位到報(bào)錯(cuò)位置問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1. 背景

表單校驗(yàn)大多數(shù)的表單都會(huì)用到,一般情況下只是提示當(dāng)前哪些項(xiàng)校驗(yàn)不通過,但是如果表單比較需要用戶自己去找是哪項(xiàng)校驗(yàn)不通過,這樣的用戶體驗(yàn)不太好,如果能自動(dòng)定位到當(dāng)前校驗(yàn)不通過的表單項(xiàng)體驗(yàn)會(huì)更好一些(這里是以elementui 的 el-from 組件為例子)

2. 實(shí)現(xiàn)思路

目前有兩個(gè)實(shí)現(xiàn)方法:

方法一 

表單校驗(yàn)不通過的時(shí)候,會(huì)在未校驗(yàn)成功的表單 el-form-item 標(biāo)簽上加一個(gè)類名 is-error,可以從這個(gè)類名下手,獲取當(dāng)前校驗(yàn)不通過的所有的類名,然后通過 scrollIntoView 方法進(jìn)行自動(dòng)滑動(dòng)到當(dāng)前報(bào)錯(cuò)的表單項(xiàng)位置


方法二 

利用el-form提供的 validate 方法的第二個(gè)參數(shù),獲取當(dāng)前校驗(yàn)不通過的rule 對象,獲取到報(bào)錯(cuò)的 prop 后,在每個(gè)需要加表單校驗(yàn)的項(xiàng)上加上 ref,ref 的綁定值和 prop 保持一致這樣方便直接定位到哪個(gè)prop,然后和第一個(gè)方法一樣利用 scrollIntoView 方法結(jié)合$ref 獲取到 $el 實(shí)現(xiàn)自動(dòng)定位到校驗(yàn)不通過的表單項(xiàng)


3. 實(shí)現(xiàn)代碼

方法一

實(shí)現(xiàn)代碼:

 	// 表單校驗(yàn)
    verifyForm() {
      this.$refs.basicInfoRule.validate(valid => {
        if (valid) {
          // 校驗(yàn)通過執(zhí)行的邏輯
        } else {
          // 校驗(yàn)不通過自動(dòng)定位到不通過的表單項(xiàng)
          this.moveToErr()
        }
      })
    },
    // 自動(dòng)定位到表單報(bào)錯(cuò)項(xiàng)
    moveToErr() {
      this.$nextTick(() => {
        let isError = document.getElementsByClassName('is-error')
        if (isError.length) {
          isError[0].scrollIntoView({
            block: 'center',
            behavior: 'smooth'
          })
	// 這個(gè)當(dāng)滑動(dòng)到報(bào)錯(cuò)項(xiàng)之后自動(dòng)獲取輸入框的焦點(diǎn),方便用戶直接進(jìn)行輸入,延遲 800ms 是因?yàn)樾枰寄艿蕉ㄎ怀晒笤谶M(jìn)行獲取焦點(diǎn)體驗(yàn)更好一些
          setTimeout(() => {
            if (isError[0].previousElementSibling.querySelector('input')) {
              isError[0].previousElementSibling.querySelector('input').focus()
            }
          }, 800)
        }
      })
    }

方法二

實(shí)現(xiàn)代碼:

模板示例代碼

   <el-form-item label="姓名:" prop="name" ref="name">
        <el-input
          v-model.number="form."
          placeholder="請輸入姓名"
          clearable
        ></el-input>
      </el-form-item>
 verifyForm() {
      this.$refs.ruleForm.validate((valid, object) => {
        if (valid) {
          //校驗(yàn)通過執(zhí)行邏輯
        } else {
          let errorArr = [];
          for (let key in object) {
            object[key].forEach((item) => {
              errorArr.push(item.message);
            });
            let dom = this.$refs[Object.keys(object)[0]];
            if (Object.prototype.toString.call(dom) !== '[object Object]') {
              dom = dom[0];
              break; //結(jié)束語句并跳出語句,進(jìn)行下個(gè)語句執(zhí)行
            }
            // 定位到報(bào)錯(cuò)項(xiàng)
            dom.$el.scrollIntoView({
              block: 'center',
              behavior: 'smooth',
            });
          }
          // 頁面提示未通過校驗(yàn)字段項(xiàng),
          this.$message.error(errorArr[0]);
        }
      });
    },

4. 拓展(踩坑…)

由于頁面比較復(fù)雜分了好幾個(gè)子組件,而且子組件中都有需要校驗(yàn)的表單項(xiàng),在父組件保存表單前,需要調(diào)用各個(gè)子組件的表單校驗(yàn)方法,發(fā)現(xiàn)el-form 的 validate 方法不能返會(huì)校驗(yàn)失敗還是校驗(yàn)成功

錯(cuò)誤代碼示范:

// 子組件代碼
   verifyForm() {
      this.$refs.basicInfoRule.validate(valid => {
        if (valid) {
          // 校驗(yàn)通過
          return true
        } else {
          // 校驗(yàn)不通過
          return false
        }
      })
    },
    // 父組件代碼
    // 校驗(yàn)子組件表單(通過子組件綁定的ref來調(diào)用子組件的校驗(yàn)方法)
    async handleVerify() {
      if (
        !(await this.$refs.basicInfo?.verifyForm()) ||
        !(await this.$refs.priceSetting?.verifyForm())
      ) {
        this.$message.warning('請完善表單必填項(xiàng)')
        return false
      }
      return true
    },
    // 保存
      async saveMainDetail() {
      try {
        if (!(await this.handleVerify())) return
        } catch (e) {}    

上述代碼在父組件里面不能獲取到組件的校驗(yàn)狀態(tài),子組件換一個(gè)寫法就行了

正確代碼示范:

使用 Promise 來返回表單的是否校驗(yàn)成功狀態(tài)能在父組件成功拿到了

// 子組件代碼
 verifyForm() {
      return new Promise((resolve, reject) => {
        this.$refs.basicInfoRule.validate(valid => {
          if (valid) {
            console.log(valid, '校驗(yàn)通過')
            resolve(true)
          } else {
            console.log(valid, '校驗(yàn)不通過')
            reject(new Error())
          }
        })
      })
    }

心得:

實(shí)現(xiàn)功能的思路有很多,這里我列舉出來的兩種,看實(shí)際的功能和需求找到適合自己的方法~

el-form校驗(yàn)失敗時(shí)定位到失敗項(xiàng)

需求

提交的表單過長,出現(xiàn)滾動(dòng)條時(shí),點(diǎn)擊‘確定’觸發(fā)表單檢驗(yàn)后,頁面看不到的表單項(xiàng)報(bào)錯(cuò),但是用戶在頁面不能感知到,這時(shí)需要將滾動(dòng)條滾動(dòng)至校驗(yàn)失敗項(xiàng)處。

如圖:控制臺(tái)提示校驗(yàn)失敗,頁面顯示正常,用戶無感知。

思路

表單校驗(yàn)失敗時(shí),失敗項(xiàng)有is-error類,獲取這個(gè)元素,使用scrollIntoView()方法。

scollIntoView()將調(diào)用它的元素滾動(dòng)到瀏覽器窗口的可見區(qū)域。

js代碼

moveToErr () {
  this.$nextTick(() => {
    let isError = document.getElementsByClassName('is-error')
    if (isError.length) {
      isError[0].scrollIntoView({
        block: 'center',
        behavior: 'smooth'
      })
    }
  })
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue腳手架搭建過程圖解

    vue腳手架搭建過程圖解

    vue腳手架是個(gè)好東西,能夠快速搭建vue單頁面應(yīng)用,vue是基于node環(huán)境的,所以要先安裝node。下面通過圖文并茂的形式給大家介紹vue腳手架搭建過程圖解,感興趣的朋友一起看看吧
    2018-06-06
  • 如何修改vant的less樣式變量

    如何修改vant的less樣式變量

    這篇文章主要介紹了如何修改vant的less樣式變量方法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Vue2和Vue3的10種組件通信方式梳理

    Vue2和Vue3的10種組件通信方式梳理

    這篇文章主要介紹了Vue2和Vue3的10種組件通信方式梳理,本文將通過選項(xiàng)式API?組合式API以及setup三種不同實(shí)現(xiàn)方式全面介紹Vue2和Vue3的組件通信方式,需要的朋友可以參考一下
    2022-08-08
  • Vue如何實(shí)現(xiàn)組件間通信

    Vue如何實(shí)現(xiàn)組件間通信

    組件間通信簡單來說就是組件間進(jìn)行數(shù)據(jù)傳遞。就像我們?nèi)粘5拇螂娫挘褪峭ㄓ嵉囊环N方式,你把話說給我聽,我把話說給你聽,說的話就是數(shù)據(jù)。電話就是通訊方式的一種。無論是 Vue 還是 React ,都得進(jìn)行組件間通信。
    2021-05-05
  • vue axios 二次封裝的示例代碼

    vue axios 二次封裝的示例代碼

    本篇文章主要介紹了vue axios 二次封裝的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • 詳解Vuex的屬性

    詳解Vuex的屬性

    Vuex是專為Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式,這篇文章主要介紹了Vuex的屬性,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • vue實(shí)現(xiàn)登錄、注冊、退出、跳轉(zhuǎn)等功能

    vue實(shí)現(xiàn)登錄、注冊、退出、跳轉(zhuǎn)等功能

    這篇文章主要介紹了vue實(shí)現(xiàn)登錄、注冊、退出、跳轉(zhuǎn)等功能,需要的朋友可以參考下
    2020-12-12
  • vite.config配置alias Error: ENOTEMPTY: directory not empty, rmdir

    vite.config配置alias Error: ENOTEMPTY: director

    這篇文章主要為大家介紹了vite.config配置alias時(shí)報(bào)錯(cuò):Error: ENOTEMPTY: directory not empty, rmdir解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • 使用生成條形碼并打印和vue-print-nb以及報(bào)錯(cuò)問題的解決

    使用生成條形碼并打印和vue-print-nb以及報(bào)錯(cuò)問題的解決

    在TypeScript項(xiàng)目中,正確安裝vue3-print-nb并配置env.d.ts聲明模塊,添加tsconfig.json的include路徑,確保全局掛載以實(shí)現(xiàn)條形碼和批量打印功能
    2025-07-07
  • vue-cli-service不是內(nèi)部或外部命令,也不是可運(yùn)行的程序或批處理文件問題

    vue-cli-service不是內(nèi)部或外部命令,也不是可運(yùn)行的程序或批處理文件問題

    在Vue項(xiàng)目構(gòu)建過程中,如果遇到無法識別'vue-cli-service'命令的錯(cuò)誤提示,通常是因?yàn)闆]有全局安裝vue-cli,解決這個(gè)問題的步驟主要包括:首先檢查Vue版本,如果未安裝則先安裝Vue;其次全局安裝vue-cli;若在安裝過程中遇到cnpm命令找不到的情況
    2024-10-10

最新評論

内丘县| 石门县| 双流县| 临洮县| 利津县| 霍邱县| 横峰县| 临朐县| 内乡县| 涡阳县| 通榆县| 衡水市| 遵化市| 米林县| 自治县| 石狮市| 扎兰屯市| 盘山县| 芮城县| 昌都县| 平顶山市| 当阳市| 汉沽区| 金川县| 奉化市| 玉龙| 焉耆| 桐庐县| 墨玉县| 大埔县| 清镇市| 张家港市| 敦煌市| 赤水市| 北辰区| 桂东县| 台中市| 昂仁县| 莒南县| 锦州市| 南康市|