iT邦幫忙

0

Vue 在使用含有 Slot 的組件,是不是 v-show 及 v-if 就無作用了?

  • 分享至 

  • xImage

小弟使用 wait.vue 來繼承 modal.vue 的內容及 slot,但當使用 opts.mask.show=true時,正常功能應該會是 modal-mask 要顯示在畫面上,但實際上卻沒有動作,不知是不是寫法有誤?還是有其它的解決方式?程式碼如下,還請各位大神指教,感激不盡!

modal.vue

<template>
    <div class="modal-root">
        <div
            class="modal-mask"
            v-if="opts.hasMask===true"
            v-show="opts.mask.show"
            v-bind:style="opts.mask.style"
        ></div>
        <div
            class="modal-content"
            v-show="opts.content.show"
            v-bind:style="opts.content.style"
        >
            <slot name='slotBody'></slot>
        </div>
    </div>
</template>

<script>
import _ from "lodash";

export default {
    data: function () {
        return {
            opts: {
                hasMask: true,
                mask: {
                    show: false,
                    style: {
                        width: "100%",
                        height: "100%",
                        position: "fixed",
                        top: 0,
                        left: 0,
                        zIndex: 999999,
                        opacity: 0.5,
                        backgroundColor: "#ccc"
                    }
                },
            },
            _mask: null,
            _msg: null
        };
    },
    props: ["show", "options"],
    watch: {
        show: function (isShow) {
            if (this.opts.hasMask) {
                this.opts.mask.show = isShow;
            }
        },
        options: function (opt = {}) {
            this.opts = _.merge(this.opts, opt);
        }
    },
    created: function () {
        this.opts = _.merge(this.opts, this.options);
    }
};
</script>

wait.vue

<template>
    <modal>
        <template v-slot:slotBody>
            <div class='modal-body'>aaaaaa</div>
        </template>
    </modal>
</template>
<script>
import _ from "lodash";
import _modal from "./slots/modal.vue";

export default {
    // extends: _modal,
    mixins: [_modal],
    data: function () {
        return {
            opts: {
                // hasMask: false,
                content: {
                    html: "Please Waiting !!!"
                }
            }
        }
    },
    components: {
        modal: _modal
    }
};
</script>
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
通靈亡
iT邦高手 1 級 ‧ 2020-07-02 11:25:28
最佳解答

你的<Modal>有沒有傳["show", "options"]這兩個屬性?

<Modal :show="true" :option="opts">

雖然表面上你使用 Mixin + components 來實現繼承modal.vue
但是<Modal> components的data 跟 Wait.vue的data是互相獨立的

因此即使你修改wait.vue的data
你還是必須傳到<Modal>的屬性才會作用

kuanhuayu iT邦新手 5 級 ‧ 2020-07-02 14:08:35 檢舉

感謝您,我再加上這 ["show","options"] 屬性試試!

kuanhuayu iT邦新手 5 級 ‧ 2020-07-02 14:34:21 檢舉

加上屬性後,功能就正常了,太感謝了!

1
listennn08
iT邦高手 5 級 ‧ 2020-07-02 11:27:04

wait.vue 沒有給 modal.vue content.showcontent.style
modal.vue 裡面也沒設定

<div
    class="modal-content"
    v-show="opts.content.show"
    v-bind:style="opts.content.style"
>
kuanhuayu iT邦新手 5 級 ‧ 2020-07-02 14:09:29 檢舉

感謝您,我再修正程式碼!

我要發表回答

立即登入回答