关于状态

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 免费赠送 200 美元!

React 在状态管理方面实际上有点特立独行。 虽然它拥有像 useStateContext 这样的顶级工具,但您在处理响应式全局状态时更多的是自力更生。 以下是 David Ceddia 关于 “React 状态管理库及其选择” 的文章,它很好地介绍了各种选择。 我之所以说“特立独行”,是因为其他所有主要的 JavaScript 框架都有自己的全局状态实现。

对我来说,状态的概念对于前端开发至关重要。 它就像组件一样。 只是说它是处理数字产品的一种明智方式。 状态是我们对网站上发生的事情的抽象。 它可以是侧边栏是否打开或关闭,评论数据列表,登录用户的详细信息,或者我们需要绘制和使 UI 具有功能性的任何其他内容。

这就是为什么我仍然对原生 Web 组件完全没有尝试解决状态问题感到惊讶。 我没有足够的知识来了解原因,但作为一名观察者,我可以看到开发人员正在努力寻找最佳方法,以使状态在 Web 组件中以及跨 Web 组件工作。 最近,我遇到了 Evan You 的 @vue/lit。 这是一个用于 Web 组件的微框架,它通过使用 lit-html 来解决模板化和重新渲染问题,然后通过 Vue 的 reactivity 来整合响应式状态。 我觉得它看起来很酷。

Evan 的想法将使用的库的总大小降至约 6kb。 那么我们还能降低多少呢? Krasimir Tsonev 撰写了 “使用 JavaScript 模块系统进行状态管理”,其中他们完全没有使用库(可以说是在此过程中创建了自己的小型库)。 状态管理器可以仅仅是一个我们导入并使用的模块,本质上它是一个具有值、变异函数和监听器的对象。 这将状态管理的开销降到了几乎为零,代价是放弃了使用更强大的库所获得的有效重新渲染、更好的模板化和生命周期功能。

说到完全不使用任何库,以下是 Leo Bauza 的文章 “Viget 的 JavaScript 是如何工作的?”,其中他们深入介绍了他们在 HTML 基础上添加功能所使用的原生模式。 看起来所有功能都是通过 data-* 属性 应用的,每个数据属性都有自己的 JavaScript 模块(类)来处理该特定功能。 这里似乎没有处理全局状态,但他们在模块中 以相当手动的方式 处理状态。

我发现所有这些东西都很迷人。 在我自己的工作中,我敢说我相当典型。 如果它是一个很小的东西,我可能会考虑自己动手。 如果它是一个中等大小的东西,但影响力很小,我可能会尝试使用新的和花哨的——甚至可能是实验性的——方法。 但一旦我要做一些大型且影响力很大的事情,我发现从最知名的库中选择更让我感到安心,即使有时这意味着要使用更重的库。 😬