主頁 > 企業開發 > 前端配置化表單組件設計方法

前端配置化表單組件設計方法

2023-05-07 08:51:40 企業開發

一、背景

前端開發中涉及表單的頁面非常多,看似功能簡單,開發快速,實則占去了很大一部分時間,當某個表單包含元素過多時還會導致html代碼過多,vue檔案過大,從而不容易查找、修改和維護,為了提高開發效率及降低維護成本,下面介紹表單配置化組件的封裝原理與封裝方法,

二、技術方案

如上圖所示,封裝表單配置化組件的關鍵點有三個一是如何解決表單元素排布的行列問題,二是表單資料的系結問題,三是表單元素的引數配置校驗等問題,下面分別介紹這三個問題的解決方法,

?配置化表單組件的入參及說明

引數 說明 型別 可選值 默認值
labelWidth 表單元素label所占寬度 String —— 150px
columnList 表單元素所組成的配置,是一個陣列 Array —— []
formData 表單元素值的集合 Object —— {}
columnSpan 表單排布分欄 Number —— 24
size 表單元素尺寸 String medium / small / mini medium

?計算配置化表單的行數,本表單通過基礎的24分欄計算表單最終的行數和列數,通過下面方法最終得到一個關于行列的二維陣列

newColumnList() {
  const newColumnList= []
  const row = Math.floor(24 / this.columnSpan)
  let newColumnItem = []
  for(let i=0; i< this.columnList.length; i++) {
    newColumnItem.push(this.columnList[i])
    if(newColumnItem.length === row || i === this.columnList.length-1) {
      newColumnList.push(newColumnItem)
      newColumnItem = []
    }
  }
  return newColumnList
}

?通過上面得到的二維陣列進行回圈渲染,首先回圈渲染行,其次回圈渲染列,本方案采用element中的表單,當然也可以用其他組件庫或者原生表單進行渲染,其原理通用,最終將會根據引數column.type決定加載哪一個具體的表單元素,

<el-form ref="form" :model="formData" :label- :size="size">
    <el-row :gutter="20" v-for="(element,index) in newColumnList" :key="index+'formRow'">
      <template v-for="(item, index) in element" >
        <column
          :key="index + 'formView'"
          :columnSpan="columnSpan"
          :column="item"
          :formData="https://www.cnblogs.com/Jcloud/archive/2023/05/06/formData"
        />
      </template>
    </el-row>
</el-form>

?column組件最終根據type加載具體的表單元素,下面展示column組件的入參及其說明,通過component加載不同的表單元素

引數 說明 型別 可選值 默認值
column 表單元素的具體配置 Object —— {}
formData 表單元素值的集合 Object —— {}
columnSpan 表單排布分欄 Number —— 24
<el-col :span="columnSpan">
     <component
      :is="column.type + 'View'"
      :column="column"
      :formData="https://www.cnblogs.com/Jcloud/archive/2023/05/06/formData"
      v-model="formData[column.name]"
      :columnSpan="columnSpan"/>
 </el-col>

?這里主要以select表單元素為例進行說明,表單元素的雙向系結、校驗以及值更新等問題

引數 說明 型別 可選值 默認值
column 表單元素的具體配置 Object —— {}
value 表單元素值 Number/String/Array —— ——

?column引數

引數 說明 型別 可選值 默認值
placeholder 空值說明 String —— ——
required 是否必填 Boolean —— ——
rules 校驗規則 Array —— ——
title 表單元素label String —— ——
name 表單元素值名稱 String —— ——
multiple 是否多選 Boolean —— ——
filterable 是否過濾 Boolean —— ——
disabled 是否禁用 Boolean —— ——
dictionary 下拉選項列舉 Array —— ——
changeFunction 值改變時的回呼函式 Function —— ——
<el-form-item :label="column.title + ':'" :prop="column.name" :rules="rules">
    <el-select
      v-model="val"
      clearable
      :multiple="column.multiple"
      :filterable="column.filterable"
      :placeholder="'請選擇' + column.title"
      :disabled="column.disabled"
      style="width: 100%"
      @change="onChange"
      @clear="onClear">
      <el-option v-for="item in column.dictionary" :key="item.code" :label="item.name" :value="https://www.cnblogs.com/Jcloud/archive/2023/05/06/item.code">
      </el-option>
    </el-select>
</el-form-item>

rules:  [
    {
      required: this.column.required,
      message: this.column.placeholder placeholder ? this.column.placeholder : `請輸入${this.column.title}`,
      trigger: 'change'
    },
    ...this.column.rules
 ]

onChange(){
  this.$emit('input',this.val)
  if(this.column && this.column.changeFunction){
    this.column.changeFunction(this.val)
  }
},
onClear(){
  this.onChange()
}

三、專案實踐

?配置化表單為bs-form,在頁面中引入bs-form表單組件

<bs-form ref="formDemo"
     :columnList="columnList"
     :formData="https://www.cnblogs.com/Jcloud/archive/2023/05/06/formData"
     :columnSpan="columnSpan"
     label>
