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

ToB項目如何沉淀業(yè)務(wù)公共組件示例詳解

 更新時間:2022年10月13日 17:20:52   作者:avion  
這篇文章主要為大家介紹了ToB項目如何沉淀業(yè)務(wù)公共組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

背景

我就職的這家公司主要是為國內(nèi)的大中小型工業(yè)企業(yè)提供無人值守方案的,每年都會做大量的項目,幾年下來,積累了客觀的基于項目的代碼庫,為了提升開發(fā)效率,沉淀解決相同業(yè)務(wù)的公共組件就勢在必行了,這也是本文的開端,也是想要實現(xiàn)的效果,本文將會以下拉選擇+彈窗選擇為例,來嘗試說明:

  • What 什么是公共業(yè)務(wù)組件,和公共組件的區(qū)別是什么
  • Why 為什么要沉淀公共業(yè)務(wù)組件
  • How 如何沉淀一個公共業(yè)務(wù)組件

公共組件與公共業(yè)務(wù)組件的區(qū)別

在開始之前,需要講清楚一個概念,就是公共組件與公共業(yè)務(wù)組件的區(qū)別,顧名思義,公共組件就是類似ANTD、ElemntUI等等提供的組件,這些組件通常實現(xiàn)了常見的交互需求但是無關(guān)業(yè)務(wù),公共業(yè)務(wù)組件則不同,公共業(yè)務(wù)組件是為了實現(xiàn)某類特定需求而對公共組件進行了有機組合,接下來,我們就通過2W1H分析法,來嘗試闡述我們?nèi)绾芜M行公共業(yè)務(wù)組件的設(shè)計和沉淀

為什么要沉淀公共業(yè)務(wù)組件

當(dāng)一個需求反復(fù)在我們的項目中出現(xiàn),而不同的項目里交互和所要實現(xiàn)的功能基本一致,僅僅是展示和要提交的字段不一樣的時候,我們就需要考慮針對這個需求定制一個公共業(yè)務(wù)組件了,現(xiàn)在我們有一個這樣的需求,我們希望可以模糊搜索客戶檔案,物料檔案,通過下拉的方式選擇,然后也可以彈窗查看更多的列,然后勾選選擇。如果沒有一個公共的業(yè)務(wù)組件,那就意味著,我們?yōu)榱诉m配物料檔案,需要寫一套代碼,為了適配客戶檔案,又需要寫一套代碼,這么來看,沉淀一個公共的業(yè)務(wù)組件是合理的,接下來,我們就圍繞這個需求,基于ElementUI來實現(xiàn)一個公共業(yè)務(wù)組件。

樣式參考

下拉樣式

彈窗樣式

如何沉淀一個公共業(yè)務(wù)組件

共性需求提取

  • 一個可以模糊搜索的下拉框
  • 下拉框選項內(nèi)容是動態(tài)的
  • 右邊有一個可以進行彈窗的圖標(biāo)
  • 彈窗里的字段是動態(tài)的

需求分析

  • 模糊搜索的下拉框本身ElementUI就支持
  • 下拉選項的內(nèi)容el-select提供了默認(rèn)的插槽
  • 彈窗圖標(biāo)el-select沒有提供插槽,需要我們自行實現(xiàn)
  • -彈窗字段動態(tài)與下拉選項內(nèi)容動態(tài)本質(zhì)上需要解決的問題是一樣的,就是我們需要一個模板

模糊搜索的下拉框

 <el-select filterable remote :remote-method="querySearch">...</el-select>
  • 設(shè)計展示模板所需要的屬性
{
    fieldName: 'id', // 后臺字段名
    fieldTitle: 'id', // 展示的字段名
    isLabel: false, // 是否是選擇以后展示在下拉框里的字段
    isValue: false, // 是否是選擇以后要提交給后臺的字段,
    isQuick: false, // 是否參與輸入框的模糊查詢(這是要解決既模糊搜名稱也要模糊搜編碼的需求)
    isSelectShow: false, // 是否在下拉選項內(nèi)展示當(dāng)前字段
}
  • 設(shè)計需要從外部傳入的屬性
props: {
  //是否禁用
 disabled: {
   type: Boolean,
   default: false
 },
 // 是否多選
 multiple: {
   type: Boolean,
   default: null
 },
 // 要解析的模板
 temp: {
 },
 // 傳入的默認(rèn)值
 defaultVal:{
   type: [String,Number,Array],
   default: null
 }
}
  • 根據(jù)傳入的模板對模板進行解析處理選項默認(rèn)插槽 選項由一個不可編輯的模板表頭循環(huán)和實際數(shù)據(jù)循環(huán)構(gòu)成。
<el-select filterable remote :remote-method="querySearch">
// 模板表頭循環(huán)
<el-option
    disabled
    label="標(biāo)題"
    value="title"
    >
    <div class="flex jus-between">
      <div
        class="p-l-5 p-r-5 w-125px text-over"
        v-for="item in selectHeader"
        :key="item.fieldName"
      >
        {{ item.fieldTitle }}
      </div>
    </div>
