91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

element Diaolog彈窗打開后怎么渲染組件

發布時間:2023-01-16 09:45:53 來源:億速云 閱讀:130 作者:iii 欄目:開發技術

本篇內容介紹了“element Diaolog彈窗打開后怎么渲染組件”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    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中彈窗組件有個回調函數

    element Diaolog彈窗打開后怎么渲染組件

    選擇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>

    Element組件的坑: 抽屜drawer和彈窗dialog

    業務場景

    因為項目需要封裝組件,考慮二次封裝抽屜組件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遮罩層是滿屏顯示的

    element Diaolog彈窗打開后怎么渲染組件

     因此最終解決方案為:

    先在抽屜組件外套一層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官網有提到

    element Diaolog彈窗打開后怎么渲染組件

    如下我在抽屜組件中引入了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彈窗打開后怎么渲染組件”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    吉木乃县| 涟水县| 华池县| 奉节县| 荃湾区| 赤峰市| 都匀市| 道孚县| 邹平县| 阿瓦提县| 安乡县| 时尚| 英超| 汕头市| 纳雍县| 巴林右旗| 丹巴县| 津南区| 彰武县| 无棣县| 闵行区| 运城市| 黑龙江省| 铜陵市| 垫江县| 德钦县| 西和县| 会理县| 上栗县| 邹城市| 玉山县| 普兰店市| 西充县| 尤溪县| 太保市| 丹东市| 怀集县| 文成县| 玉林市| 特克斯县| 上虞市|