Wrap 和 Box 是非父子组件,父组件都是App.vue
VueComponent 是 Vue实例的一个子类,基础Vue的所有属性和方法
Vue.prototype原型属性,使用它设置一个属性$center=new Vue(),
main.js中vm.center访问不是这个对象,就会去原型链上寻找,
那么在局部组件中范围this.center,也就可以获得这个对象,如果局部组件内部具有center属性,就访问不到这个对象中的center,
为了区分这两属性,在prototype设置属性加一个$符号。
由此 所有组件都可以访问到这个对象,可以利用这个对象进行组件传值就没必要新建文件 来创建一个空实例对象
2. Vue.prototype 创建一个实例对象: Vue.prototype.$center = new Vue({
})
dom结构中Wrap标签 和 Box标签是父子节点,
可以通过访问 组件标签在外部使用时的 子节点或父节点 的 组件对象:
1. 子节点是一个数组,因为子节点可以有多个,父节点是一个对象,因为父节点只有一个
1. 通过this.$children 或 this.$parent 只能访问到组件标签对象,不能访问到普通dom元素
2. 可以通过this.$slots 可以访问到slot装载到的所有对象所有dom元素,包括普通标签,
获取到的是虚拟对象节点VNode,如果是组件对象,则通过componentInstance来获取组件对象
如果是普通节点,则componentInstance为undefined
3. 如果slot有设置name属性,则this.$slots可以获取到的分为两类,一个key值为default 包含所有没有设置slot的标签对象,一个key值为name属性值,包含设置slot属性的标签对象
4. 获得节点对象之后,就可以进行赋值:
如给父节点传值 this.$parent.SonData = this.message
给普通标签设置ref,通过this.$refs 取得的是 dom对象
给组件标签设置ref,通过this.$refs 取得的是组件对象
普通标签或 组件标签 使用v-for循环设置ref,可以取得一个数组,所有标签对象都保存在其中
1. App.vue:
1. html:
<div id="app">
<p>{
{isSelected}}p>
<input type="checkbox" v-model="isSelected">
appear-class
appear-to-class
appear-active-class
-->
<transition appear enter-class="one" enter-to-class="two" enter-active-class="three"
appear-class="four" appear-to-class="two" appear-active-class="three">
<p class="test" v-if="isSelected">hello worldp>
transition>
div>
2. css:
.test{background: red;}
/* .v-enter{opacity: 0;background: #fff;}
.v-enter-to{opacity: 1;background: red;}
.v-enter-active{transition: 2s;}
.v-leave{transform: scale(1);}
.v-leave-to{transform: scale(0);}
.v-leave-active{transition: 3s transform;}
*/
/* .fade-enter{opacity: 0;background: #fff;}
.fade-enter-to{opacity: 1;background: red;}
.fade-enter-active{transition: 2s;}
.fade-leave{transform: scale(1);}
.fade-leave-to{transform: scale(0);}
.fade-leave-active{transition: 3s transform;}
*/
.one{opacity: 0;background: #fff;}
.four{opacity: 0;background: #000;}
.two{opacity: 1;background: red;}
.three{transition: 4s;}
2. Box.vue:
<template>
<div class="box">
div>
template>
<style>
.box{
width: 300px;
height: 200px;
background: lightblue;
}
style>
如果enter/leave 的第一帧与enter-to / leave-to的初始状态一致,则可以用enter-to替换enter-active,否则不能替换,只能用enter-active / leave-active
1. App.vue:
1. html:
<div id="app">
<p>{
{isSelected}}p>
<input type="checkbox" v-model="isSelected">
<transition enter-active-class="fadeIn" leave-class leave-to-class="zoomOut">
<p class="test" v-if="isSelected">hello worldp>
transition>
div>
2. css:
.test{background: red;}
@keyframes fadeIn{
0%{
opacity: 0;
}
100%{
opacity: 1;
}
}
.fadeIn{
animation: fadeIn 2s;
}
@keyframes zoomOut{
0%{
transform: scale(1);
}
100%{
transform: scale(0);
}
}
.zoomOut{
animation: zoomOut 3s;
}
1. App.vue:
1. html:
<div id="app">
<p>{
{isSelected}}p>
<input type="checkbox" v-model="isSelected">
<transition enter-active-class="slideIn" name="fade"
:duration="{enter: 2000, leave: 1000}">
<p class="test" v-if="isSelected">hello worldp>
transition>
div>
2. css:
.test{background: red;}
@keyframes slideIn{
0%{
transform: translateX(100%);
}
100%{
transform: translateX(0);
}
}
.slideIn{
animation: slideIn 5s;
transition: 1s;
}
.fade-enter{
opacity: 0;
}
.fade-enter-to{
opacity: 1;
}
1. public/index.html
引入animate.css:
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.7.0/animate.min.css">
2. App.vue:
1. html:
2. css
有的动画效果的动画时间已经设定好,有的没有设定,所以需要手动设置animation-duration
1. html:
<div id="app">
<p>{
{isSelected}}p>
<input type="checkbox" v-model="isSelected">
<transition @before-enter="handleBeforeEnter" @enter="handleEnter" @after-enter="handleAfterEnter">
<p class="test" v-if="isSelected">hello worldp>
transition>
div>
2. js:
import Box from './components/Box'
export default {
components: {
Box
},
data(){
return {
isSelected: true
}
},
methods: {
handleBeforeEnter(el){
console.log('进入动画执行前');
console.log(el);
el.style.background = '#fff';
},
handleEnter(el, done){
console.log('已经进入');
setTimeout(() => {
el.style.background = 'green';
}, 1000);
setTimeout(() => {
done();
}, 2000);
},
handleAfterEnter(el){
console.log('进入动画执行完毕');
el.style.background = '#fff';
}
}
}
3. css:
p{transition: 1s background;}
当只用 JavaScript 过渡的时候,在 enter 和 leave 中必须使用 done 进行回调。否则,它们将被同步调用,过渡会立即完成。
1. html:
<input type="text" ref="in">
<button @click="addAction">添加button>
<ul>
<transition-group name="fade">
<li v-for="(item, index) in list" :key="item.id">
{
{item.val}}
<button @click="deleteAction(index)">Xbutton>
li>
transition-group>
ul>
2. js:
export default {
data(){
return {
isSelected: false,
list: [],
flag: 0
}
},
methods: {
addAction(){
this.list.push({
val: this.$refs.in.value,
id: this.flag++
});
this.$refs.in.value = '';
},
deleteAction(index){
this.list.splice(index, 1);
}
}
}
3. css:
.fade-enter{
opacity: 0;
}
.fade-enter-to{
opacity: 1;
}
.fade-enter-active{
transition: 1s opacity;
}
.fade-leave{
opacity: 1;
}
.fade-leave-to{
opacity: 0;
}
.fade-leave-active{
transition: 1s opacity;
}