Vue 3 中组合式函数 Composition Function 封装逻辑
组合式函数是用 Composition API 封装可复用逻辑的函数。useMouse 和 useFetch 是常见例子。比 mixin 更清晰没有命名冲突。
React useEffect 依赖是数组时长度变化触发执行
useEffect 依赖数组时数组的引用每次渲染都变导致每次执行。依赖数组长度或展开数组元素可以减少不必要的触发。本文展示数组在依赖中的行为。
Vue 3 watchEffect 和 watch 的区别
watchEffect 自动追踪使用的响应式数据依赖变化就执行。watch 需要明确指定监听的数据源。watchEffect 在组件创建时立即执行一次。
CSS writing-mode 文字竖排
writing-mode:vertical-rl 让文字从上到下从右到左排列适合中文古文和日本语排版。配合 text-orientation 控制文字方向。本文展示竖排的 CSS 写法。
React 中 Context 导致的不必要重渲染
Context 的 value 变了所有消费该 Context 的组件都会重渲染不受中间组件 memo 的影响。拆分多个 Context 或用 useMemo 稳定 value 可以减少影响。
Vue 3 动态组件 component is
<component :is="currentComponent"> 动态切换组件。配合 keep-alive 缓存切换后的组件状态避免重复渲染。本文展示 Tab 切换场景的用法。
CSS grid-template-areas 区域命名布局
grid-template-areas 用名字标记网格区域比数字定位更直观。用 . 表示空单元格。本文实现一个常见的页面三行两列布局。
React 中 useEffect 的依赖是对象时无限循环
useEffect 依赖对象时每次渲染创建新对象导致无限循环。需要 useMemo 稳定对象引用或把对象拆成原始值作为依赖。本文展示这个常见陷阱。
CSS 中的 currentColor 当前文本颜色
currentColor 是 CSS 中表示当前元素 color 值的变量。设置 border 或 background 时用 currentColor 会自动跟随文本颜色不需要额外声明。
Vue 3 中 style scoped 和深度选择器 deep
scoped 样式默认只作用于当前组件无法影响子组件的根元素。用 :deep(.class-name) 穿透 scoped 限制修改子组件样式。本文展示深度选择器的写法。
CSS 中的 aspect-ratio 控制宽高比
aspect-ratio:16/9 让元素保持 16:9 宽高比不受内容尺寸影响。配合 max-width 可以实现自适应的视频容器。本文展示 aspect-ratio 的兼容性和用法。
React 中表单受控组件和非受控组件
受控组件的值由 React state 管理每次输入都触发 setState。非受控组件用 ref 直接读取 DOM 值性能更好但不方便做实时校验。本文对比两者的适用场景。
CSS 变量 var 实现主题切换
用 CSS 变量存主题色在 :root 下定义亮色变量在 [data-theme=dark] 下定义暗色变量。通过 JS 切换 data-theme 实现一键换主题。本文给出完整的主题切换方案。
React 合成事件和原生事件混用的坑
React 的合成事件和通过 addEventListener 添加的原生事件不在同一个系统里。合成事件的 stopPropagation 不能阻止原生事件冒泡反之亦然。本文解释原因和应对方式。
Vue 3 中 CSS Modules 的使用
Vue 3 的样式作用域可以用 scoped 或 CSS Modules。scoped 通过属性选择器实现CSS Modules 通过类名哈希。本文对比两种方案的适用场景。
React 中列表操作 reducer 替代多个 useState
列表的增删改查涉及多个操作时用 useReducer 比多个 useState 更清晰。dispatch 一个 action 描述操作类型而不是手动修改状态。本文实现一个完整的列表 CRUD 示例。
CSS 伪元素 before after 的 content 属性
::before 和 ::after 必须设置 content 属性才会显示。content 可以放文本/attr() 读取属性值/url() 引用图片。本文展示伪元素的各种 content 用法。
React Portals 的冒泡事件不受 DOM 层级影响
React Portal 渲染到父组件 DOM 之外的节点但事件冒泡按照 React 组件树而不是 DOM 树进行。所以 Portal 内触发的事件可以被父组件捕获。
CSS scroll-behavior smooth 平滑滚动
scroll-behavior:smooth 让锚点跳转和 scrollIntoView 的滚动变得平滑不需要 JavaScript。设置到 html 元素上全局生效。本文给出配置方式和浏览器兼容性说明。
React useCallback 什么时候不需要用
useCallback 只用在传给 memo 子组件的 props 或 useEffect 依赖里。大部分场景不用 useCallback 因为重新创建函数的成本低于缓存查找。本文说明 useCallback 的使用边界。
Vue 3 组件 v-model 多个绑定
Vue 3 允许一个组件有多个 v-model 绑定每个 v-model 带一个参数区分。v-model:title 和 v-model:content 分别绑定不同的值。本文用表单组件演示多 v-model。
React 中空数组当做依赖 useEffect 只执行一次不准确
useEffect 空数组只在组件挂载时执行一次看起来像 componentDidMount。但 React 严格模式让它在开发阶段执行两次以检测副作用。本文解释这个行为。
CSS backdrop-filter 背景模糊效果
backdrop-filter:blur(10px) 对元素背后的区域应用模糊效果产生毛玻璃质感。相比 filter 只作用于元素本身backdrop-filter 不影响子元素的内容。
React 自定义 Hook 封装复用逻辑
自定义 Hook 是 React 复用状态逻辑的方式。将组件逻辑提取到 useXxx 函数中可以被多个组件共享。本文用 useWindowSize 和 useDebounce 两个例子展示。
Vue 3 v-model 在自定义组件上的双向绑定
Vue 3 自定义组件用 v-model 需要子组件声明 modelValue props 并 emit update:modelValue 事件。defineModel 宏简化了这个过程。本文展示两种写法。
React useEffect 不传第二个参数会怎么样
useEffect 不传第二个参数每次渲染后都执行副作用如果在副作用里更新了 state 会导致无限循环。本文说明 useEffect 参数的变化行为和对应的场景。
CSS object-fit 控制替换元素的尺寸适配
object-fit:cover 让图片覆盖容器按比例缩放并裁剪object-fit:contain 完整显示图片。这是 CSS 中处理图片自适应的核心属性。本文对比各值的表现。
Vue 3 provide inject 跨级组件通信
provide/inject 让祖先组件向所有子孙组件注入依赖不需要逐层传递 props。适合主题和用户信息等全局配置。本文对比 provide/inject 和 props 逐层传递的代码量差异。
React 中 dangerouslySetInnerHTML 的 XSS 风险
dangerouslySetInnerHTML 直接将 HTML 字符串渲染到 DOM中如果内容包含用户输入存在 XSS 攻击风险。先用 DOMPurify 清洗 HTML 再渲染可以防范。
React 条件 class 的几种写法对比
React 条件 className 有多种写法:三元表达式 clsx 库和 classnames 库。clsx 支持条件对象和数组参数。本文对比各写法在复杂条件下的可读性和灵活性。
Vue 3 中 nextTick 的正确使用场景
Vue 的数据更新是异步的修改响应式数据后 DOM 不会立即更新。nextTick 在 DOM 更新完成后执行回调适合操作更新后的 DOM。本文展示 nextTick 在表单验证中的用法。
React memo 对 props 的浅比较
React.memo 对 props 做浅比较对象和函数每次渲染新建导致 memo 失效。配合 useMemo 和 useCallback 才能发挥 memo 的作用。本文用对比代码展示 memo 生效的条件。
CSS calc 在不同长度单位间计算
calc(100% - 80px) 允许在不同长度单位间做运算。加减法两边单位可以不同乘除法至少一边是数字。本文展示 calc 在响应式布局中的实际应用。
React children 类型检查 PropTypes vs TypeScript
React 的 children 在 TypeScript 中用 React.PropsWithChildren 或直接声明 React.ReactNode 类型。PropTypes 是运行时检查TypeScript 是编译时检查。本文对比两种方式。
Vue 3 Teleport 搭配 Transition 实现弹窗动画
Teleport 渲染到 body 后 Transition 动画仍然可以正常生效因为 Vue 的动画系统不依赖 DOM 层级。本文实现一个带入场和出场动画的 Modal 组件。
Vue 3 向组件传递多个属性用 v-bind 对象语法
v-bind="obj" 可以把一个对象的所有属性一次性传给子组件比逐个写 props 更简洁。适合传递配置对象或从 API 拿到的数据。本文展示 v-bind 对象语法的具体用法。
React JSX 里用 switch 报错改用对象映射
JSX 不支持 if/else 和 switch 语句因为 JSX 是表达式不是语句。用对象 {value: } 或三元表达式替代 switch 更简洁。本文展示两种条件渲染的改造方式。
CSS 伪类 :has 选择器父元素选择终于有了
:has 是 CSS 选择器的革命性增强可以根据子元素是否存在选择父元素。ul:has(li.active) 选择含 active 项的列表。本文展示 :has 的多种实际应用场景。
Vue 3 computed 和 watch 使用场景划分
computed 根据已有数据计算出新值有缓存依赖不变不执行。watch 监听数据变化执行副作用适合异步操作和 DOM 操作。本文用搜索过滤和表单提交两个案例区分它们的职责。
Next.js getServerSideProps 返回 null 导致页面空白
getServerSideProps 返回 { props: null } 时 Next.js 不会渲染页面。正确做法是返回 { props: {} } 或 { notFound: true } 显示 404。本文列出返回值不正确导致的页面异常。
React 中 useRef 不只是拿 DOM 还能存可变值
useRef 返回一个在整个组件生命周期内保持不变的 ref 对象修改 .current 不会触发重新渲染。可以用它存储定时器 ID 和上一次的值等不直接影响 UI 的数据。
Webpack 打包忽略 moment.js 的语言包
moment.js 默认包含所有语言包打包后体积很大。用 webpack.IgnorePlugin 忽略 locale 目录再按需引入需要的语言可以大幅减小打包体积。本文给出 webpack.config.js 的具体配置。
React 列表删除后自动滚动到顶部
删除列表项后页面可能还停留在被删项的位置用户体验不好。用 useEffect 监听列表长度变化删除后自动滚动到列表顶部。本文用 useRef 操作 scrollTop 实现。
Vue 3 defineEmits 和 emits 选项的区别
Vue 3 的 defineEmits 是 script setup 语法中声明事件的宏emits 是 options API 中的写法。defineEmits 有更好的类型推导。本文对比两种写法的使用场景。
React useEffect 清理函数里还在用 setState 会报警告
组件卸载后 useEffect 清理函数里的 setState 会报 Cant perform a React state update on an unmounted component。解法是在 cleanup 里加一个标志位判断组件是否还挂载。
localStorage sessionStorage IndexedDB 存储方案选型
localStorage 5MB 同源共享关闭不清除适合偏好设置。sessionStorage 5MB 关 tab 清除。IndexedDB 250MB 支持索引适合大量离线数据。本文用表格对比三者的选型依据。
font-display swap 解决字体加载文字闪烁
浏览器加载自定义字体时默认隐藏文字直到字体下载完这段时间用户看不到内容。font-display:swap 先显示后备字体等自定义字体加载完再替换同时可能造成 FOUT。本文介绍 font-display 各值的差异。
useContext 加 useReducer 能代替 Redux 吗
useContext 加 useReducer 可以覆盖 Redux 大部分功能但 context 值变了所有消费组件都会重渲染不像 Redux 的 selector 能精确控制。本文对比两者在大型项目中的表现。
React useState 更新不是立即生效拿到的是旧值
useState 的 set 函数是异步的连续调用两次第二次拿到的可能是旧值。传函数 prev 给 setState 可以保证每次拿到的 prev 是最新的。本文用计数器示例展示闭包陷阱。
Vue 3 Teleport 把弹窗渲染到 body
Vue 3 Teleport 把弹窗渲染到 body是开发中经常遇到的问题。本文从实际场景出发分析原因并给出可操作的解决方案适合正在排查这个问题的开发者参考。
aria-label 给图标按钮加无障碍标签
aria-label 给图标按钮加无障碍标签是开发中经常遇到的问题。本文从实际场景出发分析原因并给出可操作的解决方案适合正在排查这个问题的开发者参考。
前端白屏时间 FP 和 FCP 指标
前端白屏时间 FP 和 FCP 指标是开发中经常遇到的问题。本文从实际场景出发分析原因并给出可操作的解决方案适合正在排查这个问题的开发者参考。
useEffect cleanup 在组件卸载时执行
useEffect cleanup 在组件卸载时执行是开发中经常遇到的问题。本文从实际场景出发分析原因并给出可操作的解决方案适合正在排查这个问题的开发者参考。
React 渲染循环不要用 indexOf 和 includes
React 渲染循环不要用 indexOf 和 includes是开发中经常遇到的问题。本文从实际场景出发分析原因并给出可操作的解决方案适合正在排查这个问题的开发者参考。
Chrome Network 灰色请求是缓存命中
Chrome Network 灰色请求是缓存命中是开发中经常遇到的问题。本文从实际场景出发分析原因并给出可操作的解决方案适合正在排查这个问题的开发者参考。
Next.js 部署后刷新页面 404
Next.js 部署后刷新页面 404是开发中经常遇到的问题。本文从实际场景出发分析原因并给出可操作的解决方案适合正在排查这个问题的开发者参考。
React 错误边界 Error Boundaries 捕获渲染时的错误
React 组件渲染过程中抛出的错误如果不捕获整个应用会白屏。Error Boundary 可以捕获子组件的渲染错误并展示降级 UI。class 组件的 componentDidCatch 或第三方库 react-error-boundary 都可以实现。本文给出两种方式的示例代码。