component :is=“…”>用法
有些场景会需要在两个组件间来回切换,比如 Tab 界面
通过 Vue 的 元素和特殊的 is attribute 实现的:
入下图功能
Tab.vue
<script>
import Home from './Home.vue'
import Posts from './Posts.vue'
import Archive from './Archive.vue'
export default {
components: {
Home,
Posts,
Archive
},
data() {
return {
currentTab: 'Home',
tabs: ['Home', 'Posts', 'Archive']
}
}
}
</script>
<template>
<div class="demo">
<button
v-for="tab in tabs"
:key="tab"
:class="['tab-button', { active: currentTab === tab }]"
@click="currentTab = tab"
>
{{ tab }}
</button>
<component :is="currentTab" class="tab"></component>
</div>
</template>
<style>
.demo {
font-family: sans-serif;
border: 1px solid #eee;
border-radius: 2px;
padding: 20px 30px;
margin-top: 1em;
margin-bottom: 40px;
user-select: none;
overflow-x: auto;
}
.tab-button {
padding: 6px 10px;
border-top-left-radius: 3px;
border-top-right-radius: 3px;
border: 1px solid #ccc;
cursor: pointer;
background: #f0f0f0;
margin-bottom: -1px;
margin-right: -1px;
}
.tab-button:hover {
background: #e0e0e0;
}
.tab-button.active {
background: #e0e0e0;
}
.tab {
border: 1px solid #ccc;
padding: 10px;
}
</style>
Home.vue
<template>
<div class="tab">
Home component
</div>
</template>
Posts.vue
<template>
<div class="tab">
Posts component
</div>
</template>
Archive.vue
<template>
<div class="tab">
Archive component
</div>
</template>
slot用法
把Default.vue 用插槽slot动态插入AlertBox.vue中
Default.vue
<script>
import AlertBox from './AlertBox.vue'
export default {
components: { AlertBox }
}
</script>
<template>
<AlertBox>
Something bad happened.
</AlertBox>
</template>
AlertBox.vue
<template>
<div class="alert-box">
<strong>Error!</strong>
<br/>
<slot />
</div>
</template>
<style scoped>
.alert-box {
color: #666;
border: 1px solid red;
border-radius: 4px;
padding: 20px;
background-color: #f8f8f8;
}
strong {
color: red;
}
</style>