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

溫馨提示×

溫馨提示×

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

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

vue+el-element中根據文件名動態創建dialog的方法是什么

發布時間:2021-12-27 12:26:53 來源:億速云 閱讀:212 作者:柒染 欄目:開發技術

這篇文章給大家介紹vue+el-element中根據文件名動態創建dialog的方法是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

背景

在項目中使用對話框的通常做法是把對話框封裝成組件,在使用的地方引入,然后添加到template,使用visible.sync控制對話框的顯示/隱藏,監聽confirm事件處理用戶點擊確定。如下:

 <confirm-dialog
     v-if="confirmDialogVisible"
     :title="$t(`mineData.tips.deleteDataset`)"
     :visible.sync="confirmDialogVisible"
     @confirm="confimHandler"
 ></confirm-dialog>

 在封裝的dialog內部也需要在關閉時更新visible,確定時觸發confirm事件:

 methods: {
    close() {
        this.$emit("update:visible", false);
    },
    confirm() {
        this.close();
        this.$emit("confirm");
    }
}

這樣的做法不僅僅導致頁面初始化時引入所有對話框組件而影響加載速度,更頭疼的是頁面中引入了很多對話框時,會導致頁面很雜亂:需要為每個對話框插入一段html,為每個對話框維護一個單獨的visible變量,為每個對話框添加confirm事件監聽...

而這些操作大部分是和業務無關的,且這些操作又是極其相似的。

那么,有沒有通過js動態創建dialog的方法呢?

createDialog("confirm-dialog.vue");

就像上面這樣根據文件名即可打開對話框,不用定義visible及添加一堆html和事件回調,甚至不需要先引入對話框組件!

是不是很簡單!心動了吧?看下去吧。

實現

1.封裝的/utils/dialogControl.js

import Vue from 'vue'
async function createDialog (fileName, data) {
  const dialogsContext = require.context(
    '../components', // 定義查找文件的范圍
    true,
    /([a-zA-Z\-0-9]+)\.vue$/, // 定義文件名規則
    'lazy'
  )
  // 查找到傳入名字的文件并加載該文件
  let match = dialogsContext.keys().find((key) => key.includes(fileName))
  if (!match) return
  let componentContext = await dialogsContext(match)
  let temp = componentContext.default
  return new Promise(function (resolve, reject) {
    // 初始化配置參數
    let opt = {
      data
    }
    let component = Object.assign({}, temp)
    let initData = {
      visible: true
    }
    Object.assign(initData, component.data())
    opt.data && Object.assign(initData, JSON.parse(JSON.stringify(opt.data)))
    component.data = function () {
      return initData
    }
    // 創建構造器創建實例掛載
    let DialogC = Vue.extend(component)
    let dialog = new DialogC()
    // 關閉事件
    let _onClose = dialog.$options.methods.onClose
    dialog.onClose = function () {
      resolve()
      dialog.$destroy()
      _onClose && _onClose.call(dialog)
      document.body.removeChild(dialog.$el)
    }
    // 回調事件
    let _onCallback = dialog.$options.methods.onCallback
    dialog.onCallback = function (...arg) {
      try {
        _onCallback && _onCallback()
        resolve(arg)
        dialog.$destroy()
        _onClose && _onClose.call(dialog)
        document.body.removeChild(dialog.$el)
      } catch (e) {
        console.log(e)
      }
    }
    dialog.$mount()
    // 點擊關閉按鈕時會改變visible
    dialog.$watch('visible', function (n, o) {
      dialog === false && dialog.onClose()
    })
    document.body.appendChild(dialog.$el)
  })
}

export { createDialog }

說明:
1.需要指定查找文件的路徑及匹配名稱的正則表達式,這樣能過濾掉一些不需要的文件

2.接收一個fileName參數用于匹配要打開的對話框文件,data參數是傳遞給對話框的數據,會合并到組件的data中

3.使用visible變量控制對話框的顯示/隱藏

4.定義了一個onClose方法用于關閉對話框,對話框中可以使用該方法進行關閉

5.onCallback方法用于向調用對話框的父組件傳值,如點擊確定按鈕時向父組件傳值

2.dialog文件定義

如/components/ConfirmDialog.vue,使用visible變量控制顯示/隱藏,onClose處理關閉事件,確定按鈕的回調是onCallback(和dialogControl.js中的定義一致)。

<template>
    <el-dialog title="提示" :visible.sync="visible" width="30%">
        <span>Lorem, ipsum dolor sit amet consectetur adipisicing elit. Nesciunt quis
            perspiciatis fugiat molestiae provident accusantium repudiandae fugit
            minima, eaque, repellat quibusdam iste sed ad? Debitis qui praesentium
            minus incidunt esse!</span>
        <span slot="footer" class="dialog-footer">
            <el-button @click="onClose">取 消</el-button>
            <el-button type="primary" @click="onCallback(true)">確 定</el-button>
        </span>
    </el-dialog>
</template>

<script>
export default {
  data () {
    return {}
  },
  methods: {
  }}
</script>

 3.使用

 引入dialogControl中的createDialog方法,直接傳入文件名稱即可打開。

如果有其他的屬性,則以鍵值對的形式放入第二個參數,這些屬性會合并到對話框組件的data中,因此對話框組件中可以直接使用這些屬性。

createDialog方法得到一個promise對象,其then方法能得到confirm返回的結果。

<template>
  <div>
    <h2>This is an show page</h2>
    <el-button type="primary" @click="openDialog">打開</el-button>
  </div>
</template>

<script>
import { createDialog } from "@/utils/dialogControl";
export default {
  methods: {
    openDialog() {
      let dialog = createDialog("confirm-dialog.vue");
      dialog.then((v) => {
        if (v) {
          console.info("確定");
        }
      });
    },
  },
};
</script>

效果如下:

vue+el-element中根據文件名動態創建dialog的方法是什么 

關于vue+el-element中根據文件名動態創建dialog的方法是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

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

AI

资阳市| 左权县| 鹰潭市| 娱乐| 镇宁| 梓潼县| 尉氏县| 鹤岗市| 历史| 个旧市| 英山县| 辉县市| 海阳市| 宾川县| 邹城市| 江门市| 海晏县| 大庆市| 溆浦县| 西盟| 丹阳市| 大洼县| 永泰县| 仁化县| 贺州市| 越西县| 普兰县| 墨江| 哈密市| 丁青县| 正安县| 南漳县| 舟山市| 凤城市| 迭部县| 江门市| 太仆寺旗| 辽中县| 德昌县| 德清县| 横山县|