亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript?element的Form表單生成方式

 更新時間:2022年09月16日 08:29:55   作者:烤肉師傅  
這篇文章主要介紹了JavaScript?element的Form表單生成方式,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

前言;

最近在做一系列后臺管理系統(tǒng),其中用的最多的就是表單和表格了。這里講一下我最近對表單封裝的思考。 以下是我的設計思路以及具體實現(xiàn),我使用的是vue3+element-plus,因此這個組件也是以這兩個庫為基礎。

設計目標

配置化

我們希望把表格的內(nèi)容,驗證規(guī)則,甚至于表單的樣式,格式都能更規(guī)則化,配置化,這樣后續(xù)我們可以通過構造json去實現(xiàn)一個表單,甚至可用實現(xiàn)拖拽式的構造表單。

參數(shù)簡單

盡量減少json的層級,減少json的參數(shù),字段更加語義化。

自由度

json其實是一套自由度的很少的規(guī)則,但是vue則我們提供更多的自由度,比如h函數(shù),比如動態(tài)組件,利用這些方法我們可以實現(xiàn)更高的自由度。

我的實現(xiàn)過程

表單項的格式設計

首先第一步,我們先設計一個基礎的格式,在這個JSON里,字段名都是很簡單的英文單詞,我專門把驗證的規(guī)則rule放到每個子項里來,這也比較符合直觀。

 const oneItem = {
          key: 'title',
          title: '小說名',
          component: 'el-input',
          props: { placeholder: '請輸入姓名' },
          rule: [{ required: true, trigger: 'blur', message: '必填項' }],
}

在這個格式里面,比較重要的主要是2個,keycomponent。key其實就是你表單里數(shù)據(jù)的字段名,而component則是你指定的編輯組件,在這里我們可以直接使用字符串,但其實這里可以通過vue的動態(tài)組件實現(xiàn)更靈活的應用,比如我們換一個組件庫的input組件

import { Input } from '@varlet/ui' 
import '@varlet/ui/es/input/style/index.js'
const oneItem = {  component:  Input }

這時候,我們就需要動態(tài)組件去渲染它,因此我們可以這樣寫去渲染,當component是一個字符串,比如el-input的時候,我們渲染elementinput組件,至于v-model這些我就省略了

<el-form-item v-for="item in items" :key="item.key">
  <el-input v-if="item.component === 'el-input'" />
  <component :is="item.component" />
</el-form-item>

v-bind的妙用

每個組件庫的組件參數(shù)都不一樣,而且有些屬性我們可能并不使用,比如el-input有這個屬性prefix-icon,是一個前綴圖標,別的組件庫不一定有啊,那到我們需要把所有組件庫的所有屬性都寫在json? 我在之前的json中設計了以個props字段,這里面就是存放的是組件庫的屬性,或者是我們需要給組件傳的值. 這時候,vue給我們提供了一個很方便的功能,直接使用v-bind傳入一個對象,他就自動會幫我們把屬性綁定。 比如這樣寫

const props = {a:1,b:2}
 <el-input v-if="item.component === 'el-input'" v-bind="props" />

vue就會自動處理為下面這種, 這就是v-bind的妙用。當然運用renderFunction也可以實現(xiàn)這個效果,諸君可以自己嘗試一下

 <el-input v-if="item.component === 'el-input'" v-bind:a="props.a" v-bind:a="props.b"/>

computed的妙用:實現(xiàn)v-model

下面我們來看一下數(shù)據(jù)的問題,vue中提供了方便v-model,方便我們修改的值能實時響應,并且我們可以自己實現(xiàn)一自定義v-model。 它的基本原理是這樣,我們先父傳子,然后子再通過事件告訴父組件修改這個值。大概實現(xiàn)就是這樣

<script>
    <button>+1</button>
</script>
export default{
    props:[
    'modelValue', //v-model
    'a' //v-model:a
    ],

    emits:['update:modelValue','update:a'],
  
    methods:{
        add(){
            this.$emit('update:modelValue',this.modelValue++)
            this.$emit('update:a',this.a++)
        }
    }
}

但是這個代碼里有一個問題,在vue中我們其實是無法修改props的,也就是說this.modelValue++會報錯,那么如何解決這個問題呢,答案就是computed,computed其實也可以修改的,我們可以指定它的set方法,這樣就躲避了修改props的問題,從而實現(xiàn)了v-model

{
    computed:{
        num:{
            get(){
                return this.modelValue
            },
            set(val){
                 this.$emit('update:modelValue',val)
            }
        }
    }
}

useAttrs的妙用

在我的組件中有這樣一個功能,上傳。這就涉及到了回調(diào)函數(shù)的問題,也就是說我上傳完,甚至包括方法的名字,這樣才更靈活,比如我們在json中新增一個字段,

{
 uploader: {
     emits: 'handleUploadCover',
 }
}

然后我在渲染的時候會給它綁上這個事件,那么我們?nèi)绾潍@取到這個事件的函數(shù),并調(diào)用呢?

<zForm @handleUploadCover="xxx" />

在vue3中,我使用了useAttrs,需要注意的是vue3這里似乎與vue2有些不同。vue3中,attrs獲取到的是沒有注冊的值,比如你如果在emits里聲明了,在這里就取不到了,不過這也正合我意,我們可以隨意指定事件名。

const attrs = useAttrs()
/*
  返回值
 {
     onHandleUploadCover:function(){xxx}
 }
*/

可以看到這里能獲取事件,只是名字略有不同,這里大家處理一下就行了

表單驗證

表單里最重要的就是驗證.首先在我之前的設計中,表單驗證的規(guī)則是分布在每一個子項中,因此我們需要整合一下,這一塊我就不贅述了,也很簡單。

