您好,登錄后才能下訂單哦!
本篇內容介紹了“element Diaolog彈窗打開后怎么渲染組件”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
父子兩個組件,父組件打開子組件彈窗,然后執行方法請求接口,獲取數據之后渲染頁面,且每次點擊都執行該方法。
最開始簡單地將方法放在子組件mounted里面,只有第一次打開彈窗會執行方法。
了解到,彈窗只創建了一次。所以,在想是不是可以用keep-alive模式下的actived,然而并沒有什么用。actived和deactived只在keep-alive使用時生效。
然后想到在打開彈窗時候,強行調用子組件的方法
// initForm: 子組件方法 // this.dialog.data.id: 子組件的請求接口的參數 this.$refs.dialog.initForm(this.dialog.data.id)
這次算是ok了,但是僅僅這樣還不夠。多次請求接口發現,如果接口請求速度夠快,方法會提前執行,渲染組件。
這本來不是什么壞事,壞就壞在渲染階段。如果數據先一步到位,然后開始渲染組件,這時候彈窗還沒有創建虛擬dom,會有bug。例如:我的彈窗如果是一個echart的圖表,需要綁定一個dom節點進行渲染。節點都沒有渲染出來,就會報錯。
所以,第一次使用時候采用的方案:
直接在調用子組件方法的外面包了一個setTimeout,讓彈窗飛一會,然后再渲染。
后面回過頭看了一下,其實不用這么麻煩,element中彈窗組件有個回調函數
選擇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自帶的彈窗打開回調函數 --> <component :is="dialog.name" ref="dialog"></component><!-- 動態組件:子組件 --> </el-dialog> <script> import { Add, Edit } from './Dialog' export default { components: { Add, Edit }, data () { return { dialog: { // 彈窗組件傳遞數據 title: '', visible: false, width: '', name: '' // 組件名 } } }, methods: { // 新增鏈接配置信息 add () { this.dialog = { visible: true, title: '新增連接配置信息', width: '1000px', name: 'add-config' } }, // 編輯修改設備信息 edit (id) { this.dialog = { visible: true, title: '修改連接配置信息', width: '1000px', name: 'edit-config', data: id } }, // 彈窗打開回調(更新數據) 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>
因為項目需要封裝組件,考慮二次封裝抽屜組件el-drawer,在父組件控制抽屜組件的顯示隱藏。需要在指定的組件中打開抽屜。在抽屜組件el-drawer里使用自己封裝的一個自定義組件。
存在以下兩個大問題:
父組件控制抽屜組件的顯示隱藏效果無法呈現
抽屜組件里的自定義組件沒有加載/創建出來
父組件:
<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; } }, },
若想實現,在指定的組件中打開抽屜,需要添加以下樣式
父組件樣式:
{ position: relative; overflow: hidden; }
抽屜組件:
設置position為絕對定位,但是會出現一個問題:v-modal遮罩層是滿屏顯示的
因此最終解決方案為:
先在抽屜組件外套一層div標簽,再修改內部樣式
<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; } }
在抽屜組件里,引入了自己封裝的組件Checkbox,不能出現的原因是:Element官網有提到
如下我在抽屜組件中引入了Checkbox(自己封裝的組件),其中,dataList是父組件傳給Checkbox的數據,chooseClass是Checkbox返回來的數據
<el-drawer :visible.sync="isShow" direction="rtl" ref="drawerExam" @open="openDrawer()"> <Checkbox :dataList="easy" @chooseEasy="updateForm" ref="easyRef"></Checkbox> </el-drawer>
解決方法:
給el-drawer增加open回調函數
通過使用Checkbox內部方法賦值的方式,讓Checkbox組件能夠擁有值(因為在Checkbox組件內接收不到父組件傳過去的dataList,才考慮使用Checkbox組件內部方法直接給組件賦值
el-drawer的open回調函數: ... 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); },
“element Diaolog彈窗打開后怎么渲染組件”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。