element--Diaolog彈窗打開(kāi)之后渲染組件方式
element--Diaolog彈窗打開(kāi)之后渲染組件
描述
父子兩個(gè)組件,父組件打開(kāi)子組件彈窗,然后執(zhí)行方法請(qǐng)求接口,獲取數(shù)據(jù)之后渲染頁(yè)面,且每次點(diǎn)擊都執(zhí)行該方法。
遇到的問(wèn)題
最開(kāi)始簡(jiǎn)單地將方法放在子組件mounted里面,只有第一次打開(kāi)彈窗會(huì)執(zhí)行方法。
了解到,彈窗只創(chuàng)建了一次。所以,在想是不是可以用keep-alive模式下的actived,然而并沒(méi)有什么用。actived和deactived只在keep-alive使用時(shí)生效。
然后想到在打開(kāi)彈窗時(shí)候,強(qiáng)行調(diào)用子組件的方法
// initForm: 子組件方法 // this.dialog.data.id: 子組件的請(qǐng)求接口的參數(shù) this.$refs.dialog.initForm(this.dialog.data.id)
這次算是ok了,但是僅僅這樣還不夠。多次請(qǐng)求接口發(fā)現(xiàn),如果接口請(qǐng)求速度夠快,方法會(huì)提前執(zhí)行,渲染組件。
這本來(lái)不是什么壞事,壞就壞在渲染階段。如果數(shù)據(jù)先一步到位,然后開(kāi)始渲染組件,這時(shí)候彈窗還沒(méi)有創(chuàng)建虛擬dom,會(huì)有bug。例如:我的彈窗如果是一個(gè)echart的圖表,需要綁定一個(gè)dom節(jié)點(diǎn)進(jìn)行渲染。節(jié)點(diǎn)都沒(méi)有渲染出來(lái),就會(huì)報(bào)錯(cuò)。
所以,第一次使用時(shí)候采用的方案:
直接在調(diào)用子組件方法的外面包了一個(gè)setTimeout,讓彈窗飛一會(huì),然后再渲染。
后面回過(guò)頭看了一下,其實(shí)不用這么麻煩,element中彈窗組件有個(gè)回調(diào)函數(shù)

選擇opened
<el-button @click="edit(id)">修改</el-button>
<el-button @click="add">新增</el-button>
<el-dialog
:title="dialog.title"
:visible.sync="dialog.visible"
:width="dialog.width"
center
@opened="initForm"> <!-- element自帶的彈窗打開(kāi)回調(diào)函數(shù) -->
<component :is="dialog.name" ref="dialog"></component><!-- 動(dòng)態(tài)組件:子組件 -->
</el-dialog>
<script>
import { Add, Edit } from './Dialog'
export default {
components: {
Add,
Edit
},
data () {
return {
dialog: { // 彈窗組件傳遞數(shù)據(jù)
title: '',
visible: false,
width: '',
name: '' // 組件名
}
}
},
methods: {
// 新增鏈接配置信息
add () {
this.dialog = {
visible: true,
title: '新增連接配置信息',
width: '1000px',
name: 'add-config'
}
},
// 編輯修改設(shè)備信息
edit (id) {
this.dialog = {
visible: true,
title: '修改連接配置信息',
width: '1000px',
name: 'edit-config',
data: id
}
},
// 彈窗打開(kāi)回調(diào)(更新數(shù)據(jù))
initForm () {
switch (this.dialog.name) {
case 'add':
this.$refs.dialog.initForm()
break
case 'edit':
this.$refs.dialog.initForm(this.dialog.data.id)
break
default:
break
}
}
}
}
</script>Element組件的坑: 抽屜drawer和彈窗dialog
業(yè)務(wù)場(chǎng)景
因?yàn)轫?xiàng)目需要封裝組件,考慮二次封裝抽屜組件el-drawer,在父組件控制抽屜組件的顯示隱藏。需要在指定的組件中打開(kāi)抽屜。在抽屜組件el-drawer里使用自己封裝的一個(gè)自定義組件。
存在以下兩個(gè)大問(wèn)題:
- 父組件控制抽屜組件的顯示隱藏效果無(wú)法呈現(xiàn)
- 抽屜組件里的自定義組件沒(méi)有加載/創(chuàng)建出來(lái)
針對(duì)第一個(gè)問(wèn)題,具體解決方案如下
父組件:
<Drawer :isShowDrawer.sync = "isShowDrawer" @closeDrawer="isShowDrawer = $event"></Drawer>
子組件Drawer:
<el-drawer :visible.sync="isShow" direction="rtl" ref="drawerExam"></el-drawer>
...
props: {
isShowDrawer: {
type: Boolean,
default: false
},
},
computed: {
isShow: {
set(val) {
this.$emit('closeDrawer', val);
},
get() {
return this.isShowDrawer;
}
},
},
若想實(shí)現(xiàn),在指定的組件中打開(kāi)抽屜,需要添加以下樣式
父組件樣式:
{
position: relative;
overflow: hidden;
}抽屜組件:
設(shè)置position為絕對(duì)定位,但是會(huì)出現(xiàn)一個(gè)問(wèn)題:v-modal遮罩層是滿屏顯示的

