BREAKING CHANGE: `<portal>` has been renamed to `<teleport>`.
    `target` prop is also renmaed to `to`, so the new usage will be:
    ```html
    <Teleport to="#modal-layer" :disabled="isMobile">
      <div class="modal">
        hello
      </div>
    </Teleport>
    ```
    The primary reason for the renaming is to avoid potential naming
    conflict with [native portals](https://wicg.github.io/portals/).
		
	
			
		
			
				
	
	
		
			132 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<script src="../../dist/vue.global.js"></script>
 | 
						|
 | 
						|
<!-- template for the modal component -->
 | 
						|
<script type="text/x-template" id="modal-template">
 | 
						|
  <transition name="modal">
 | 
						|
    <div v-if="show" class="modal-mask">
 | 
						|
      <div class="modal-wrapper">
 | 
						|
        <div class="modal-container">
 | 
						|
 | 
						|
          <div class="modal-header">
 | 
						|
            <slot name="header">
 | 
						|
              default header
 | 
						|
            </slot>
 | 
						|
          </div>
 | 
						|
 | 
						|
          <div class="modal-body">
 | 
						|
            <slot name="body">
 | 
						|
              default body
 | 
						|
            </slot>
 | 
						|
          </div>
 | 
						|
 | 
						|
          <div class="modal-footer">
 | 
						|
            <slot name="footer">
 | 
						|
              default footer
 | 
						|
              <button class="modal-default-button" @click="$emit('close')">
 | 
						|
                OK
 | 
						|
              </button>
 | 
						|
            </slot>
 | 
						|
          </div>
 | 
						|
        </div>
 | 
						|
      </div>
 | 
						|
    </div>
 | 
						|
  </transition>
 | 
						|
</script>
 | 
						|
<script>
 | 
						|
const Modal = {
 | 
						|
  template: '#modal-template',
 | 
						|
  props: ['show']
 | 
						|
}
 | 
						|
</script>
 | 
						|
 | 
						|
<!-- modal container that lives outside of app root -->
 | 
						|
<div id="modal-container"></div>
 | 
						|
 | 
						|
<!-- app -->
 | 
						|
<div id="app">
 | 
						|
  <button id="show-modal" @click="showModal = true">Show Modal</button>
 | 
						|
  <teleport to="#modal-container">
 | 
						|
    <!-- use the modal component, pass in the prop -->
 | 
						|
    <modal :show="showModal" @close="showModal = false">
 | 
						|
      <template #header>
 | 
						|
        <h3>custom header</h3>
 | 
						|
      </template>
 | 
						|
    </modal>
 | 
						|
  </teleport>
 | 
						|
</div>
 | 
						|
 | 
						|
<script>
 | 
						|
Vue.createApp({
 | 
						|
  components: { Modal },
 | 
						|
  data: () => ({
 | 
						|
    showModal: false
 | 
						|
  })
 | 
						|
}).mount('#app')
 | 
						|
</script>
 | 
						|
 | 
						|
<style>
 | 
						|
.modal-mask {
 | 
						|
  position: fixed;
 | 
						|
  z-index: 9998;
 | 
						|
  top: 0;
 | 
						|
  left: 0;
 | 
						|
  width: 100%;
 | 
						|
  height: 100%;
 | 
						|
  background-color: rgba(0, 0, 0, .5);
 | 
						|
  display: table;
 | 
						|
  transition: opacity .3s ease;
 | 
						|
}
 | 
						|
 | 
						|
.modal-wrapper {
 | 
						|
  display: table-cell;
 | 
						|
  vertical-align: middle;
 | 
						|
}
 | 
						|
 | 
						|
.modal-container {
 | 
						|
  width: 300px;
 | 
						|
  margin: 0px auto;
 | 
						|
  padding: 20px 30px;
 | 
						|
  background-color: #fff;
 | 
						|
  border-radius: 2px;
 | 
						|
  box-shadow: 0 2px 8px rgba(0, 0, 0, .33);
 | 
						|
  transition: all .3s ease;
 | 
						|
  font-family: Helvetica, Arial, sans-serif;
 | 
						|
}
 | 
						|
 | 
						|
.modal-header h3 {
 | 
						|
  margin-top: 0;
 | 
						|
  color: #42b983;
 | 
						|
}
 | 
						|
 | 
						|
.modal-body {
 | 
						|
  margin: 20px 0;
 | 
						|
}
 | 
						|
 | 
						|
.modal-default-button {
 | 
						|
  float: right;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * The following styles are auto-applied to elements with
 | 
						|
 * transition="modal" when their visibility is toggled
 | 
						|
 * by Vue.js.
 | 
						|
 *
 | 
						|
 * You can easily play with the modal transition by editing
 | 
						|
 * these styles.
 | 
						|
 */
 | 
						|
 | 
						|
.modal-enter-from {
 | 
						|
  opacity: 0;
 | 
						|
}
 | 
						|
 | 
						|
.modal-leave-to {
 | 
						|
  opacity: 0;
 | 
						|
}
 | 
						|
 | 
						|
.modal-enter-from .modal-container,
 | 
						|
.modal-leave-to .modal-container {
 | 
						|
  -webkit-transform: scale(1.1);
 | 
						|
  transform: scale(1.1);
 | 
						|
}
 | 
						|
</style>
 |