文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

我们忘记了前端基础知识

2024-11-29 22:38

关注

在所有最新的趋势和无尽的范例中,我们似乎忘记了前端开发的基础。

最近 Pavel Pogosov 注意到了一些改变他对这个行业看法的事情。似乎在所有无尽的趋势、范式和新奇中,我们忘记了前端开发的核心。

在这篇文章中,Pavel Pogosov 想分享一些最近项目中的代码片段,并试图解释他的想法。

无尽的过度复杂化

这里有一个最基本的卡片组件,它有一个可选的 header 属性。如果这个属性存在,我们会将其渲染在带有特定类名的 div 中。

const Card = ({ children, header }) => {
  return (
    
{header &&
{header}
} {children}
); };

在简单的情况下,一切都运作良好。默认情况下, 不会渲染 header,而  会渲染 header。当 header 的内容是动态的并且可能返回实际内容或 null 时——} />,问题就开始出现了。我们的条件 {header &&

} 无法检测到它并会渲染一个空的 div。

一位开发者试图解决这个问题。他想,“等等,我们可以检查 div 的内容,如果为空就隐藏它!”他写了大致这样的代码:

const Card = ({ children, header }) => {
  const headerRef = useRef();

  useEffect(() => {
    const hasContent = headerRef.current?.childNodes.length > 0;
    headerRef.current.style.display = hasContent ? "block" : "none";
  });

  return (
    
{header && (
{header}
)} {children}
); };

另一个人在代码审查中注意到,这段代码仅在初次渲染时有效。如果是异步更新的,useEffect 不会被调用。经过长时间的讨论,开发者们决定将注意力转向 MutationObserver。

在他们讨论期间,他们也向 Pavel Pogosov 寻求建议。老实说,向他们展示 Pavel Pogosov 的解决方案真的很有趣)只需要使用常规的 CSS 就能解决这个问题。

.card__header:empty {
  display: none;
}

开发者们已经习惯了过度复杂化任务,以至于他们甚至没有检查 CSS 的基本功能。

1993年的错误

在 Pavel Pogosov 之前的项目中,他们有一个侧面板小部件,它必须拉伸到其全高,但不能覆盖 header 和 footer。大致的公式如下:100% - headerHeight - footerHeight。

这个解决方案在所有页面上都运行顺畅,除了一个。在那个页面上,footerHeight 不知何故等于 0。遇到这个错误的开发者深入挖掘并理解到 document.querySelector('footer') 返回 null,但 footer 仍然在页面上渲染。你猜他做了什么?是的,他又使用了 MutationObserver。

这对 Pavel Pogosov 来说看起来很奇怪,所以他决定寻找一个替代解决方案。Pavel Pogosov 确实找到了。所有他需要做的只是交换几行代码……




  

不知怎么的,