react组件内部的状态是在渲染之间保持不变的封装数据。useState()是React钩子,负责管理功能组件内部的状态。我喜欢useState()确实使状态处理变得非常容易。但是我经常遇到类似的问题:
这篇文章介绍了3条简单的规则,可以回答上述问题并帮助您设计组件的状态。
高效状态管理的首要原则是:让一个状态变量负责一个关注点。
让一个状态变量负责一个关注点使它符合单一责任原则。让我们来看一个复合状态的例子,即一个包含多个状态值的状态。
状态由一个普通的JavaScript对象组成,该对象具有属性on和count。
第一个属性state.on包含一个布尔值,表示开关。state.count保存一个表示计数器的数字,例如,用户单击按钮的次数。
然后,假设您要将计数器增加1:
您必须将整个状态保持在附近才能更新计数。这是一个需要调用的大型构造来简单地增加一个计数器:因为一个状态变量负责两个关注点:开关和计数器。
解决方案是将复合状态分成2个原子状态并计数:
on状态变量仅负责存储开关状态。同样的方法,count变量仅负责计数器。
现在,让我们尝试更新计数器:
计数状态仅负责计数,易于推理,分别易于更新和读取。
不必担心调用多个useState()为每个关注点创建状态变量。
但是请注意,如果您过多使用useState()变量,则很有可能您的组件违反了“单一职责原则”。只需将此类组件拆分为较小的组件即可。
将复杂的状态逻辑提取到自定义钩子中。
将复杂的状态操作保留在组件中是否有意义?
创建React Hook是为了将组件从复杂的状态管理和副作用中隔离出来。因此,由于组件应该只关心要呈现的元素和要附加的一些事件侦听器,所以应该将复杂的状态逻辑提取到自定义Hook中。
让我们考虑一个管理产品列表的组件。用户可以添加新的产品名称。约束是产品名称必须唯一。
第一次尝试是将产品名称列表的设置程序直接保留在组件内部:
names变量保存产品名称,单击Add按钮时将调用addNewProduct()事件处理程序。
在addNewProduct()中,使用一个Set对象来保持产品名称的唯一性。组件应该关注这个实现细节吗?不。
最好将复杂的状态设置器逻辑隔离到自定义Hook中。
新的自定义HookuseUnique()负责保持项目的唯一性:
将自定义状态管理提取到一个Hook后,ProductsList组件就变得轻松多了:
const [names, addName] = useUnique([])是启用自定义Hook的原因。组件不再与复杂的状态管理混杂在一起。
如果您想在列表中添加新名称,则只需调用add('新产品名称')。
最重要的是,将复杂的状态管理提取到自定义Hook中的好处是:
将多个状态操作提取到一个reducer中。
继续使用ProductsList的示例,让我们添加一个Delete操作,该操作从列表中删除一个产品名称。
现在,您必须编码2个操作:添加和删除产品。处理这些操作,就可以创建一个 reducer 并使组件摆脱状态管理逻辑。
这种方法也符合 hook 的思想:从组件中提取复杂的状态管理。
这是添加和删除产品的 reducer 的可能实现:
然后可以通过调用 React 的 useReducer() Hook 在产品列表中使用uniqueReducer():
const [names, dispatch] = useReducer(uniqueReducer,[])启用了uniqueReducer。names是保存产品名称的状态变量,dispatch是要使用操作对象调用的函数。
单击添加按钮后,处理程序将调用dispatch({type:'add',name:newName})。调度添加操作使减速器uniqueReducer向状态添加新产品名称。
同样,单击“删除”按钮时,处理程序将调用dispatch({type:'delete',name})。调度删除操作会将产品名称从名称状态中删除。
状态变量应该负责一个关注点。
如果状态具有复杂的更新逻辑,则将该逻辑从组件中提取到自定义Hook中。
同样,如果状态需要多个操作,请使用 reducer 合并这些操作。
无论您使用什么规则,状态都应尽可能简单和分离。该组件不应被状态更新的细节所困扰:它们应该是自定义Hook或 reducer 的一部分。
严格遵循这3个简单规则将使您的状态逻辑易于理解、维护和测试。
原文:https://dmitripavlutin.com/react-state-management/
网页是用户与网站对接的入口,当我们允许用户在网页上进行一些频繁的操作时,对用户而言,误删、误操作是一件令人抓狂的事情,“如果时光可以倒流,这一切可以重来……”。
在React写应用的时候,难免遇到跨组件通信的问题。现在已经有很多的解决方案。React本身的Context,Redux结合React-redux,Mobx结合mobx-react
这个库的作者希望使用 React 内置 API ,直接实现状态管理的功能。看完这个库的说明后,没有想到代码可以这个玩。短短几行代码,仅仅使用 React Hooks ,就实现了状态管理的功能。
我们平时开发的大部分项目,由于复杂度不够, 很少使用 Vuex、Redux 等状态管理库,就算引入了 Vuex 这些库,也只是当作一个全局数据引用,并非对应用状态进行管理。但一旦页面的复杂度比较高,必然要引入状态管理,今天就聊聊我理解中的状态管理。
React Hooks 在 2018 年年底就已经公布了,正式发布是在 2019 年 5 月,关于它到底能做什么用,并不在本文的探讨范围之内,本文旨在摸索,如何基于 Hooks 以及 Context,实现多组件的状态共享,完成一个精简版的 Redux。
首先要明确为什么要使用redux,这一点很重要,如果不知道为什么使用redux,那么在开发的过程中肯定不能合理的使用redux.首先来看redux的本质:redux做为一款状态管理工具,主要是为了解决组件间通信的问题。
当我们使用编译器创建一个新Flutter应用的时候,我们可以在主界面看到两个小部件StatelessWidget和StatefulWidget。这是两个最常见使用最频繁的小部件了。StatelessWidget ,StatefulWidget
本文回答了以下问题:么是共享可变状态?为什么会出现问题?如何避免其问题?标有(高级)的部分会更深入,如果你想更快地阅读本文,可以跳过。
项目不大, 又不想用Vuex, 那么使用Observable来实现状态共享也不失为一个选择。用法 :让一个对象可响应。Vue 内部会用它来处理 data 函数返回的对象
当我们登录成功,在这个页面刷新,页面并没有保存登录状态;今天我们就来看一下如何在后台使用cookie保存用户登录状态。做到刷新页面仍然显示在用户登录界面。node实现保持登录状态的方法如下:
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!