1 vue进阶: 插槽 slot
2)
更加动态的显示内容 而不是将内容写固定住
<html>
<head>
<title>test</title>
<meta charset="utf-8" />
<style></style>
</head>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<body>
<div id="box">
<child>
aaaaaa
</child>
<swiper>
<li v-for="data in datalist">
{{data}}
</li>
</swiper>
</div>
</body>
<script>
var vm = new Vue({
el: "#box",
data: {
datalist: ['111', '222', '333'],
},
components: {
child: {
template: `
<div>
<slot></slot>
</div>
`
},
swiper: {
template: `
<div>
<ul>
<slot></slot>
</ul>
</div>
`
}
},
})
</script>
</html>
3)
简化一下 之前点击隐藏的功能
<html>
<head>
<title>test</title>
<meta charset="utf-8" />
<style></style>
</head>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<body>
<div id="box">
<navbar>
<button @click="isShow=!isShow">click</button>
</navbar>
<swiper>
<li v-for="data in datalist" v-show="isShow">
{{data}}
</li>
</swiper>
</div>
</body>
<script>
var vm = new Vue({
el: "#box",
data: {
isShow: false,
datalist: ['apple', 'banana'],
},
components: {
navbar: {
template: `
<div>
navbar
<slot></slot>
</div>
`
},
swiper: {
template: `
<div>
<ul>
<slot></slot>
</ul>
</div>
`
}
},
})
</script>
</html>
这个就可以完美实现 主要看第一个组件的部分
2 p40 具名slot
具有名字的插槽 可将具体的插槽放到特定的位置
3 过渡
1)
单元素
先实现一个可以点击后 隐藏和显示内容的按钮
这个很简单
<html>
<head>
<title>test</title>
<meta charset="utf-8" />
<style></style>
</head>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<body>
<div id="box">
<button @click="isShow=!isShow">click</button>
<div v-show="isShow">11111</div>
</div>
</body>
<script>
var vm = new Vue({
el: "#box",
data: {
isShow: false,
},
})
</script>
</html>
接下来加一些动画的样式 第一种使用vue 命名方式的过渡动画
<html>
<head>
<title>test</title>
<meta charset="utf-8" />
<style>
/* 这个地方前面的变量是随便起的 但是后面的-enter-active这种固定 */
.fhj-enter-active,
.fhj-leave-active {
/* 进场和出场的时间是1.5s */
transition: all 1.5s;
}
.fhj-enter,
.fhj-leave-to {
/* 元素的默认状态 opacity:1,translate: 0; */
opacity: 0;
transform: translateX(100px);
}
</style>
</head>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<body>
<div id="box">
<button @click="isShow=!isShow">click</button>
<!-- 使用transition标签将样式加在需要显示的元素上 -->
<transition name="fhj">
<div v-show="isShow">11111</div>
</transition>
</div>
</body>
<script>
var vm = new Vue({
el: "#box",
data: {
isShow: false,
},
})
</script>
</html>
再使用第二种 css3 加动画 关键帧的方式
<html>
<head>
<title>test</title>
<meta charset="utf-8" />
<style>
/* .5s 表示 0.5s时间内进场和出场 */
.fhj-enter-active {
animation: bounce-in .5s;
}
.fhj-leave-active {
animation: bounce-in .5s reverse;
}
/* 这个地方是两个状态的变化 0-100 100-0 */
@keyframes bounce-in {
0% {
opacity: 0;
transform: translateX(100px);
}
100% {
opacity: 1;
transform: translateX(0px);
}
}
</style>
</head>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<body>
<div id="box">
<button @click="isShow=!isShow">click</button>
<!-- 使用transition标签将样式加在需要显示的元素上 -->
<transition name="fhj">
<div v-show="isShow">css3 关键帧动画效果</div>
</transition>
</div>
</body>
<script>
var vm = new Vue({
el: "#box",
data: {
isShow: false,
},
})
</script>
</html>
2)多个元素过渡
动画效果消失
diff算法 同标签对比 只是做了内容的更改 没有创建新的
那么 如果 将两个标签改成不一样的呢?
这样diff 在对比的时候 会认为两个标签内容发生很大变化 动画会起作用
会删掉之前的节点
那么 我们如果 还是要使用 两个相同的标签呢 ?
diff算法另外一个原则是 key值相同 则复用 key值不同则 会把之前的干掉 换成新的
那么我们可以使得key值不一样 可以实现动画效果
3)列表过渡