面试题答案
一键面试实现思路
- 状态管理:使用一个布尔变量来记录菜单当前是展开还是收缩状态。
- 生命周期函数:
onMount
用于初始化一些操作,例如获取初始数据或者设置初始动画状态。beforeUpdate
可以在菜单状态变化时,提前准备动画相关的操作,比如暂停或重启动画。 - 动画实现:利用
tweened
实现平滑过渡的动画,keyframes
则用于更复杂的自定义动画序列。当菜单状态改变时,根据当前状态启动相应的展开或收缩动画。
关键代码结构
<script>
import { onMount, beforeUpdate } from'svelte';
import { tweened } from'svelte/motion';
let isOpen = false;
const height = tweened(0);
onMount(() => {
// 初始化操作,例如设置初始高度为0
height.set(0);
});
beforeUpdate(() => {
if (isOpen!== $isOpen) {
// 状态改变时,根据新状态调整动画
if ($isOpen) {
// 展开动画
height.set(100); // 假设展开高度为100px
} else {
// 收缩动画
height.set(0);
}
}
});
const toggleMenu = () => {
isOpen =!isOpen;
};
</script>
<button on:click={toggleMenu}>
{isOpen? '收缩菜单' : '展开菜单'}
</button>
<div style={`height: ${$height}px; overflow: hidden;`}>
<!-- 菜单内容 -->
<p>这里是菜单内容</p>
</div>
在上述代码中:
isOpen
用于记录菜单的展开/收缩状态。height
使用tweened
来控制菜单内容的高度,实现平滑过渡动画。onMount
初始化高度为0。beforeUpdate
在isOpen
状态变化时,根据新状态设置height
的动画目标值。toggleMenu
函数用于切换isOpen
的状态,从而触发动画。- 菜单内容所在的
div
通过绑定height
的值来实现动画效果。