Vue3組件(二)做一個百變input組件

怎么個百變法呢独郎,就是做一個組件过咬,可以實現(xiàn) input 的各種形態(tài)。

原生input的類型

先整理一下 input 的 type 都提供了哪些類型缰盏。
原:HTML5之前的類型。
新:HTML5提供的新的類型淹遵。

input 類型.png

這里沒有寫 radio 和 checkbox口猜,因為這兩個被我劃分為選擇類型,同理還有submit透揣。

我們可以依據(jù)這個類型定義一個屬性:

    const type = {
      100: 'textarea', // 多行文本框
      101: 'text', // 單行文本框
      102: 'password', // 密碼
      103: 'tel', // 電話
      104: 'email', // 電子郵件
      105: 'url', // url
      106: 'search', // 搜索
      107: 'color', // 顏色
      108: 'text', // 彈窗選擇記錄
      110: 'date', // 日期
      111: 'datetime-local', // 日期時間
      112: 'time', // 時間
      113: 'week', // 年月
      114: 'month', // 年周
      120: 'number', // 數(shù)字
      121: 'range', // 滑塊
      130: 'file', // 上傳文件
      131: 'file', // 上傳圖片
      140: 'fulltext', // 富文本編輯器
      150: 'checkbox', // 勾選
      152: 'checkboxs', // 多選組
      153: 'radios', // 單選組
      170: 'select', // 下拉列表框 單選
      171: 'selects', // 列表框 多選
      172: 'selectMore' // 聯(lián)動下拉列表框
    }

具體使用方式下面說暮的。

依據(jù) input 的屬性定義一個對象

然后我把可以把input的其他屬性整理出來做一個對象:

    const meta = reactive({
      controlId: 1000,
      colName: 'companyName',
      controlType: 101,
      isClear: true,
      disabled: false,
      required: true,
      readonly: false,
      pattern: '',
      class: '',
      placeholder: '請輸入公司名稱',
      title: '公司名稱',
      autocomplete: 'on',
      size: 30,
      maxlength: 100,
      optionList: [],
      tdCount: 1
    })

準(zhǔn)備工作做好了,我們開始做組件淌实。

做一個多功能的 文本類 控件

模板部分

<template>
  <!---->
  <input :id="'c' + meta.controlId"
    :type="type[meta.controlType]"
    :name="'c' + meta.controlId"
    :value="modelValue"
    :disabled="meta.disabled"
    :readonly="meta.readonly"
    :class="meta.class"
    :placeholder="meta.placeholder"
    :title="meta.title"
    :size="meta.size"
    :maxlength="meta.maxlength"
    :autocomplete="meta.autocomplete"
    :list="meta.optionKey"
    @input="myInput"
    :key="'ckey_'+meta.controlId">
    <!--文本框的備選項-->
    <datalist v-if="typeof(meta.optionKey)!=='undefined'" :id="meta.optionKey">
      <option :key="item.value" v-for="item in meta.optionList" :label="item.title" :value="item.value" />
    </datalist>
</template>

這個比較簡單冻辩,就是把 input 具有的屬性都給綁定上。
這里要感謝vue的數(shù)據(jù)綁定功能拆祈,沒有設(shè)置的屬性會自動省略恨闪,這就不用我們一個一個判斷是不是 undefined 了。

代碼部分

export default {
  name: 'nf-h5-form-text',
  props: {
    modelValue: String,
    meta: metaInput
  },
  emits: ['input'],
  setup (props, context) {
    console.log(props)
    // 提交數(shù)據(jù)
    const myInput = (e) => {
      console.log(e)
      console.log(context)
      context.emit('update:modelValue', e.target.value)
    }

    return {
      type,
      myInput
    }
  }
}

這個比較簡單了放坏,設(shè)計兩個屬性咙咽,一個是 modelValue 綁定 input 的 value 的。
另一個是 meta淤年,后面跟了一個 metaInput 钧敞,這個就是上面整理的 input 的屬性對象蜡豹,在組件的屬性里面,改成了帶驗證的形式溉苛。

