Vuejs使用内联模板嵌套组件

Hal*_*ggs 10 javascript vue.js

我最终会为每个页面嵌套很多不同的组件.我的应用程序中的每个页面都有一个组件视图.在每个页面上,有不同的Vue实例将重复使用我所创建的组件,如滑块,tabber,轮播等.

我正在尝试重构这个,因为很多Vue实例互相干扰,我意识到我应该只有一个带有大量内部组件的主Vue实例.

这是我到目前为止所建立的:

http://jsfiddle.net/jmtg5r4s/

问题是它在加载主视图组件后停止.它不会加载任何嵌套组件,除非我为它们设置了一个我不想做的模板,因为我想利用Laravel刀片语法而不使用常规HTML.加上我所有的服务器端助手等.

使用Javascript:

var App = new Vue({
    el: '#app',

    attached: function() {
        console.log('main app loaded');
    },

    components: {
        'home-view': {

            attached: function() {
                console.log('home view loaded');
            },

            components: {
                'home-slider': {

                    attached: function() {
                        console.log('homepage slider loaded');
                    },

                    components: {
                        'slider': {

                            template: '#slider-template',
                            replace: true,

                            attached: function() {
                                console.log('general slider component loaded');
                            },

                            components: {
                                'slide': {

                                    template: '#slide-template',
                                    replace: true,

                                    props: ['index', 'text'],

                                    attached: function() {
                                        console.log('general slide component loaded');
                                    }

                                }
                            }

                        }
                    }

                }
            }

        }
    }
});
Run Code Online (Sandbox Code Playgroud)

HTML:

<script type="x-template" id="slider-template">
    <div class="slider">
        <content></content>
    </div>
</script>

<script type="x-template" id="slide-template">
    <div class="slide" id="slide{{ index }}">
        {{ text }}
    </div>
</script>

<div id="app">
    <component is="home-view">
        <div id="slideshow" v-component="slider" inline-template>
            <slider>
                <slide index="1" text="Slide #1"></slide>
                <slide index="2" text="Slide #2"></slide>
            </slider>
        </div>

        <p>More content specific to the homepage here.</p>
    </component>
</div>
Run Code Online (Sandbox Code Playgroud)

我可能会过度思考这个问题,但感谢您的帮助/想法!

Lee*_*ery 9

我遇到了类似的问题.你可以通过在"home-view"组件上放置"inline-template"属性来解决它:

<div id="app">
<component inline-template is="home-view">
    <div id="slideshow" v-component="slider" inline-template>
        <slider>
            <slide index="1" text="Slide #1"></slide>
            <slide index="2" text="Slide #2"></slide>
        </slider>
    </div>

    <p>More content specific to the homepage here.</p>
</component>
Run Code Online (Sandbox Code Playgroud)

如果应用了inline-template属性,则组件的innerHTML被视为组件模板.

参考Vue.js文档


Dav*_*ess 3

您将组件模板的概念与编译时组件中可能存在的现有内容混淆了。在 AngularJS 中,这称为“嵌入”。在 Vue 中,它被称为“内容插入”,您可以在此处阅读有关它的更多信息:

http://vuejs.org/guide/components.html#Content_Insertion

基本上,您需要使用内容插入技术来获得在编译组件时重用组件中存在的内容的效果。否则,组件假定其所有内容都来自其模板。