HTML 如何在模板组件内部使用插槽

How to use slots inside of template components in HTML

我正在尝试使用 Vue 组件内的插槽来更轻松地显示不同的标题。但是,当我尝试用数据替换插槽时,无论标记中的相对定位如何,插槽仅使用它的后备选项。

据我了解,首先要使用的模板带有标签,然后放入槽,并在开始和结束槽标记之间给出 "name," 和回退文本,如下所示:

<template id="somename-template>
     <slot name="attrname>Some Fallback</slot>
</template>

那么数据就是这样存储的:

<somename>
     <span slot="attrname">Real text</slot>
</somename>

我尝试重新定位脚本的上方和下方,以及 的上方和下方,但是没有任何组合提供预期的结果。

我的实际代码:

<body>
    <template id="comp-dem-template">
        <header-component></header-component>
    </template>

    <script>
        customElements.define('comp-dem',

            class extends HTMLElement {

            constructor() {

                super();

                const template = document.getElementById('comp-dem-template').content;

                const shadowRoot = this.attachShadow({mode: 'open'}).appendChild(template.cloneNode(true));

            }

        });
        Vue.component('header-component', {
            template: '<h1><slot name="pagetitle">Page Title Fallback</slot></h1>'
        })
        new Vue({ el: '#comp-dem-template' })
    </script>
    <comp-dem>
        <span slot="pagetitle">
            Images
        </span>
    </comp-dem>
</body>

标记应如下所示:

<h1>Images</h1>

然而,看起来像:

<h1>Page Title Fallback</h1>

我可以说这可能是我做错的一件非常简单的事情(或者它是错误的工作工具),但即使查看其他工作示例,我也无法说出到底是什么。

我不太清楚你想要完成什么。您将 <span slot="pagetitle">Images</span> 传递给 <comp-dem>,但 <comp-dem> 组件没有插槽 - <header-component> 有插槽。为什么要在一个组件中包裹一个组件?

要让代码正常工作,需要像这样传递插槽:

    <body>
        <template id="comp-dem-template">
            <header-component>
                <span slot="pagetitle">
                    Images
                </span>
            </header-component>
        </template>

        <script>
            Vue.component('header-component', {
                template: '<h1><slot name="pagetitle">Page Title Fallback</slot></h1>'
            })
            new Vue({ el: '#comp-dem-template' })
        </script>
    </body>

或者,如果您坚持使用<comp-dem>,我认为您可能需要执行以下操作:

    <body>
        <template id="comp-dem-template">
            <header-component>
                <span slot="pagetitle">
                    <slot name="pagetitle"><slot>
                </span>
            </header-component>
        </template>

        <script>
            customElements.define('comp-dem',

                class extends HTMLElement {

                constructor() {

                    super();

                    const template = document.getElementById('comp-dem-template').content;

                    const shadowRoot = this.attachShadow({mode: 'open'}).appendChild(template.cloneNode(true));

                }

            });
            Vue.component('header-component', {
                template: '<h1><slot name="pagetitle">Page Title Fallback</slot></h1>'
            })
            new Vue({ el: '#comp-dem-template' })
        </script>
        <comp-dem>
            <span slot="pagetitle">
                Images
            </span>
        </comp-dem>
    </body>