在本节中,你将实现点击 word-viewer 时动画反向播放的功能。

需要一个新的内部状态来表示当前动画的播放方向 playDirection

// word-viewer.ts

@state() private playDirection: -1 | 1 = 1;

// word-viewer.js

static properties = {
playDirection: {state: true},
...
};

constructor() {
...
this.playDirection = 1;
}

接下来,更新 render() 方法中查找显示 word 的计算逻辑,以处理 this.idx 为负数的情况。

// word-viewer.ts

render() {
...
const idx = ((this.idx % splitWords.length) + splitWords.length) % splitWords.length;
const word = splitWords[idx];
...
}

// word-viewer.js

render() {
...
const idx = ((this.idx % splitWords.length) + splitWords.length) % splitWords.length;
const word = splitWords[idx];
...
}

修改 tickToNextWord 以根据 playDirection 选择下一个单词。

// word-viewer.ts

tickToNextWord = () => { this.idx += this.playDirection; };

// word-viewer.js

tickToNextWord = () => { this.idx += this.playDirection; };

然后添加一个 switchPlayDirection 方法来反转 playDirection

// word-viewer.ts

switchPlayDirection() {
this.playDirection *= -1;
}

// word-viewer.js

switchPlayDirection() {
this.playDirection *= -1;
}

最后,使用 Lit 的声明式事件监听语法this.switchPlayDirection 绑定到 <pre> 元素的点击事件。

在模板中使用声明式 @ 语法添加的事件监听器会自动绑定到组件,因此不需要使用箭头函数。更多信息请参阅事件文档

// word-viewer.ts

render() {
...
return html`<pre
@click=${this.switchPlayDirection}
>${word}</pre>`;
}

// word-viewer.js

render() {
...
return html`<pre
@click=${this.switchPlayDirection}
>${word}</pre>`;
}

在预览中点击 word-viewer,单词动画应该会反向播放。

由于很难看出动画的播放方向,在下一节中你将根据动画方向添加动态样式。