</el-option>
// 真正的數(shù)據(jù)循環(huán)
<el-option
    v-for="(record, index) in tableData"
    :label="record[labelKey]"
    :value="record[valueKey]"
    :key="index"
  >
    <div class="flex jus-between">
      <div
        class="p-l-5 p-r-5 w-125px text-over"
        v-for="item in selectHeader"
        :key="item.fieldName"
      >
        <span>
          {{ record[item.fieldName] }}
        </span>
      </div>
    </div>
</el-select>
computed: {
// 需要在選項內(nèi)展示的列
  selectHeader () {
      return this.temp.filer(v => v.isSelectShow)
  }
}
  • 彈窗圖標(biāo)的實現(xiàn) 我們需要一個容器,提供定位屬性,然后將彈窗圖標(biāo)與el-select放在容器里,通過:deep 與相鄰元素選擇器,來定義我們的公共業(yè)務(wù)組件的樣式
 <div class="refer-modal-box">
    <div
      @click.stop.self="showReferModal"
      class="iconfont icon-loadmore cursor loadmore"
    />
    <el-select
    ...
 ...
 .refer-modal-box{
  padding-right: 30px;
  position: relative;
  // 這里top為1px的原因是input高度比總高度低1像素,通過定位來拉伸高度。
  .loadmore{
    width: 30px;
    color: #999;
    text-align: center;
    border-radius: 4px;
    border: 1px solid #dcdfe6;
    position: absolute;
    top: 1px;
    bottom: 0;
    right: 0;
    margin: auto;
    box-sizing: border-box;
    border-left: 0;
    border-top-left-radius: 0;
    border-bottom-left-radius: 0;
  }
  // 相鄰元素選擇器定義input樣式,與彈窗圖標(biāo)一起拼成一個完整邊框
  .loadmore ~ .el-select:deep(input){
    border-right: none;
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
    border-color: #dcdfe6;
  }
  .loadmore:hover{
    color: #2e79ef;
  }
}

對外暴露的事件

事件我們可以提供一個獲取當(dāng)前選中值的方法,在組件外通過$refs.referModal.getChecked()來獲取,$refs.組件名可以直接拿到組件的vue實例,當(dāng)然可以調(diào)用聲明在methods內(nèi)的方法

總結(jié)

  • 公共業(yè)務(wù)組件沉淀的必備基礎(chǔ) 技術(shù)體系已經(jīng)完成了收斂和統(tǒng)一
  • 公共業(yè)務(wù)組件沉淀的時機: 當(dāng)某個需求多次出現(xiàn),而現(xiàn)有的基礎(chǔ)組件無法cover的時候
  • 公共業(yè)務(wù)組件沉淀的標(biāo)準(zhǔn): 滿足當(dāng)下已經(jīng)出現(xiàn)的需求點,留出未來可能出現(xiàn)的擴展點,怎么理解這句話呢?我舉一個簡單的例子,如果一個字段他的字段類型是個布爾值,那么未來他只能是true或者是false, 假如這個字段我們定義成一個枚舉值,那未來他就是可以無限擴展的。同理,當(dāng)我們在處理需要判斷的情況時,定義外部傳入的prop盡量是個枚舉值而不是布爾值,這樣我們的組件解析就存在無限擴展的可能。
  • 公共業(yè)務(wù)組件的屬性設(shè)計: 要充分評估現(xiàn)存的已經(jīng)存在于業(yè)務(wù)代碼內(nèi)的需求,并根據(jù)需求去設(shè)計我們公共業(yè)務(wù)組件的屬性
  • 模板與插槽: 模板本身所起到的作用就是減少重復(fù)代碼的編寫,所以公共業(yè)務(wù)組件的模板解析放在了組件內(nèi)而不是通過插槽的方式對外暴露,當(dāng)然我們也可以預(yù)留對應(yīng)的插槽,那么公共業(yè)務(wù)組件就變成了僅有樣式的殼,真正的業(yè)務(wù)實現(xiàn)由引用這個公共業(yè)務(wù)組件的頁面決定

綜上所述,當(dāng)你的團隊已經(jīng)完成技術(shù)體系的收斂和統(tǒng)一,也就是產(chǎn)品體驗一致、框架一致,以及基礎(chǔ)技術(shù)棧一致時,就已經(jīng)具備了公共業(yè)務(wù)組件沉淀的必要基礎(chǔ),經(jīng)歷了長期的小步快跑,快速迭代,按項目交付這樣的技術(shù)積累后,根據(jù)本文的方式去構(gòu)建公共業(yè)務(wù)組件庫,應(yīng)該會有不錯的效果。

以上就是ToB項目如何沉淀業(yè)務(wù)公共組件示例詳解的詳細(xì)內(nèi)容,更多關(guān)于ToB項目沉淀業(yè)務(wù)公共組件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

黄大仙区| 宜昌市| 兰溪市| 定结县| 玉林市| 扎兰屯市| 井冈山市| 文昌市| 云霄县| 通江县| 清涧县| 开封县| 和林格尔县| 秀山| 河西区| 湟中县| 福泉市| 枣庄市| 沂水县| 平顺县| 平武县| 鹤岗市| 百色市| 合水县| 英山县| 澳门| 军事| 麟游县| 正阳县| 本溪| 鄂尔多斯市| 都兰县| 永定县| 江油市| 手游| 兴化市| 平江县| 乐昌市| 比如县| 沾益县| 大化|