javascript - 理解 React useState() 钩子
问题描述
我正在使用useState()
钩子开发功能性 React 组件。我对这个钩子的使用方式或它背后的设计决策有点困惑。
我做了一个codepen示例来说明我的问题:
https://codepen.io/svenvandescheur/pen/ewwBwR
基于类的组件
在基于类的组件中,this.setState({foo: 'bar'})
仅使用传递给第一个参数的对象中的键更新状态。如果状态已经包含不同的值,则将它们保留在原处。
功能组件
我错误地假设提供的语法和行为与setState()
提供的useState()
对应物非常相似Component
。但是,我注意到这setState({foo: 'bar'})
将替换整个状态,删除未通过的键。
这个问题可以通过将每次调用的整个状态传递给setState()
使用扩展运算符,然后添加更改来解决,如下所示setState({...state, foo: 'bar'})
:
这感觉非常重复,在我的现实世界场景中甚至导致了一个错误,即新状态被旧状态覆盖。
我的问题是,我是否useState()
从这两个方面都Component
理解useState()
正确,以及为什么选择这种行为。以及目前在 React 中处理状态的首选方式是什么。
解决方案
你的理解是正确的。setState
将当前状态和新状态合并在一起以创建新状态。useState
将采用给定的值并替换旧状态。
这种行为可能看起来不直观,但允许将原始值用作状态,例如字符串、数字和布尔值。
如果您需要更多状态,您可以简单地添加更多useState
的。如果你的状态更新逻辑变得有点复杂,你应该使用useReducer
.
推荐阅读
- azure - Azure 数据工厂数据流筛选器花费大量时间
- flask - 为什么烧瓶 jsonify 返回身份不明?
- c++ - 在类方法中对此实例 (this) 使用重载运算符
- jsdoc - 使用 JSDoc 从返回值推断类型
- html - 如何从多个样式表中选择特定的 CSS 选择器
- reactjs - fireEvent.change() 不输入值
- laravel - 使用 laravel vue rest api 获取用户权限
- qooxdoo - selenium:如何知道 qooxdoo 按钮是否启用
- php - 为什么当我启动本地服务器时 Symfony 会询问有效的令牌?
- css - 使用卡片图像作为滑块 - Bootstrap 4