</bs-form>
<el-row style="text-align: center;">
  <el-button type="primary"
             @click="onSave">保存</el-button>
  <el-button @click="onCancel">取消</el-button>
</el-row>

?formData引數

formData: {
    name: '',
    yearIncome: '', // 業務型別
    goodsCategoryId: '', // 托寄物品類id
    projectManagerErp: '', // 專案經理erp
    projectName: '', // 專案名稱
    projectStage: '', // 專案階段編碼
    projectStandardName: '', // 標準名稱
    projectYear: 2023, // 年份
    startRegionId: '', // 始發區域id
    startBattleId: '', // 始發戰區id
    address: [], // 省市
    category: null, //圖文型別
    range: [] //發布范圍
 }

?分欄引數

columnSpan: 6

?表單配置引數

columnList(){
  const self = this
  return [
    {
      type: 'text',
      name: 'name',
      title: '專案名稱',
      required: true,
      maxlength: 20,
      showwordlimit: true,
      placeholder: '請輸入'
    },
    {
      name: 'category',
      type: 'radio',
      dictionary: [
        {
          code: 1,
          name: '型別一'
        },
        {
          code: 2,
          name: '型別二'
        }
      ],
      title: '圖文型別',
      required: true
    },
    {
      name: 'range',
      type: 'checkbox',
      title: '發布范圍',
      dictionary: [
        {
          code: 1,
          name: '范圍一'
        },
        {
          code: 2,
          name: '范圍二'
        }
      ],
      required: true
    },
    {
      type: 'text',  // 欄位型別文本框
      name: 'yearIncome',  //與后臺對接欄位
      title: '年均收入',  // 前端展示欄位
      required: true, // 必填項設定
      maxlength: 50,  // 字串長度限制
      showwordlimit: true, // 是否顯示字串長度
      placeholder: '請輸入', // 占位文本提示
      rules: [
        { pattern: /(^[1-9]([0-9]+)?(.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9].[0-9]([0-9])?$)/, message: '請輸入數字最多兩位小數' }
      ],
    },
    {
      type: 'select',
      name: 'goodsCategoryId',
      title: '托寄物品類',
      required: true,
      filterable: true,
      placeholder: '請選擇',
      dictionary: [{
        name: '蘋果',
        code: '1'
      },{
        name: '手機',
        code: '2'
      },{
        name: '測驗',
        code: '3'
      },{
        name: '櫻桃',
        code: '7'
      },{
        name: '荸薺',
        code: '9'
      }]
    },
    {
      type: 'select',
      name: 'startRegionId',
      title: '區域',
      required: true,
      placeholder: '請選擇',
      dictionary: [{
        name: '銷售-華北區域',
        code: '1'
      },{
        name: '銷售-華東區域',
        code: '2'
      },{
        name: '銷售-華南區域',
        code: '3'
      },{
        name: '銷售-西南區域',
        code: '4'
      },{
        name: '銷售-華中區域',
        code: '5'
      },{
        name: '銷售-東北區域',
        code: '6'
      }],
      // 點擊下來觸發切換聯動的事件,為一個函式
      changeFunction: function (val) {
      }
    }, {
      type: 'select',
      name: 'startBattleId',
      title: '戰區',
      required: true,
      placeholder: '請選擇',
      dictionary: this.battleByRegionList
    }, {
      type: 'select',
      name: 'projectStage',
      title: '專案階段',
      required: true,
      placeholder: '請選擇',
      dictionary: [{
        name: '專案發起階段',
        code: '10'
      },{
        name: '專案調研階段',
        code: '20'
      },{
        name: '可行性分析階段',
        code: '30'
      },{
        name: '立項階段',
        code: '40'
      }]
    }, {
      type: 'text',
      name: 'projectStandardName',
      title: '標準名稱',
      required: true,
      placeholder: '請輸入',
      append: '.com',  // 文本框后置內容
    }, {
      type: 'text',
      name: 'projectManagerErp',
      title: '專案經理',
      required: true,
      placeholder: '請輸入'
    },{
      type: 'cascader',  // 欄位型別下拉框
      name: 'address',   //與后臺對接欄位
      title: '省市區',  // 前端展示欄位
      required: true, // 必填項設定
      placeholder:'請選擇',  // 占位文本提示
      dictionary: [{
        value: 'shanxi',
        label: '陜西省',
        children: [{
          value: 'xian',
          label: '西安市',
          children: [{
            value: 'yanta',
            label: '雁塔區'
          }, {
            value: 'beilin',
            label: '碑林區'
          }, {
            value: 'xincheng',
            label: '新城區'
          }, {
            value: 'weiyang',
            label: '未央區'
          }]
        }]
      }],
      // 點擊下來觸發切換聯動的事件,為一個函式
      changeFunction: function(){}
    },{
      type: 'static',
      name: 'projectYear',
      title: '年份'
    }
  ]
}

?表單保存

// 保存
async onSave() {
  const valid = await this.$refs.formDemo.onValidate()
  if(valid) {
    this.$message.success('校驗通過')
  }else {
    this.$message.error('校驗失敗')
  }
}

