vue-dom-portal

An escape hatch directive for DOM Elements in Vue.js components.
8,601 208
Install
npm install vue-dom-portal
Latest Version:0.1.6
Vue:2
License:MIT
Last Updated:Jan 23, 2017
Links: GitHub  ·  npm
Maintainer: calebroseland

vue-dom-portal

npm vue2

An escape hatch for DOM Elements in Vue.js components.

The directive v-dom-portal will move DOM Nodes from their current place in a Vue component to a target DOM Node via appendChild. Similar to vue-transfer-dom, but updated for vue@2.x.

Setup

npm install vue-dom-portal --save
import DomPortal from 'vue-dom-portal'
Vue.use(DomPortal)

Usage

The target is the DOM Node that the element will be appened to, it defaults to document.body. Otherwise we can manually set this, or even pass a Boolean to dynamically move it around.

target can be any the following types:
  • string - this will be passed to document.querySelector to find the target
  • Node - A DOM Node or Element if you really want to specify it explitly..
  • Boolean - will either appened to document.body if true, or return to where it came from if false
  • undefined - will behave as true, appending to document.body
<!--will be appended to document.body-->
<div v-dom-portal></div>
<div v-dom-portal="true"></div>

<!--nothing will happen, left in-place-->
<div v-dom-portal="false"></div>

<!--will be appended to document.querySelector('#app') -->
<div v-dom-portal="'#app'"></div>

If you can't make up your mind on where you want the DOM Node to go, you can toss it around the page at will with a variable.

const vm = new Vue({
  template: `
    <div>
      <div v-dom-portal="target"></div>
    </div>
  `,
  data: {
    target: 'body'
  }
})

setTimeout(() => {
  vm.target = '#app'
}, 500)

setTimeout(() => {
  vm.target = false
}, 1000)

setTimeout(() => {
  vm.target = '#another-id'
}, 1500)

Since it's just a simple directive, it still works with transitions and directives.

const vm = new Vue({
  template: `
    <div>
      <transition name="fade">
        <div v-dom-portal="target" v-show="isShown" class="overlay">
          <img src="https://raw.githubusercontent.com/calebroseland/vue-dom-portal/HEAD/image.png" alt="Look, Ma, no z-index problems!">
        </div>
      </transition>
    </div>
  `,
  data: {
    target: 'body',
    isShown: true
  }
})

Use at your own risk! No tests have been written, but it seems to be working.

If you find any problems please write up an issue.

:copyright: License

MIT

Related Packages

@21cnfe/onekit-mp-cli

小程序框架开发工具

1,063
duplicate-dependencies-webpack-plugin

webpack plugin to find duplicated dependencies from your bundle

332,104 6
@debut/plugin-report

Report generation for strategy backtesting in debut

4,011 18
@amilochau/core-vue3

Core plugin for vue.js (v3) projects

3,802 0
@lg2/nuxt3-plugin-link-resolver

link resolver plugin fro nuxt3

3,544 0

Version History

Version Released Vue License
0.1.6 ^2.1.3 MIT
0.1.5 ^2.1.3 MIT
0.1.4 ^2.1.3 MIT
0.1.3 ^2.1.3 MIT
0.1.1 ^2.1.3 MIT