找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

819

积分

0

好友

107

主题
发表于 5 小时前 | 查看: 1| 回复: 0

原文地址:https://medium.com/javascript-in-plain-english/i-copy-these-10-code-snippets-into-every-project-8410176ca560
原文作者: Babar saad

你是否曾在新建项目时,突然陷入思考:“这个函数我是不是在之前的哪个项目中已经写过一遍了?”

是的,这种感觉我经历得太多。因此,在构建了几十个 React、Node 以及全栈应用之后,我不再每次都从零开始,而是整理了一个属于自己的工具箱:一套包含 10 个经过实战检验的代码片段。如今,在启动大多数新项目时,我都会先将它们粘贴进去。

这些片段并不复杂,也不是什么框架,但它们是我最信赖的辅助工具。下面就是这份清单,以及它们的真实使用场景。

1. 防抖函数 (Debounce Function)

防止在 scrollresizeinput change 等高频触发事件中执行过多无谓操作。

export function debounce(func, delay = 300) {
  let timeout;
  return (...args) => {
    clearTimeout(timeout);
    timeout = setTimeout(() => func(...args), delay);
  };
}

使用场景:实时搜索框,等待用户停止输入后再发起网络请求。

const handleChange = debounce((val) => searchUsers(val), 400);

2. 日期格式化 (Format Date to Readable String)

从此告别反复搜索“JavaScript 日期格式化”的烦恼。

export function formatDate(dateStr, locale = "en-US") {
  return new Date(dateStr).toLocaleDateString(locale, {
    year: "numeric",
    month: "short",
    day: "numeric",
  });
}

使用场景:在仪表板或收据上显示类似 Apr 22, 2025 这样易读的日期格式。


3. 类名合并工具 (ClassNames Utility)

让那些需要根据条件动态添加的 CSS 类名看起来整洁有序,避免逻辑混乱。

export function classNames(...args) {
  return args.filter(Boolean).join(" ");
}

使用场景:在 React 或 Vue 中动态设置元素类名。

<button className={classNames("btn", isActive && "btn-primary")} />

4. 安全的 JSON 解析 (Safe JSON Parse)

在解析来自 localStorage 或 API 响应的字符串时,优雅处理格式错误,避免应用直接崩溃。

export function safeJsonParse(str, fallback = {}) {
  try {
    return JSON.parse(str);
  } catch {
    return fallback;
  }
}

使用场景:安全地读取可能被用户或意外情况修改过的本地存储数据。

const user = safeJsonParse(localStorage.getItem("user"));

5. 判断空对象 (IsEmpty Object)

Object.keys(obj).length === 0 更严谨、更优雅的方案,能准确判断一个对象是否为空。

export function isEmpty(obj) {
  return obj && Object.keys(obj).length === 0 && obj.constructor === Object;
}

使用场景:在提交表单前,检查表单错误对象是否为空。

if (isEmpty(formErrors)) submitForm();

6. 复制到剪贴板 (Copy to Clipboard)

因为几乎每个应用都会需要一个“复制链接”或“复制验证码”的按钮。

export async function copyToClipboard(text) {
  try {
    await navigator.clipboard.writeText(text);
    return true;
  } catch (err) {
    console.error("Copy failed:", err);
    return false;
  }
}

使用场景:实现一键复制功能。

<button onClick={() => copyToClipboard(url)}>Copy</button>

7. 首字母大写 (Capitalize First Letter)

一个小细节,却能在处理状态、标题或用户输入时显著提升 UI 质感。

export function capitalize(str) {
  return str.charAt(0).toUpperCase() + str.slice(1);
}

使用场景:将状态值从 “pending” 格式化为 “Pending” 后展示。

capitalize(“pending”); // “Pending”

8. 休眠助手 (Sleep Helper)

适用于模拟加载延迟、控制动画节奏,或实现简单的节流操作。

export function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

使用场景:确保 loading 状态至少展示 1 秒,避免闪烁。

await sleep(1000);
// 至少展示 1 秒 loading

9. 数组去重 (Remove Duplicates From Array)

简洁高效地清除数组中的重复项,无需冗长的样板代码。

export function uniqueArray(arr) {
  return [...new Set(arr)];
}

使用场景:合并用户标签和默认标签并去重。

const tags = uniqueArray([...userTags, ...defaultTags]);

10. 从 URL 下载文件 (Download Any File from URL)

通过创建临时链接的方式,在浏览器中立即触发文件下载。

export function downloadFile(url, filename) {
  const a = document.createElement(“a”);
  a.href = url;
  a.download = filename;
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
}

使用场景:用户点击按钮下载简历或导出的数据报告。

downloadFile(“/resume.pdf”, “MyResume.pdf”);

附赠技巧:如何组织它们

为了让这些工具函数井然有序,在大多数 ReactNext.js 项目中,我会将它们统一放置在 /utils 目录下:

/utils
  ├── debounce.js
  ├── formatDate.js
  ├── classNames.js
  ├── jsonHelpers.js
  ├── clipboard.js
  └── etc...

然后在需要的地方按需引入:

import { debounce, formatDate, copyToClipboard } from “@/utils”;

这10个JavaScript代码片段覆盖了日常开发中的高频需求,从数据处理到用户交互,能有效提升编码效率与代码质量。如果你有自己珍藏的“万能”代码片段,欢迎在 云栈社区 与其他开发者分享和探讨。




上一篇:交换机如何工作?深度解析IP通信中交换机的角色与MAC地址作用
下一篇:中大厂绩效考核真相:研发工程师如何避免C评,掌握生存法则
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-25 19:24 , Processed in 0.353932 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表