公共組件父子依賴調(diào)用及子校驗(yàn)父條件問題解決
問題背景
業(yè)務(wù)需求需要用到一個(gè)數(shù)據(jù)批量上傳和上傳模板導(dǎo)入功能,并且在很多個(gè)頁面中都需要用到。但是每個(gè)頁面調(diào)用的上傳或模版下載依賴的接口地址或者接口方法都有區(qū)別?;诖耍胍獙⑦@個(gè)公共上傳組件抽離出來,并且盡量低耦合,能夠滿足不同頁面的調(diào)用和傳參。
以下言論,是一個(gè)小白解決問題的過程,若思考思路和知識(shí)面限制,還請(qǐng)各路大佬指點(diǎn)
- 痛點(diǎn)一:如何解決不同頁面的接口調(diào)用方法依賴問題
- 痛點(diǎn)二:如何解決在調(diào)用頁面執(zhí)行組件內(nèi)部的某些方法前,如何添加父級(jí)組件層面的校驗(yàn)問題
關(guān)于依賴
嘗試動(dòng)態(tài)注入依賴
import
關(guān)于痛點(diǎn)一,第一個(gè)想到的,就是能不能執(zhí)行依賴的動(dòng)態(tài)注入,但是所有的接口調(diào)用方法均按模塊封裝成api.js文件,并且模塊中通過export 進(jìn)行導(dǎo)出,需要使用import { xxx } form './XXXpath'導(dǎo)出到組件中,方能進(jìn)行使用。并且import導(dǎo)入為靜態(tài)導(dǎo)入,于是放棄這個(gè)嘗試。
require
接下來想到另一個(gè)導(dǎo)入的方式require,但是require導(dǎo)入的是一個(gè)模塊(具體了解CommonJS),而接口api.js 如果重新改動(dòng),牽扯太多,于是也放棄此法。
其他思考
如果將api.js放到公共組件中,則耦合度會(huì)很高,后期新增或者修改接口依賴,或者進(jìn)行其他擴(kuò)展,就要傷筋動(dòng)骨,不符合低耦合的理念,因此不考慮在組件內(nèi)部注入相關(guān)接口依賴。
解決辦法
既然不打算將接口依賴放到組件中,那么就只有暴露出來給父級(jí)組件,在某些時(shí)間的時(shí)候,調(diào)用某些接口,執(zhí)行某些方法。
部分代碼如下:
<div class="AS-upload"> <div class="uploaded-list" v-if="uploadFileNameList.length > 0"> 【已上傳文件】<span class="file-name" v-for="(name,index) in uploadFileNameList" :key="index">{{ name }}</span> </div> <div class="upload-header"> <div class="action-buttons"> <el-upload ref="upload" class="upload-demo" :action="uploadUrl" :headers="headers" :data="uploadParams" :on-remove="handleRemove" :before-remove="beforeRemove" :before-upload="beforeUpload" :on-change="handleChange" :on-success="handleSuccess" :on-error="handleError" :file-list="fileList" :limit="1" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel" :auto-upload="false" > <el-button slot="trigger" size="mini" type="primary">選擇表單</el-button> <el-button size="mini" type="success" @click="uploadClick">上傳</el-button> </el-upload> </div> <div class="tools-buttons"> <ASTemplateDownload :path="templatePath" :export-name="exportName"></ASTemplateDownload> </div> </div> <div class="upload-footer"> <el-button size="mini" type="primary" @click="submitBatchAdd">提交</el-button> <el-button size="mini" type="default" @click="uploadClose">取消</el-button> </div> </div>
js只拿一個(gè)方法進(jìn)行舉例 uploadClick()上傳按鈕點(diǎn)擊,此處的判斷this.isVerify是用于父級(jí)條件校驗(yàn)的,后面會(huì)說到,現(xiàn)在先不展開。
//點(diǎn)擊上傳 uploadClick() { `是否需要校驗(yàn):${this.isVerify ? '需要' : '不需要'}` if (this.isVerify) { this.$emit('upload-click', null); return false; } this.uploadHandler(); }, //上傳處理函數(shù) uploadHandler() { //前置判斷:1、必須已選擇文件 if (this.fileList.length === 0 && this.uploadedIds.length === 0) { this.$message.error('請(qǐng)先選擇要上傳的Excel文件'); return false; } //判斷是否已經(jīng)上傳過文件,已上傳的話,調(diào)用取消接口,將對(duì)應(yīng)需求單id請(qǐng)求取消接口,清空后端臨時(shí)數(shù)據(jù),清空完成后,清空已上傳文件名、id,同時(shí)開始觸發(fā)文件上傳邏輯 if (this.uploadedIds.length !== 0) { //拋出上傳取消事件 this.$emit('upload-cancel', this.uploadedIds[0]); } if (this.fileList.length !== 0) { this.uploadLoading = this.$message({ message: '文件上傳中,請(qǐng)稍后...', showClose: true, iconClass: 'el-icon-loading', duration: 0 }) this.$refs.upload.submit(); } else { this.$message.error('請(qǐng)先選擇一個(gè)文件'); } },
可以看到,在執(zhí)行某些操作的時(shí)候,都在公共組件中,利用$emit將事件拋出,然后在父組件進(jìn)行事件監(jiān)聽:this.$emit('upload-click', null);
父組件html部分,通過監(jiān)聽事件@upload-click,并在js中寫一個(gè)方法進(jìn)行接收
<!-- 父級(jí)組件調(diào)用組件--> <ASUpload ref="ASUpload" is-verify :upload-url="uploadUrl" :upload-params="uploadParams" template-path="/static/template/xxx.xlsx" export-name="xxx.xlsx" @close="uploadClose" @upload-click="uploadClick" @upload-error="uploadError" @upload-cancel="uploadCancel" @upload-submit="uploadSubmit" ></ASUpload>
父組件js部分
//上傳前校驗(yàn) uploadClick(){ if( !this.uploadVerify()) return false; //調(diào)用接口等其他業(yè)務(wù)邏輯 //... //校驗(yàn)完成后,手動(dòng)調(diào)用上傳 this.$refs.ASUpload.uploadHandler(); },
以上,就將接口依賴,從公共組件中解耦出來了。
子組件校驗(yàn)父組件條件
上面的代碼有用到一個(gè)isVerify字段,這個(gè)字段是用于判斷是否需要進(jìn)行校驗(yàn)的標(biāo)識(shí)。 以上傳操作為例子,點(diǎn)擊之后,判斷該字段,如不需要校驗(yàn),則直接執(zhí)行默認(rèn)上傳方法
/** props*/ props:{ //是否需要校驗(yàn),校驗(yàn)通過后才傳入允許上傳,傳入true,則需要手動(dòng)調(diào)用組件內(nèi)部的上傳方法 isVerify: { type: Boolean, default: false, }, } /** methods */ //點(diǎn)擊上傳 uploadClick() { `是否需要校驗(yàn):${this.isVerify ? '需要' : '不需要'}` if (this.isVerify) { this.$emit('upload-click', null); return false; } this.uploadHandler(); },
將上傳邏輯根據(jù)判斷進(jìn)行分流,當(dāng)組件外的父級(jí)需要做某些判斷的時(shí)候,此處上傳需要額外校驗(yàn)其他參數(shù)不能為空,在父級(jí)執(zhí)行完校驗(yàn)之后,在通過$refs手動(dòng)調(diào)用公共組件中的uploadHandler方法。
總結(jié)
至此,基本解決了公共組件和父組件之間的依賴耦合問題和公共組件調(diào)用父組件校驗(yàn)的問題。 以上為本人拙見,記錄一次bug解決的過程,希望給有需要的人帶去一點(diǎn)思路。只要思想不滑坡,辦法總比問題多~
以上就是公共組件父子依賴調(diào)用及子校驗(yàn)父條件問題解決的詳細(xì)內(nèi)容,更多關(guān)于公共組件父子依賴調(diào)用校驗(yàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue之?dāng)?shù)據(jù)交互實(shí)例代碼
本篇文章主要介紹了vue之?dāng)?shù)據(jù)交互實(shí)例代碼,vue中也存在像ajax和jsonp的數(shù)據(jù)交互,實(shí)現(xiàn)向服務(wù)器獲取數(shù)據(jù),有興趣的可以了解一下2017-06-06如何構(gòu)建 vue-ssr 項(xiàng)目的方法步驟
這篇文章主要介紹了如何構(gòu)建 vue-ssr 項(xiàng)目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Vue SPA 初次進(jìn)入加載動(dòng)畫實(shí)現(xiàn)代碼
今天小編就為大家分享一篇Vue SPA 初次進(jìn)入加載動(dòng)畫實(shí)現(xiàn)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11Element輸入框帶歷史查詢記錄的實(shí)現(xiàn)示例
這篇文章主要介紹了Element輸入框帶歷史查詢記錄的實(shí)現(xiàn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01vue中vue-cli項(xiàng)目報(bào)錯(cuò)sockjs.js報(bào)錯(cuò)問題
這篇文章主要介紹了vue中vue-cli項(xiàng)目報(bào)錯(cuò)sockjs.js報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-12-12使用vite構(gòu)建vue3項(xiàng)目的實(shí)現(xiàn)步驟
通過本文,您可以了解如何使用Vue CLI創(chuàng)建Vue 3項(xiàng)目,配置Vite,利用其優(yōu)勢(shì)進(jìn)行開發(fā),具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08vue使用video插件vue-video-player詳解
這篇文章主要為大家詳細(xì)介紹了vue使用video插件vue-video-player,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10vue3使用elementPlus進(jìn)行table合并處理的示例詳解
虛擬數(shù)據(jù)中公司下有多個(gè)客戶,公司一樣的客戶,公司列需要合并,客戶如果一樣也需要合并進(jìn)行展示,所以本文給大家介紹了vue3使用elementPlus進(jìn)行table合并處理的實(shí)例,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02