组件和子组件
Components and Sub components
我是 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>
我不确定我做错了什么。
我不是 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>
实际上,如果您在 slider
组件模板中添加 skin
到应用程序模板中,它会被包含(并呈现),假设其范围是 app
,而不是 slider
。为了在 slider
范围内添加 skin
,需要将其添加到 slider
的模板中。检查这个:https://vuejs.org/guide/components.html#Compilation-Scope
其他一些事情:
- 使用连字符分隔的组件名称,至少包含 2 个单词:
<custom-slider>
而不是 <slider>
,例如,在 Web Components API 之后(否则它可能与当前或即将推出的 Web 组件发生冲突)。
- 插槽很难掌握,请仔细阅读:https://vuejs.org/guide/components.html#Content-Distribution-with-Slots
祝你好运!
更新:
如果您希望 slider
组件与内容无关并且能够在其中插入任何您想要的内容,您有两个选择(我能想到):
- 从
slider
组件中删除所有逻辑并使 skin
成为 app
的后代。然后在slider
组件中使用槽,如下:
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>
- 如果知道滑块内部总会有一组封闭的组件,可以使用动态组件:https://vuejs.org/guide/components.html#Dynamic-Components
经过一番研究,我发现 指的是一个 is=
属性,它将嵌入子组件模板
所以在app.vue
<slider-component>
<div is="skin-component" v-for="colour in colours"></div>
</slider-component>
然后添加子组件
我是 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>
我不确定我做错了什么。
我不是 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>
实际上,如果您在 slider
组件模板中添加 skin
到应用程序模板中,它会被包含(并呈现),假设其范围是 app
,而不是 slider
。为了在 slider
范围内添加 skin
,需要将其添加到 slider
的模板中。检查这个:https://vuejs.org/guide/components.html#Compilation-Scope
其他一些事情:
- 使用连字符分隔的组件名称,至少包含 2 个单词:
<custom-slider>
而不是<slider>
,例如,在 Web Components API 之后(否则它可能与当前或即将推出的 Web 组件发生冲突)。 - 插槽很难掌握,请仔细阅读:https://vuejs.org/guide/components.html#Content-Distribution-with-Slots
祝你好运!
更新:
如果您希望 slider
组件与内容无关并且能够在其中插入任何您想要的内容,您有两个选择(我能想到):
- 从
slider
组件中删除所有逻辑并使skin
成为app
的后代。然后在slider
组件中使用槽,如下:
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>
- 如果知道滑块内部总会有一组封闭的组件,可以使用动态组件:https://vuejs.org/guide/components.html#Dynamic-Components
经过一番研究,我发现 is=
属性,它将嵌入子组件模板
所以在app.vue
<slider-component>
<div is="skin-component" v-for="colour in colours"></div>
</slider-component>
然后添加子组件