reactjs - 如何使用 React/TypeScript 中的钩子进行部分状态更新
问题描述
我正在尝试将具有状态的组件从基于类转换为功能性,我的状态类如下所示:
class Person {
name:string = ""
email:string = ""
}
我的类组件如下所示:
class Component1 extends React.Component<{}, Person> {
state: Person = new Person();
foo() {
this.setState ({name:"me"});
}
}
您可以看到 setState 调用仅更新状态的一个属性。将其转换为功能组件如下所示:
function Component() {
const [state, setState] = useState(new Person())
function foo() {
setState({name:"me"})
}
}
但我在 setState 调用时遇到编译错误
Argument of type '{ name: string; }' is not assignable to parameter of type 'SetStateAction<Person>'.
Property 'email' is missing in type '{ name: string; }' but required in type 'Person'.
显然,如果我使用,问题就会消失,setState({...state, name:"me"})
但如果这只是 TypeScript 绑定中的一个小故障,我不想这样做。
解决方案
React 文档对此有注释:
笔记
与类组件中的 setState 方法不同,useState 不会自动合并更新对象。您可以通过将函数更新程序形式与对象传播语法相结合来复制此行为:
setState(prevState => {
// Object.assign 也可以使用
return {...prevState, ...updatedValues}; });另一个选项是 useReducer,它更适合管理包含多个子值的状态对象。
所以你的选择是:
- 使用上面的扩展语法。
- 将您的 person 状态拆分为两个单独
useState
的 s。 - 使用 useReducer。不过,这仍然需要将可渗透的状态传播到返回值中。
推荐阅读
- c - 预处理器包括路径、宏等条目不可用
- amazon-web-services - 从存储桶策略中排除一个 Amazon S3 对象
- php - 允许用户更新他们的重力形式单个唯一条目
- shell - 在 Ubuntu 14.04 上启动(不是登录)时运行 shell 脚本
- android-studio - 我正在使用最新的 Android Studio,但是当我尝试拖放文本或按钮或蓝图上未显示的任何内容时
- android-fragments - 没有主构造函数,超类型初始化是不可能的
- javascript - 函数对象上的 javascript 闭包
- mysql - 从查询中获取不平衡行
- angular - 在 Angular 4 的所有组件中重用 HTML 元素
- ios - 什么时候 NSObject 的属性可以为空