Commit 713bd3d75dcc6988065b368775e1b8ae36c456fe

Authored by 梁灏
1 parent 891f61d8

fixed #583

examples/routers/modal.vue
@@ -4,7 +4,6 @@ @@ -4,7 +4,6 @@
4 <Modal 4 <Modal
5 v-model="modal1" 5 v-model="modal1"
6 title="普通的Modal对话框标题" 6 title="普通的Modal对话框标题"
7 - :transition-names="['slide-up', 'ease']"  
8 @on-ok="ok" 7 @on-ok="ok"
9 @on-cancel="cancel"> 8 @on-cancel="cancel">
10 <p>对话框内容</p> 9 <p>对话框内容</p>
examples/routers/page.vue
1 <template> 1 <template>
2 <div> 2 <div>
3 - <Page :total="1000" show-sizer show-elevator show-total class="classr" :style="{float: 'right'}" @on-page-size-change="pc"></Page>  
4 - <br><br>  
5 - <Page :total="1000" show-sizer show-elevator show-total size="small" class="classr2"></Page>  
6 - <br><br>  
7 - <Page :current="2" :total="50" simple></Page> 3 + <Page :total="100" :current="current"></Page>
  4 + {{ current }}
  5 + <Button @click="current = 1">set current</Button>
8 </div> 6 </div>
9 </template> 7 </template>
10 <script> 8 <script>
11 - import { Page } from 'iview';  
12 export default { 9 export default {
13 - components: { Page },  
14 - methods: {  
15 - pc (page) {  
16 - console.log(page) 10 + data () {
  11 + return {
  12 + current: 2
17 } 13 }
18 } 14 }
19 } 15 }
src/components/modal/modal.vue
1 <template> 1 <template>
2 - <span> 2 + <div v-transfer-dom>
3 <transition :name="transitionNames[1]"> 3 <transition :name="transitionNames[1]">
4 <div :class="maskClasses" v-show="visible" @click="mask"></div> 4 <div :class="maskClasses" v-show="visible" @click="mask"></div>
5 </transition> 5 </transition>
@@ -24,11 +24,12 @@ @@ -24,11 +24,12 @@
24 </div> 24 </div>
25 </transition> 25 </transition>
26 </div> 26 </div>
27 - </span> 27 + </div>
28 </template> 28 </template>
29 <script> 29 <script>
30 import Icon from '../icon'; 30 import Icon from '../icon';
31 import iButton from '../button/button.vue'; 31 import iButton from '../button/button.vue';
  32 + import TransferDom from '../../directives/transfer-dom';
32 import { getScrollBarSize } from '../../utils/assist'; 33 import { getScrollBarSize } from '../../utils/assist';
33 import Locale from '../../mixins/locale'; 34 import Locale from '../../mixins/locale';
34 35
@@ -38,6 +39,7 @@ @@ -38,6 +39,7 @@
38 name: 'Modal', 39 name: 'Modal',
39 mixins: [ Locale ], 40 mixins: [ Locale ],
40 components: { Icon, iButton }, 41 components: { Icon, iButton },
  42 + directives: { TransferDom },
41 props: { 43 props: {
42 value: { 44 value: {
43 type: Boolean, 45 type: Boolean,
src/directives/transfer-dom.js 0 → 100644
  1 +// Thanks to: https://github.com/airyland/vux/blob/v2/src/directives/transfer-dom/index.js
  2 +// Thanks to: https://github.com/calebroseland/vue-dom-portal
  3 +
  4 +/**
  5 + * Get target DOM Node
  6 + * @param {(Node|string|Boolean)} [node=document.body] DOM Node, CSS selector, or Boolean
  7 + * @return {Node} The target that the el will be appended to
  8 + */
  9 +function getTarget (node) {
  10 + if (node === void 0) {
  11 + node = document.body
  12 + }
  13 + if (node === true) { return document.body }
  14 + return node instanceof window.Node ? node : document.querySelector(node)
  15 +}
  16 +
  17 +const directive = {
  18 + inserted (el, { value }, vnode) {
  19 + el.className = el.className ? el.className + ' v-transfer-dom' : 'v-transfer-dom';
  20 + const parentNode = el.parentNode;
  21 + const home = document.createComment('');
  22 + let hasMovedOut = false;
  23 +
  24 + if (value !== false) {
  25 + parentNode.replaceChild(home, el); // moving out, el is no longer in the document
  26 + getTarget(value).appendChild(el); // moving into new place
  27 + hasMovedOut = true
  28 + }
  29 + if (!el.__transferDomData) {
  30 + el.__transferDomData = {
  31 + parentNode: parentNode,
  32 + home: home,
  33 + target: getTarget(value),
  34 + hasMovedOut: hasMovedOut
  35 + }
  36 + }
  37 + },
  38 + componentUpdated (el, { value }) {
  39 + // need to make sure children are done updating (vs. `update`)
  40 + const ref$1 = el.__transferDomData;
  41 + // homes.get(el)
  42 + const parentNode = ref$1.parentNode;
  43 + const home = ref$1.home;
  44 + const hasMovedOut = ref$1.hasMovedOut; // recall where home is
  45 +
  46 + if (!hasMovedOut && value) {
  47 + // remove from document and leave placeholder
  48 + parentNode.replaceChild(home, el);
  49 + // append to target
  50 + getTarget(value).appendChild(el);
  51 + el.__transferDomData = Object.assign({}, el.__transferDomData, { hasMovedOut: true, target: getTarget(value) });
  52 + } else if (hasMovedOut && value === false) {
  53 + // previously moved, coming back home
  54 + parentNode.replaceChild(el, home);
  55 + el.__transferDomData = Object.assign({}, el.__transferDomData, { hasMovedOut: false, target: getTarget(value) });
  56 + } else if (value) {
  57 + // already moved, going somewhere else
  58 + getTarget(value).appendChild(el);
  59 + }
  60 + },
  61 + unbind: function unbind (el, binding) {
  62 + el.className = el.className.replace('v-transfer-dom', '')
  63 + if (el.__transferDomData.hasMovedOut === true) {
  64 + el.__transferDomData.parentNode && el.__transferDomData.parentNode.appendChild(el)
  65 + }
  66 + el.__transferDomData = null
  67 + }
  68 +};
  69 +
  70 +export default directive;
0 \ No newline at end of file 71 \ No newline at end of file