大家都干过这事。正写新功能,喝着咖啡,刚加了个按钮,顺手给点击事件写了个处理函数,随手起了个名字:
const handleClick = () => {
// 一些操作
};
完事,提交,部署,继续写别的。三个月后呢?同一个页面上竟然出现了七个 handleClick。一个打开模态框。 一个负责注销。 还有一个(别问)发射火箭…… 你只能无助地对着终端默念:“为什么?”
handleClick 不是个名字,它是一种无奈的耸肩。函数名应该描述它做了什么,而不是怎么被触发。把函数都叫 handleClick,就像给调料罐起名“容器1”、“容器2”、“容器3”,然后还得猜哪个是盐。刚开始还能用,时间一长就麻烦不断。
举例说明
不要这样写:
<button onClick={handleClick}>删除</button>
//堆代码 duidaima.com
const handleClick = () => {
deletePost(id);
};
三个月后,你会怀疑:“这是删除帖子的吗?删除评论还是用户?会不会误删?”
正确做法:
<button onClick={handleDeletePost}>删除</button>
const handleDeletePost = () => {
deletePost(id);
};
秒懂。即使是凌晨两点熬夜,也能立刻看懂函数的功能,无需追查文件。
事件是触发方式,函数讲述故事
写 onClick={handleClick},描述的是“怎么调用”。 写 onClick={handleAddToCart},描述的是“为什么调用”。这个微小差别,会极大提升代码的可维护性,尤其是在处理复杂组件树时。
反模式的快速滋生
像 handleClick、onChangeHandler、doSomething 这样模糊的名字,就像玩打地鼠一样抓不住逻辑。
想象这种噩梦:
const handleClick = () => {
if (type === 'delete') {
deletePost(id);
} else if (type === 'edit') {
openEditModal(id);
} else if (type === 'preview') {
navigateToPreview(id);
}
};
这不聪明,是 bug 温床。拆开写:
const handleDeleteClick = () => deletePost(id);
const handleEditClick = () => openEditModal(id);
const handlePreviewClick = () => navigateToPreview(id);
然后在组件中明确对应调用。
好名字 = 内置文档
谁不爱文档? 但谁又愿意写?
函数名就是最直接的文档。
比较:
handleClick() —— 只能知道“发生了什么”handleSubmitForm() —— 直接告诉你“提交了表单”
额外福利:重构时感激自己
当你需要查找所有删除帖子的处理函数时,不想盲搜所有 handleClick,想搜:
grep "handleDeletePost" ./src
易读的代码就是可搜索的代码。
语义清晰的命名让逻辑更易追踪,调试更快,远离“这谁写的?哦,是我!”的痛苦。
总结:像给别人写代码一样给函数命名
1.别描述触发方式(别用 handleClick)
2.描述函数做了什么(用 handleSubmit、handleLogout、handleDeletePost)
3.名字保持简短、明确、具体
4.设想半年后还有别人(其实就是未来的自己)要读你的代码
5.写清楚,不要神秘。 明智命名,现在就去重构那些 handleClick 吧,我等你。