// 定義屬性
const metaInput = {
  type: Object,
  default: () => {
    return {
      // 通用
      controlId: Number, // 編號镜廉,區(qū)別同一個表單里的其他控件
      colName: String, // 字段名稱
      controlType: Number, // 用類型編號表示type
      isClear: {
        // isClear  連續(xù)添加時是否恢復(fù)默認(rèn)值
        type: Boolean,
        default: false
      },
      defaultValue: String, // 默認(rèn)值
      autofocus: { // 是否自動獲得焦點
        type: Boolean,
        default: false
      },
      disabled: {
        // 是否禁用
        type: Boolean,
        default: false
      },
      required: { // 必填
        type: Boolean,
        default: true
      },
      readonly: { // 只讀
        type: Boolean,
        default: false
      },
      pattern: String, // 用正則做驗證。
      class: {
        type: String,
        default: 'ant-input ant-input-sm'
      },
      placeholder: String,
      title: String, // 提示信息
      size: Number, // 字符寬度
      maxlength: Number, // 最大字符數(shù)
      autocomplete: { // off
        type: String,
        default: 'on'
      },
      optionKey: String, // 備選文字標(biāo)識
      optionItem: Object // 備選的選項
    }
  }
}

這種方式愚战,不僅可以定義組件的屬性娇唯,而且還能對屬性做類型限制、設(shè)置默認(rèn)值等功能寂玲。
這樣可以讓屬性設(shè)置的更嚴(yán)謹(jǐn)一些塔插。

如果父組件里面設(shè)置屬性不符合要求,那么瀏覽器里面會給出來警告提示拓哟。

設(shè)計目的

為什么要這么設(shè)計呢想许?因為表單里面的元素是各種各樣的,比如文本断序、日期流纹、選擇等等,一般需要一個一個寫逢倍,即是是使用UI庫里的form,也還是需要進行具體屬性設(shè)置景图。

這個就有點郁悶了较雕,說好的數(shù)據(jù)綁定呢?
我比較懶挚币,對于這種需要一行一行寫的情況比較厭惡亮蒋,那么能不能簡單一點呢,比如使用v-for進行循環(huán)妆毕?

想要循環(huán)慎玖,那么就必須規(guī)范接口,也就是屬性和事件笛粘,這兩個統(tǒng)一之后我們就可以進行循環(huán)了趁怔。

如果可以循環(huán)的話,那么再大的表單也不用擔(dān)心了薪前,一個循環(huán)搞定润努。

這里只是處理了一下文本類的控件,后面還要處理選擇類的控件示括,還有其他控件铺浇。一路封裝下來,最后就可以實現(xiàn)v-for的目的了垛膝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鳍侣,一起剝皮案震驚了整個濱河市丁稀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌倚聚,老刑警劉巖线衫,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異秉沼,居然都是意外死亡桶雀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門唬复,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矗积,“玉大人,你說我怎么就攤上這事敞咧〖罚” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵休建,是天一觀的道長乍恐。 經(jīng)常有香客問我,道長测砂,這世上最難降的妖魔是什么茵烈? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮砌些,結(jié)果婚禮上呜投,老公的妹妹穿的比我還像新娘。我一直安慰自己存璃,他們只是感情好仑荐,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纵东,像睡著了一般粘招。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上偎球,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天洒扎,我揣著相機與錄音,去河邊找鬼衰絮。 笑死逊笆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的岂傲。 我是一名探鬼主播难裆,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了乃戈?” 一聲冷哼從身側(cè)響起褂痰,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎症虑,沒想到半個月后缩歪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡谍憔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年匪蝙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片习贫。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡逛球,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出苫昌,到底是詐尸還是另有隱情颤绕,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布祟身,位于F島的核電站奥务,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏袜硫。R本人自食惡果不足惜氯葬,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望婉陷。 院中可真熱鬧帚称,春花似錦、人聲如沸憨攒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肝集。三九已至,卻和暖如春蛛壳,著一層夾襖步出監(jiān)牢的瞬間杏瞻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工衙荐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捞挥,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓忧吟,卻偏偏與公主長得像砌函,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容