iT邦幫忙

1

Vue框架加上Bootstrap5 modal ?

  • 分享至 

  • xImage
  •  

在專案開始時遇到一個問題,就是關於Modal該如何關閉,如何開啟?
當然可以用data-bs-target,data-bs-dismiss,但是會有相對的副作用,@keyup.enter,modal遮罩轉址後依舊會在。

想寫這篇文章的原因是因為看了這篇---->

Vue框架搭配Bootstrap modal
https://harry811016.medium.com/vue%E6%A1%86%E6%9E%B6%E6%90%AD%E9%85%8Dbootstrap-modal-df6038628d6e

後來認真看官方文件還有Stackoverflow後,就解決了。

正文開始 Go!

我們都知道Bootstrap5已經不需要依賴JQuery就可以獨立作業了
相對地來說,以往boootstrap很多功能都依賴 JQuery。例如Modal的操控。

bootstrap5,捨棄了JQuery,改成使用回原生的JS DOM來操作功能
BS5這樣的改動讓所需要加載的資源更少,提升了網頁讀取的速度,讓使用者的體驗有進一步的提升。

Bootstrap5之前的版本,就拿modal最常用的hide,show來示範,Bootstrap4操控方法是以下這樣
Bootstrap4很像手遊的一鍵掃盪,把以下語法丟進去函式就可以動作了...還很方便QQ

 .modal('show')
 手動打開動態視窗。 在動態視窗實際顯示之前返回給調用者(即在shown.bs.modal 事件發生之前)。
 $('#myModal').modal('show')
.modal('hide')
手動隱藏動態視窗。 在動態視窗實際隱藏之前返回給調用者(即在 hidden.bs.modal 事件發生之前)。
$('#myModal').modal('hide')

但是到了bootstrap 5則是變成原生js 操作DOM來控制,來看看官方文件怎麼說

傳遞選項
將你的內容啟用為互動視窗,接受一個選擇性的 object 選項。
var modalToggle = document.getElementById('toggleMyModal') // relatedTarget
myModal.show(modalToggle)

var myModal = new bootstrap.Modal(document.getElementById('myModal'), {
  keyboard: false
})
show
手動打開動態視窗。在動態視窗實際顯示之前返回給調用者(即在 shown.bs.modal 事件發生之前)。
myModal.show()
hide
手動隱藏動態視窗。在動態視窗實際隱藏之前返回給調用者(即在 hidden.bs.modal 事件發生之前)。
myModal.hide()

用專案中登入註冊的modal來示範

這段是modal裡面的input,Modal的id為 #login
<div class="form-group">
             <label for="password" class="fs-6 fw-bolder">Password</label>
               <input type="password" v-model="password" class="form-control"
                   id="password"placeholder="Password" autocomplete="off"
                    @keyup.enter="register"/>
</div>

我們當然可以像上面說的一樣用data-bs-target,data-bs-dismiss,data-bs-toggle來對應modal,但是變相地說你只能手動點擊登入按鈕。這樣使用者體驗會很差。而且如果在input輸入完密碼想直接用@keyup.enter來呼叫登入函式,會造成modal遮罩跳轉(跳去會員中心...等等)沒有消失,你必須重新整理....

那用5該怎麼做到呢?


我們得在data設定modal為空字串,null也可以。


import { Modal } from 'bootstrap'

export default {
  name: "Login",
  props: {
    
  },
  data() {
    return {
      name: null,
      email: null,
      password: null,
      modal:''
    };
  },
};


接著我們在

mounted() {
      this.modal = new Modal(document.getElementById('login'))
      // 監聽modal 用id取得你要的modal
      把你要取得的modal資料賦予到剛剛設定空值的modal裡面

這時候打開vue devtools 可以看到

modal

成功取得你要的modal資料了。

(QAQ 插入成功可是破圖 )

再來就是寫一個hide modal的函式
記得上面的程式碼嗎?

hide
手動隱藏動態視窗。在動態視窗實際隱藏之前返回給調用者(即在 hidden.bs.modal 事件發生之前)。
myModal.hide()

我們在methods裡面建立一個函式叫做
 closeModal() {
         this.modal.hide()
        //  設定modal hide 
      }
再來我們回到你要呼叫closeModal這個函式的地方。

這裡我的需求是在login還有register要呼叫

login() {
      const auth = getAuth();
        signInWithEmailAndPassword(auth, this.email, this.password)
        .then((userCredential) => {
          const user = userCredential.user;
          Swal.fire({
            position: "center",
            icon: "success",
            title: "登入成功",
            showConfirmButton: false,
            timer: 1500,
          });
          this.closeModal();
          // 呼叫關閉login Modal
          this.$router.replace("admin");
        })
        .catch((error) => {
          const errorCode = error.code;
          const errorMessage = error.message;
          if (errorCode === "auth/wrong-password") {
            // 密碼錯誤提醒
            Swal.fire({
              position: "center",
              icon: "error",
              title: "密碼錯誤",
              showConfirmButton: false,
              timer: 2000,
            });
          } else {
            // 其他錯誤提醒
            Swal.fire({
              position: "center",
              icon: "error",
              title: "密碼錯誤或信箱尚未註冊",
              showConfirmButton: false,
              timer: 2000,
            });
          }
          console.log(error);
        });
    },
    
    
    

我們就在你要的函式內呼叫剛剛所建立的closeModal函式,這樣input 輸入完密碼 @keyup.enter="login"
將要轉址到admin分頁的時候,剛剛所打開的#login modal就會關閉,並且轉址後,轉址後的body沒有遮罩了。

下次做vue專案時,要用bootstrap-vue了,相容性更好的樣子?
以上這個方法也是去翻bootstrap-vue的modal的 Docs得到的靈感。

第二次發文,若有錯誤敬請見諒,請您留言提出,我會繼續精進

希望這篇文能夠幫到也有遇到這個問題的朋友們

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言