因此最終解決方案為:
先在抽屜組件外套一層div標(biāo)簽,再修改內(nèi)部樣式
<div class="drawerExam-container">
<el-drawer :visible.sync="isShow" direction="rtl" ref="drawerExam" @open="openDrawer()"></el-drawer>
</div>
...
.drawerExam-container {
::v-deep .v-modal {
position: absolute;
}
}針對(duì)第二個(gè)問(wèn)題,具體解決方案如下
在抽屜組件里,引入了自己封裝的組件Checkbox,不能出現(xiàn)的原因是:Element官網(wǎng)有提到

如下我在抽屜組件中引入了Checkbox(自己封裝的組件),其中,dataList是父組件傳給Checkbox的數(shù)據(jù),chooseClass是Checkbox返回來(lái)的數(shù)據(jù)
<el-drawer :visible.sync="isShow" direction="rtl" ref="drawerExam" @open="openDrawer()">
<Checkbox :dataList="easy" @chooseEasy="updateForm" ref="easyRef"></Checkbox>
</el-drawer>解決方法:
給el-drawer增加open回調(diào)函數(shù)
通過(guò)使用Checkbox內(nèi)部方法賦值的方式,讓Checkbox組件能夠擁有值(因?yàn)樵贑heckbox組件內(nèi)接收不到父組件傳過(guò)去的dataList,才考慮使用Checkbox組件內(nèi)部方法直接給組件賦值
el-drawer的open回調(diào)函數(shù):
...
openDrawer() {
this.$nextTick(() => {
setTimeout(() => {
this.$refs.easyRef.UpdateList(this.easy);
}, 0)
})
},
Checkbox組件:
...
UpdateList(arr) {
this.newDataList = arr;
// 置空該組件原有的值
this.checkboxGroup = [];
this.chooseEasy();
},
// 多選選中后給父組件傳值
chooseEasy() {
this.$emit('chooseEasy', this.checkboxGroup);
},總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺析Vue中defineProps的解構(gòu)和不解構(gòu)
defineProps?是?Vue?3?Composition?API?中用來(lái)聲明組件接收的?props?的方法,本文主要為大家介紹了defineProps的解構(gòu)和不解構(gòu),感興趣的可以了解下2025-02-02
解決vue 綁定對(duì)象內(nèi)點(diǎn)擊事件失效問(wèn)題
今天小編就為大家分享一篇解決vue 綁定對(duì)象內(nèi)點(diǎn)擊事件失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue-cli 3.0 版本與3.0以下版本在搭建項(xiàng)目時(shí)的區(qū)別詳解
這篇文章主要介紹了vue-cli 3.0 版本與3.0以下版本在搭建項(xiàng)目時(shí)的區(qū)別詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
圖片預(yù)覽插件vue-photo-preview的使用示例詳解
這篇文章主要介紹了圖片預(yù)覽插件vue-photo-preview的使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
vue組件之間數(shù)據(jù)傳遞的方法實(shí)例分析
這篇文章主要介紹了vue組件之間數(shù)據(jù)傳遞的方法,結(jié)合實(shí)例形式分析了vue.js父組件與子組件之間數(shù)據(jù)傳遞相關(guān)操作技巧,需要的朋友可以參考下2019-02-02
vue項(xiàng)目中存儲(chǔ)與使用后端傳遞過(guò)來(lái)的token
vue作為一個(gè)單頁(yè)面應(yīng)用,vuex作為它的狀態(tài)管理工具,它至少是可以很好的保存這個(gè)token值,下面這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目中存儲(chǔ)與使用后端傳遞過(guò)來(lái)的token的相關(guān)資料,需要的朋友可以參考下2023-03-03
Vue v-bind動(dòng)態(tài)綁定class實(shí)例方法
在本篇文章里小編給大家分享的是一篇關(guān)于Vue—v-bind動(dòng)態(tài)綁定class的知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以參考下。2020-01-01
vue給input file綁定函數(shù)獲取當(dāng)前上傳的對(duì)象完美實(shí)現(xiàn)方法
這篇文章主要介紹了vue給input file綁定函數(shù)獲取當(dāng)前上傳的對(duì)象完美實(shí)現(xiàn)方法,需要的朋友可以參考下2017-12-12

