组件和子组件

时间:2016-08-09 22:52:17

标签: vue.js vue-component vue-loader

我是Vue.js的新手,我在使用带有子组件的组件时遇到了一些麻烦。我有以下.vue个文件

app.vue

<template>
  <section>
    <menu></menu>
    <h1>Create Your MIA</h1>
    <div id="board"></div>
    <slider>
      <skin></skin>
    </slider>
  </section>
</template>

slider.vue

<template>
  <div id="slider-panel">
    <h3>{{* heading}}</h3>
    <div class="slider">
      <slot>
        Some content
      </slot>
    </div>
  </div>
</template>

<script>
import skin from "./skin";
  export default {
    components: {
      skin: skin
    }
  };
</script>

skin.vue

<template>
    <div v-for="colour in colours">
      <div :style="{ backgroundColor: colour }">
        <img src="../assets/images/MIA.png"/>
      </div>
    </div>
</template>

<script>
  export default {
    data() {
      return {
        heading: "Choose Skin Tone"
      };
    }
  };
</script>

我试图将皮肤子组件加载到组件中。一切都很好,除了皮肤子组件,因为它没有编译。我没有得到任何编译或vue相关的错误。我还希望能够有像这样的滑块组件的几个实例

app.vue

<template>
  <section>
    <menu></menu>
    <h1>Create Your MIA</h1>
    <div id="board"></div>
    <slider>
      <skin></skin>
    </slider>
    <slider>
      <foo></foo>
    </slider>
    <slider>
      <bar></bar>
    </slider>
  </section>
</template>

我不确定我做错了什么。

2 个答案:

答案 0 :(得分:7)

我不是100%确定你想要在这里实现什么,但是要在组件内部编译组件,你需要在父模板中添加子组件,如下所示:

Slider.vue(我简化了结构):

<template>
  <div id="slider-panel">
    <h3>{{* heading}}</h3>
    <skin></skin>
  </div>
</template>
<script>
import skin from './skin'
export default {
  components : {
    'skin': skin
  }
}
</script>

App.vue:

<template>
  <section>
    <menu></menu>
    <h1>Create Your MIA</h1>
    <div id="board"></div>
    <slider></slider>
  </section>
</template>

实际上,如果您在应用的模板中添加skin,只需将其添加到slider组件模板中,它就会被包含(并呈现),假设其范围为app,而不是slider。要在skin范围内添加slider,需要将其添加到slider的模板中。检查一下:https://vuejs.org/guide/components.html#Compilation-Scope

其他一些事情:

祝你好运!

<强>更新

如果您希望slider组件与内容无关并且能够在其中插入您想要的任何内容,那么您有两个选择(我能想到):

  1. slider组件中删除所有逻辑,并使skin成为app的后代。然后使用slider组件中的插槽,如下所示:
  2. Slider.vue:

    <template>
      <div id="slider-panel">
        <h3>{{* heading}}</h3>
        <slot></slot>
      </div>
    </template>
    <script>
    export default {}
    </script>
    

    App.vue:

    <template>
      <section>
        <menu></menu>
        <h1>Create Your MIA</h1>
        <div id="board"></div>
        <slider>
          <skin></skin>
        </slider>
      </section>
    </template>
    <script>
    import skin from './skin'
    export default {
      skin: skin
    }
    </script>
    
    1. 如果你知道滑块内部总是有一组封闭的组件,你可以使用动态组件:https://vuejs.org/guide/components.html#Dynamic-Components

答案 1 :(得分:2)

经过一些研究后,我发现this引用了将转换子组件模板的is=属性

所以在app.vue

<slider-component>
      <div is="skin-component" v-for="colour in colours"></div>
    </slider-component>

然后添加子组件