

子玥酱 (掘金 / 知乎 / CSDN / 简书 同名)
大家好,我是 子玥酱,一名长期深耕在一线的前端程序媛 👩💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚焦于业务型系统的工程化建设与长期维护。
我持续输出和沉淀前端领域的实战经验,日常关注并分享的技术方向包括 前端工程化、小程序、React / RN、Flutter、跨端方案,
在复杂业务落地、组件抽象、性能优化以及多端协作方面积累了大量真实项目经验。
技术方向: 前端 / 跨端 / 小程序 / 移动端工程化 内容平台: 掘金、知乎、CSDN、简书 创作特点: 实战导向、源码拆解、少空谈多落地 **文章状态:**长期稳定更新,大量原创输出
我的内容主要围绕 前端技术实战、真实业务踩坑总结、框架与方案选型思考、行业趋势解读 展开。文章不会停留在"API 怎么用",而是更关注为什么这么设计、在什么场景下容易踩坑、真实项目中如何取舍,希望能帮你在实际工作中少走弯路。
子玥酱 · 前端成长记录官 ✨
👋 如果你正在做前端,或准备长期走前端这条路
📚 关注我,第一时间获取前端行业趋势与实践总结
🎁 可领取 11 类前端进阶学习资源 (工程化 / 框架 / 跨端 / 面试 / 架构)
💡 一起把技术学"明白",也用"到位"
持续写作,持续进阶。
愿我们都能在代码和生活里,走得更稳一点 🌱
文章目录
-
- 引言
- 一个很容易被忽略的事实
- [多输入 ≠ 多事件](#多输入 ≠ 多事件)
- 真正的难点:输入的"节奏"和"语义"不同
- 高频坑:直接在事件回调里改业务状态
- [正确思路:输入 ≠ 行为](#正确思路:输入 ≠ 行为)
- 多输入时代,必须引入「交互上下文」
- 常见误区:试图"统一事件"
- 正确模型:统一的是「意图」,不是事件
- 为什么你会"感觉交互变卡了"?
- 一个快速自检清单
- 总结
引言
如果你从手机或 Pad 场景一路做到 HarmonyOS PC,大概率会遇到这种情况:
鼠标点一下,反应怪怪的键盘输入偶尔丢触控、鼠标一起用时,状态开始乱。第一反应:是不是事件系统有问题?
于是你开始:
- 打 log
- 怀疑输入延迟
- 怀疑系统适配
- 怀疑是不是 PC 还不成熟
但改了一圈之后发现------问题并没有真正消失。因为问题,并不在输入设备本身。
一个很容易被忽略的事实
在 HarmonyOS PC 场景下:
输入方式不是问题,输入模型才是问题。
手机时代,你几乎可以默认一件事:
用户一次,只会用一种输入方式。
但 PC 场景下,这个前提彻底失效了。
多输入 ≠ 多事件
很多项目一开始,对多输入的理解是这样的:
"不就是多监听几种事件吗?"
于是代码慢慢变成这样:
ts
onTouch(event) {
handleSelect(event.position)
}
onMouse(event) {
handleSelect(event.position)
}
onKey(event) {
if (event.key === 'Enter') {
confirm()
}
}
看起来没毛病,对吧?
但问题在于:你把"输入事件",当成了"用户意图"。
真正的难点:输入的"节奏"和"语义"不同
我们先把几种输入拆开看:
- 触控:连续、高频、位置主导
- 鼠标:低频、精确、悬停态明显
- 键盘:离散、状态驱动、无坐标
但很多代码,却默认它们是"同一种东西"。
结果就是:
同一个操作,用不同输入方式触发,表现完全不一致。
高频坑:直接在事件回调里改业务状态
这是最常见、也最隐蔽的问题。
ts
onMouseDown(e) {
this.selected = e.target
}
onKeyDown(e) {
if (e.key === 'ArrowDown') {
this.selected = this.next()
}
}
当输入频繁时:
- 鼠标事件在改状态
- 键盘事件也在改状态
- UI 重绘和状态更新交叉发生
最终表现出来的就是:
选中状态乱跳,焦点不可控。
正确思路:输入 ≠ 行为
在 PC 场景下,一个必须转过来的观念是:
输入只是信号, 行为必须经过统一建模。
错误模型:事件直达业务
ts
onInput(event) {
updateState(event)
}
正确模型:输入先进入意图层
ts
onInput(event) {
inputQueue.push(event)
}
ts
function update() {
const intents = parseIntents(inputQueue)
applyIntents(intents)
}
输入不再直接改状态。
多输入时代,必须引入「交互上下文」
在手机上,你几乎不需要关心"当前交互模式"。但在 PC 上,这是刚需。
ts
enum InteractionMode {
Mouse,
Keyboard,
Touch
}
class InteractionContext {
mode: InteractionMode = InteractionMode.Mouse
}
ts
onMouseMove() {
context.mode = InteractionMode.Mouse
}
onKeyDown() {
context.mode = InteractionMode.Keyboard
}
为什么要这么做?因为:
- 同一个快捷键
- 同一个点击
- 在不同模式下,语义完全不同
常见误区:试图"统一事件"
有些项目会走向另一个极端:
"那我把所有输入都转成同一种事件不就好了?"
ts
emitAction('select', payload)
问题是:
- 你抹掉了输入特性
- 悬停、长按、连击全没了
- PC 交互优势被自己干掉
PC 不是要"兼容触控", 而是要"释放多输入能力"。
正确模型:统一的是「意图」,不是事件
ts
interface Intent {
type: 'select' | 'move' | 'confirm'
source: 'mouse' | 'keyboard' | 'touch'
payload?: any
}
ts
function parseIntents(events): Intent[] {
// 根据输入源 + 上下文解析
}
ts
function applyIntents(intents: Intent[]) {
// 统一修改模型
}
你会发现:
- 输入方式可以扩展
- 业务模型保持稳定
- 行为一致性反而更高
为什么你会"感觉交互变卡了"?
因为:
- 状态错乱直接体现在 UI 上
- 焦点跳动最容易被感知
- 多输入冲突会被误认为"延迟"
但实际上:
系统并不慢,是你的交互模型在自相矛盾。
一个快速自检清单
如果你的 HarmonyOS PC 项目:
- 在事件回调里直接改业务状态
- 没有交互上下文概念
- 鼠标 / 键盘逻辑分散在各处
- 输入事件直接驱动 UI
那基本可以确定:
问题不在设备,在模型。
总结
在 HarmonyOS PC 上,难的不是"支持多少种输入",而是你有没有把"输入"和"意图"分开。
- 输入是瞬时的
- 意图是稳定的
- 模型必须站在中间
这一步如果不做,后面再加快捷键、多窗口、专业交互,只会越来越痛。