四、成果展示

作者:京東物流 田雷雷

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/551837.html

標籤:其他

上一篇:記錄-VUE中常用的4種高級方法

下一篇:返回列表

標籤雲
其他(158586) Python(38118) JavaScript(25404) Java(18023) C(15222) 區塊鏈(8262) C#(7972) AI(7469) 爪哇(7425) MySQL(7165) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5335) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4565) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1965) Web開發(1951) HtmlCss(1932) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 前端配置化表單組件設計方法

    前端開發中涉及表單的頁面非常多,看似功能簡單,開發快速,實則占去了很大一部分時間。當某個表單包含元素過多時還會導致html代碼過多,vue檔案過大。從而不容易查找、修改和維護。為了提高開發效率及降低維護成本,下面介紹表單配置化組件的封裝原理與封裝方法。 ......

    uj5u.com 2023-05-07 08:51:40 more
  • 記錄-VUE中常用的4種高級方法

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1. provide/inject provide/inject 是 Vue.js 中用于跨組件傳遞資料的一種高級技術,它可以將資料注入到一個組件中,然后讓它的所有子孫組件都可以訪問到這個資料。通常情況下,我們在父組件中使用 provid ......

    uj5u.com 2023-05-07 08:51:33 more
  • vue-router

    安裝 vue-router是一個vue的插件,用來實作前端的路由, 推薦使用 pnpm add vue-router@4 進行安裝。推薦配合vue3組合式api使用 基礎 從一個例子開始 <!-- App.vue檔案 --> <div id="app"> <h1>Hello App!</h1> <p ......

    uj5u.com 2023-05-07 08:51:28 more
  • el-upload組件問題 已解決

    前兩天我寫了一個上傳下載功能 使用<el-upload>組件 當后端將檔案流格式資料發送到回應里面前端屈接受的時候 ,我們使用 <el-upload> 組件里面的 :on-success 方法進行捕捉,使用blob進行檔案下載 檔案可以正常下載下來 但是打開檔案損壞 我去網上尋找答案, 但大多都是說 ......

    uj5u.com 2023-05-07 08:45:50 more
  • ArcToolBox-ArcGIS分析工具中英文對照及簡要介紹

    ArcGIS具有強大的分析工具箱,包括空間分析、空間統計、三維分析等,通過ArcGIS工具箱可以對空間資料進行各類操作、分析等,也可以用不同的工具制作GP模型進行發布使用。
    本文通過對ArcGIS工具箱(ArcToolBox)中工具的中英文對照及簡要說明,方便大家了解ArcGIS的各類工具,并對各類... ......

    uj5u.com 2023-05-07 08:36:10 more
  • 高精度地形DEM資料下載(NASA資料 12.5米解析度)

    本文介紹從NASA阿拉斯加衛星設備處網站下載高精度DEM資料,下載的資料精度是12.5米解析度。 目前國內大部分可以下載的dem資料都是30米或90米解析度的,對于更高精度的資料要不就是需要付費下載,要不就是涉密資料無法獲取。 下載地址:https://vertex.daac.asf.alaska. ......

    uj5u.com 2023-05-07 08:26:21 more
  • Three.js 進階之旅:頁面平滑滾動-王國之淚 &#128167;

    本文使用 React + Three.js + React Three Fiber 技術堆疊,實作一個《塞爾達傳說:王國之淚》主題風格基于滾動控制的平滑滾動圖片展示頁面。通過本文的閱讀,你將學習到的知識點包括:了解 R3F 中 useFrame hook 及 useThree hook 基本原理及用法... ......

    uj5u.com 2023-05-06 09:02:35 more
  • Three.js 進階之旅:頁面平滑滾動-王國之淚 &#128167;

    本文使用 React + Three.js + React Three Fiber 技術堆疊,實作一個《塞爾達傳說:王國之淚》主題風格基于滾動控制的平滑滾動圖片展示頁面。通過本文的閱讀,你將學習到的知識點包括:了解 R3F 中 useFrame hook 及 useThree hook 基本原理及用法... ......

    uj5u.com 2023-05-06 08:55:46 more
  • 記錄-Symbol學習筆記

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 Symbol是JavaScript中的原始資料型別之一,它表示一個唯一的、不可變的值,通常用作物件屬性的鍵值。由于Symbol值是唯一的,因此可以防止物件屬性被意外地覆寫或修改。以下是Symbol的方法和屬性整理: 屬性 Symbol.l ......

    uj5u.com 2023-05-06 08:15:46 more
  • Vue3專案(Vite+TS)使用Web Serial Api全記錄

    前言 之前寫了一個vue+django的一個通過串口控制的上位機系統。但是實際生產中,不如部署到服務器上,這樣可以更好的節約成本。但是這樣就需要弄一個客戶端來控制處理串口資訊。那我就在想能不能通過網頁直接拿到客戶端的串口資訊。所以問了萬能的chatgpt,得到了以下答案: 是的,前端可以使用 Web ......

    uj5u.com 2023-05-06 08:15:40 more