驗證方法我是直接使用的el-form的驗證,只是封裝了一下罷了。 需要注意的是,如果你用的是script setup,需要使用defineExpose導出這個方法

const validate = ()=> new Promise((resolve) => {
        this.$refs.form.validate((isValid) => resolve(isValid));
      })
 defineExpose({
     validate
 })     

上傳文件

上傳文件這里我其實截取了一下element的上傳,只使用了它選擇的文件的功能,這塊其實可以自己實現(xiàn)的。 因為我上傳中間還要加很多參數(shù),還有驗證,因此我使用了before-upload方法,并主動reject.

 <el-upload
        v-if="item.uploader"
        style="margin-top: 10px"
        :before-upload="(file) => beforeUpload(file, item)"
        :show-file-list="false"
        v-bind="item.uploader.props"
      >
        <el-button type="primary">點擊上傳</el-button>
 </el-upload>
 const beforeUpload = (rawFile, { key, uploader }) => {
     /*執(zhí)行邏輯,其實就是調(diào)起uploader.emits里的方法*/
     return Promise.reject()
 }

代碼總結(jié)

我把demo放到了這里,后續(xù)有時間我整理一下發(fā)個npm包。 stackblitz.com/edit/vue-m8…

這次封裝這個組件,我學到了很多東西,一些比較細微的vue3知識點,比如v-bind。但我也知道這也封裝也有一些問題或者叫爭論。

到底應不應該使用json

之前看過一篇封裝el-table的文章,里面就反對使用json,原因無非2點:json結(jié)構過于龐大,json結(jié)構不利于接手代碼的人使用。

  • 先說第二點,我覺得通過我的定義是可以緩解這個問題的,但是難道你函數(shù)式封裝就沒有學習成本了?我覺得json封裝其實每次就是賦值黏貼,反而學習成本更低,但是開發(fā)成本會更高,你需要處理錯誤的值,錯誤的結(jié)構,因此結(jié)構越簡單越好,甚至可以拍平。
  • json結(jié)構并不龐大,龐大的是我們的表單,如果你表單里幾百個條目,你怎么樣寫都只會龐大,因此還是建議分割表單,及時上報。

需不需要v-model

在我這次封裝中,我把數(shù)據(jù)通過v-model實時返回了,但是當我寫到結(jié)尾的時候,我覺得表單的數(shù)據(jù)并不需要實時,因為我們需要的不是當前的數(shù)據(jù),而是驗證后的正確數(shù)據(jù)。因此我覺得我們可以暴露出一個getData方法,返回驗證正確的數(shù)據(jù)。

性能問題

實際使用中,我發(fā)現(xiàn)這樣封裝似乎有點卡,目前暫時不知道是哪里的問題,有待研究

到此這篇關于JavaScript element的Form表單生成方式的文章就介紹到這了,更多相關JavaScript  Form內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 跟我學習javascript的定時器

    跟我學習javascript的定時器

    跟我學習javascript的定時器,告訴大家具體的使用方法,并向大家提出了一個消息要求,制作一個定時器,有沒有朋友感興趣,挑戰(zhàn)一下
    2015-11-11
  • 微信小程序單選框自定義賦值

    微信小程序單選框自定義賦值

    這篇文章主要介紹了微信小程序單選框如何自定義賦值,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 微信小程序?qū)崿F(xiàn)多行文字滾動效果

    微信小程序?qū)崿F(xiàn)多行文字滾動效果

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)多行文字滾動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • JS判斷是否為JSON對象及是否存在某字段的方法(推薦)

    JS判斷是否為JSON對象及是否存在某字段的方法(推薦)

    下面小編就為大家?guī)硪黄狫S判斷是否為JSON對象及是否存在某字段的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • 關于include標簽導致js路徑找不到的問題分析及解決

    關于include標簽導致js路徑找不到的問題分析及解決

    本文為大家詳細介紹下關于使用jsp:include標簽及<%@ include標簽時要注意的事項以及實測發(fā)現(xiàn)問題并解決問題的全過程,感興趣的各位可以參考下哈,希望對大家有所幫助
    2013-07-07
  • uniapp項目實踐自定義加載組件示例詳解

    uniapp項目實踐自定義加載組件示例詳解

    這篇文章主要為大家介紹了uniapp項目實踐自定義加載組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • javascript中的緩動效果實現(xiàn)程序

    javascript中的緩動效果實現(xiàn)程序

    javascript中的緩動效果可以應用于很多地方,比如距離位移上的變化:圖片的滾動、焦點圖的輪轉(zhuǎn)切換,透明度上的變化:漸隱漸現(xiàn)。凡是存在運動的狀態(tài)都適用,下面以最基本的塊在容器內(nèi)從左到右滑動為例,講下幾種不同的緩動處理方式
    2012-12-12
  • JavaScript門面模式詳解

    JavaScript門面模式詳解

    這篇文章主要為大家詳細介紹了JavaScript門面模式的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • JS實現(xiàn)仿新浪黃色經(jīng)典滑動門效果代碼

    JS實現(xiàn)仿新浪黃色經(jīng)典滑動門效果代碼

    這篇文章主要介紹了JS實現(xiàn)仿新浪黃色經(jīng)典滑動門效果代碼,是一款非常簡單的經(jīng)典鼠標響應滑動切換效果,涉及JavaScript基于鼠標事件動態(tài)操作頁面元素的技巧,需要的朋友可以參考下
    2015-09-09
  • 小程序顯示彈窗時禁止下層的內(nèi)容滾動實現(xiàn)方法

    小程序顯示彈窗時禁止下層的內(nèi)容滾動實現(xiàn)方法

    這篇文章主要介紹了小程序顯示彈窗時禁止下層的內(nèi)容滾動實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03

最新評論