写在最前:父组件引用子组件,如何能在应用子组件内容的同时,还能在自定义内容呢?
1. 插槽
- 作用: 让父组件可以向子组件指定位置插入html结构,也是一种组件通信的方式,适用于父组件===>子组件
- 分类: 默认插槽,具名插槽,作用域插槽
- 使用方式:
- 默认插槽
父组件中:
<MyContainer>
<div>html结构</div>
</MyContainer>
子组件中:
<template>
<div>
<!-- 定义插槽 -->
<slot>插槽默认内容</slot>
</div>
</template>- 具名插槽
父组件中:
<MyContainer>
<template slot=content>
<div>html结构</div>
</template>
<template v-slot:content>
<div>html结构</div>
</template>
</MyContainer>
子组件中:
<template>
<div class=container>
<!-- 具名插槽 -->
<slot name=content>插槽默认内容</slot>
<slot name=footer>插槽默认内容</slot>
</div>
</template>- 作用域插槽
- 理解:数据在组件自身,但根据数据生成的结构需要组件的使用者来决定。
- 具体编码:
父组件:
<template slot-scope=list>
<h3 v-for=(item,index) in list.data :key=index>{{ item }}</h3>
</template>
子组件:
<template>
<div>
<slot :data=fineList></slot>
</div>
</template>
<script>
export default {
data(){
return {
fineList: [ 'node', 'yarn', 'npm', 'cnpm']
}
}
}
</script>
示例:准备两个组件:父组件App.vue
,子组件MyContainer.vue
1. 父组件App.vue
内:
2. 子组件
MyContainer.vue
内:
3. 运行效果:
2. 过渡
- 作用:在插入、更新或移除DOM时,在合适的时候给元素添加样式类名
- 写法:
- 准备好样式:
- 元素进入的样式
v-enter
:进入的起点v-enter-active
:进入过程中v-enter-to
: 进入的终点
- 元素离开的样式:
v-leave
:离开的起点v-leave-active
:离开过程中v-leave-to
: 离开的终点
- 元素进入的样式
- 使用
<transition>
包裹要过渡的元素,并配置name
属性 示例:
<transition name=show>
showContent
</transition>
<style>
.anmi-enter {
opacity: 0;
}
.anmi-enter-active {
transition: all 1s;
}
.anmi-enter-to {
opacity: 1;
}
.anmi-leave {
opacity: 1;
}
.anmi-leave-active {
transition: all 1s;
}
.anmi-leave-to {
opacity: 0;
}
</style>- 备注:若有多个元素需要过渡,则需要使用
<transition-group>
,且每个元素都有指定key
值 示例:
- 准备好样式:
<template>
<div>
<TransitionGroup name=anmi tag=ul class=list>
<li v-for=item in list :key=item.id>
{{ item.name }}
<button @click=list.pop()>删除</button>
</li>
</TransitionGroup>
<button @click=list.push({ id: list.length, name: list.length + '小' })>
添加
</button>
</div>
</template>
<script>
export default {
data() {
return {
list: [
{ id: 0, name: 小明 },
{ id: 1, name: 小红 },
{ id: 2, name: 小白 },
],
};
},
};
</script>
<style>
.anmi-enter-active {
animation: move 1.5s;
}
.anmi-leave-active {
animation: move 1.5s reverse;
}
@keyframes move {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
</style>