1. Vue3和Vue2的区别
Vue3是Vue.js的最新版本,正式发布于2020年9月18日。Vue3与Vue2相比有很多改进和新特性,最显著的区别是更强大的动画效果支持。Vue3使用Composition API代替了Option API,这意味着在Vue3中编写动画效果更加直接。
2. Composition API
Composition API是Vue3的最大卖点之一。与Option API使用对象的方式来组织代码不同,Composition API允许开发者在逻辑上根据功能而非类型组织代码,从而更好地组织复杂的应用程序。
2.1 ref与reactive
在Vue3中,使用ref创建简单变量。它使变量可响应并被Vue追踪。使用reactive创建复杂对象。这些对象可以是嵌套的,并且当其属性更改时会被Vue追踪。
// 在Vue3中使用ref
import { ref } from 'vue';
export default {
setup() {
const count = ref(0);
return { count };
}
}
// 在Vue3中使用reactive
import { reactive } from 'vue';
export default {
setup() {
const obj = reactive({ count: 0 });
return { obj };
}
}
2.2 watchEffect
Vue3中的watchEffect可以取代Vue2中的watch方法。watchEffect会自动追踪被依赖的数据并在数据变化时重新运行。
import { reactive, watchEffect } from 'vue';
export default {
setup() {
const obj = reactive({
firstName: 'John',
lastName: 'Doe',
});
watchEffect(() => {
console.log(`Hello, ${obj.firstName} ${obj.lastName}!`);
});
return { obj };
},
};
3. 更强大的动画效果支持
Vue3的动画API有很多改进。Vue3中的transition组件可以直接嵌套在另一个transition组件中,从而允许更多复杂的动画效果。此外,在Vue3中,动画还可以使用onBeforeEnter、onEnter、onAfterEnter、onBeforeLeave、onLeave和onAfterLeave,这使得动画更加丰富。
3.1 transition组件
在Vue3中,transition组件变得更加强大。V-bind的enter和leave属性现在可以用v-on指令并添加在transition元素上,这使得它们直接作用于元素,而不是需要额外的标记。transition-group组件还可以嵌套以实现更复杂的动画场景。
<template>
<div>
<button @click="show = !show">Toggle message</button>
<transition @enter="beforeEnter" @enter-from="enterFrom" @enter-to="enterTo" @leave="beforeLeave" @leave-from="leaveFrom" @leave-to="leaveTo">
<p v-if="show">{{ message }}</p>
</transition>
</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const show = ref(true);
const message = ref('Hello, Vue 3!');
const beforeEnter = (el) => {
el.style.opacity = 0;
};
const enterFrom = (el) => {
el.style.width = 0;
};
const enterTo = (el, done) => {
el.style.opacity = 1;
el.style.width = '200px';
setTimeout(done, 2000);
};
const beforeLeave = (el) => {
el.style.opacity = 1;
};
const leaveFrom = (el) => {
el.style.opacity = 0;
el.style.width = '200px';
};
const leaveTo = (el, done) => {
el.style.width = 0;
setTimeout(done, 2000);
};
return {
show,
message,
beforeEnter,
enterFrom,
enterTo,
beforeLeave,
leaveFrom,
leaveTo,
};
},
};
</script>
3.2 动画事件
Vue3还引入了动画事件,这使得动画更加丰富。onBeforeEnter、onEnter、onAfterEnter、onBeforeLeave、onLeave和onAfterLeave分别对应于enter和leave的不同部分。这些事件允许开发者在不同动画状态下执行额外的代码。
<template>
<div>
<button @click="show = !show">Toggle message</button>
<transition @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter" @before-leave="beforeLeave" @leave="leave" @after-leave="afterLeave">
<p v-if="show">{{ message }}</p>
</transition>
</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const show = ref(true);
const message = ref('Hello, Vue 3!');
const beforeEnter = (el) => {
el.style.opacity = 0;
};
const enter = (el, done) => {
el.style.opacity = 1;
setTimeout(done, 2000);
};
const afterEnter = (el) => {
console.log('enter animation done');
};
const beforeLeave = (el) => {
el.style.opacity = 1;
};
const leave = (el, done) => {
el.style.opacity = 0;
setTimeout(done, 2000);
};
const afterLeave = (el) => {
console.log('leave animation done');
};
return {
show,
message,
beforeEnter,
enter,
afterEnter,
beforeLeave,
leave,
afterLeave,
};
},
};
</script>
总结
Vue3在动画效果支持方面有很多改进。Composition API、ref和reactive、watchEffect和新的动画事件使得开发者可以更好地控制动画效果。Vue3的最新动画API具有更大的灵活性和可扩展性,可以轻松地创建更丰富的动画效果。