vue+element 基礎組件(輸入框,下拉框,日期框)二次封裝

前言

組件庫也已經上線運行了一段時間,該改的BUG也都解決了,也基本可以穩(wěn)定運行了。今天就抽出點時間更新下文檔方便日后查看!

背景

隨著公司項目的迭代更新,業(yè)務需求越來越多,如果繼續(xù)大規(guī)模使用element原生封裝的組件,就會使得業(yè)務代碼更加的繁瑣并且難以維護。所以就決定把element進行二次封裝,在封裝之前查閱了一些資料,為了方便后期維護
最后決定分裝成一個組件庫!

設計思路

參考網上封裝的思路,發(fā)現(xiàn)只是對el-input層進行封裝,雖然在使用過程中可以簡化一點使用代碼,但是整體的封裝層次不大。如果添加校驗還是要和element一樣單獨添加relus,添加驗證規(guī)則,如果這樣的話封裝的意義就不大了。
所以經過多方考慮直接把 el-form-item封裝進去的話就可以把驗證方法和正則規(guī)則一起封裝到里面使用統(tǒng)一的驗證方法和正則規(guī)則。

實現(xiàn)過程

一.封裝輸入框的核心用法就是實現(xiàn)組件的雙向綁定,可以使得綁定的v-model用法和elelment保持一致
通過綁定props里的value 保證父組件中,v-bind:value可以正常設置值,子組件可以取到值。
然后在watch里監(jiān)聽props里的value,將得到的值直接賦值給當前頁面的v-model
二.封裝統(tǒng)一的驗證規(guī)則

1.在el-form-item 里綁定rules驗證,通過checkHour方法添加自定義校驗參數(shù)

 :rules="[
       {
          required: prop && isRequired ? true : '',
          validator: (rule, value, callback) => {
            checkHour(rule, value, callback);
          }, //后面的這幾個是傳的自定義參數(shù)
          notrigger: 'blur',
        }
      ]"

checkHour(rule, value, callback) {
      if (this.sgccInputType == "mobile") {
        mobile(rule, value, callback, this.sgccLabelName); //手機號
      }else if (this.sgccInputType == "sgcustom") {
        sgcustom(rule, value, callback, this.custom, this.isempty); //自定義校驗
      } else if (this.prop) {
        isCong(rule, value, callback, this.sgccLabelName); //空
      } else {
        callback();
      }
    },

2.添加驗證方法js文件

/* 手機號 */
export function mobile(rule, value, callback,sgccLabelName = '內容') {
  const reg = /^1[3456789]\d{9}$/ 
  if (value == '' || value == undefined || value == null) {
      callback(new Error(`${sgccLabelName}不能為空`));
  } else {
      if ((!reg.test(value)) && value != '') {
          callback(new Error(`${sgccLabelName}填寫錯誤,請重新填寫`));
      } else {
          callback();
      }
  }
}
/* 自定義校驗規(guī)則 */
export function sgcustom(rule, value, callback,sgrule,isempty = true) {
  // rule, 
  // value, //輸入的值
  // callback,//回調檢驗
  // sgrule,//正則規(guī)則
  // isempty = false//是否校驗 ‘是否為空’,默認校驗

  // console.log(typeof sgrule)
  // console.log(value)
  // console.log(callback)
  // console.log(sgrule)
  let setsgrule = {error : "",atest : ""};
  if(typeof sgrule === 'string') setsgrule.error = sgrule;
  else setsgrule = sgrule;
  
  if (!value) {
    if(isempty) callback(new Error('內容不能為空'));
    else callback();
  } else {
    if ((!setsgrule.atest.test(value)) && value != '') {
      callback(new Error(setsgrule.error));//錯誤提示
    } else {
      callback();
    }
  }
}

3.自定義正則驗證單獨創(chuàng)建一個正則js全局注冊

export default {
  QQ: { atest: /^[1-9]*[1-9][0-9]*$/, error: '不正確的騰訊QQ號' },
}
三.根據(jù)業(yè)務需求封裝需要的輸入?yún)?shù)(前置btn,后置bth,后置文字信息,錯誤提示信息,劃過提示等...)
四.創(chuàng)建組件庫項目,將封裝好的基礎組件(input,select,date,radio,dialog)等,放進去統(tǒng)一注冊然后打包生成一個js文件,在其他項目里引用這個js就可以使用(后期可以發(fā)布到npm上)

組件庫項目搭建思路后期單獨寫一篇文章

實現(xiàn)效果

例如input組件
<sg-input
     sgccLabelName="QQ號"
     v-model="sgFrom.QQ"
     prop="QQ"
     sgccInputType="sgcustom"
     :custom="$RegExp.QQ"
></sg-input>

總結

封裝之后大幅縮減了代碼數(shù)量并且也方便維護,同時也使得頁面更加整潔。
其他的下拉框,日期框,單選框,彈窗都是相同的封裝思路。
持續(xù)更新。。。

參考網站

element

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯(lián)系作者。

相關閱讀更多精彩內容

友情鏈接更多精彩內容