JSFiddle - React, Tailwind, and code Playground

by Alexey Zakharov

HTML

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>


  <div id="exampleModal">
    <!-- Button trigger modal-->
    <button class="btn btn-primary" type="button" @click="showModal = !showModal" @keyup.esc="showModal = false">Launch demo modal</button>
    <!-- Modal-->
    <transition @enter="startTransitionModal" @after-enter="endTransitionModal" @before-leave="endTransitionModal" @after-leave="startTransitionModal">
      <div class="modal fade" v-if="showModal" ref="modal" @click.self="showModal = false">
        <div class="modal-dialog" role="document">
          <div class="modal-content">
            <div class="modal-header">
              <h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
              <button class="close" type="button" @click="showModal = false"><span aria-hidden="true">×</span></button>
            </div>
            <div class="modal-body">...</div>
            <div class="modal-footer">
              <button class="btn btn-secondary" @click="showModal = false">Close</button>
              <button class="btn btn-primary" type="button">Save changes</button>
            </div>
          </div>
        </div>
      </div>
    </transition>
    <div class="modal-backdrop fade d-none" ref="backdrop"></div>
  </div>

JavaScript

var vm = new Vue({
  el: "#exampleModal",
  data: {
    showModal: false,
  },
  methods: {
    startTransitionModal() {
      vm.$refs.backdrop.classList.toggle("d-block");
      vm.$refs.modal.classList.toggle("d-block");
    },
    endTransitionModal() {
      vm.$refs.backdrop.classList.toggle("show");
      vm.$refs.modal.classList.toggle("show");
    }
  }
});