在反应功能组件中通过字符串动态设置变量
Dynamically set variables by string in react functional components
我想使用react-query 库,但是这个库只能在功能组件中使用。我目前有一个 class 组件,它基于字符串动态设置字段的状态。例如(简化,实际上它从每次都会产生不同字段的 REST 调用中获取字段,这就是它需要动态的原因):
class MyComponent extends React.Component {
constructor() {
super();
this.primaryFields = ["username"];
this.uiFields = ["first_name", "last_name", "email"];
this.state = {}
this.primaryFields.map(x => {
this.state[x] = "no key given";
})
this.uiFields.map(x => {
this.state[x] = "";
})
}
...
...
}
但是由于钩子不能在循环、嵌套函数或回调函数中使用,我没有办法动态设置状态:
useState()
有没有一种方法可以像我在 class 组件中那样使用功能组件中的挂钩动态设置状态?
我看不出这与 react-query 有什么关系,但你也可以只创建一个 useState
对象来保存你的值:
uiFields = ["first_name", "last_name", "email"]
const [state, setState] = React.useState(() => uiFields.reduce(acc => {
acc[v] = "no key given"
return acc
}, {}))
const updateState = (fieldName, value) =>
setState(previousState => ({ ...previousState, [fieldName]: value })
这有点复杂,因为在调用 setState
时您需要始终 return 完整对象,而不是基于 class 的版本,您可以 return 部分对象。
但现在您可以调用 updateState("myKey", "myValue")
,它应该像基于 class 的等效方法一样工作。
对于更复杂的状态管理,还有useReducer
,在这里可能会派上用场。
我想使用react-query 库,但是这个库只能在功能组件中使用。我目前有一个 class 组件,它基于字符串动态设置字段的状态。例如(简化,实际上它从每次都会产生不同字段的 REST 调用中获取字段,这就是它需要动态的原因):
class MyComponent extends React.Component {
constructor() {
super();
this.primaryFields = ["username"];
this.uiFields = ["first_name", "last_name", "email"];
this.state = {}
this.primaryFields.map(x => {
this.state[x] = "no key given";
})
this.uiFields.map(x => {
this.state[x] = "";
})
}
...
...
}
但是由于钩子不能在循环、嵌套函数或回调函数中使用,我没有办法动态设置状态:
useState()
有没有一种方法可以像我在 class 组件中那样使用功能组件中的挂钩动态设置状态?
我看不出这与 react-query 有什么关系,但你也可以只创建一个 useState
对象来保存你的值:
uiFields = ["first_name", "last_name", "email"]
const [state, setState] = React.useState(() => uiFields.reduce(acc => {
acc[v] = "no key given"
return acc
}, {}))
const updateState = (fieldName, value) =>
setState(previousState => ({ ...previousState, [fieldName]: value })
这有点复杂,因为在调用 setState
时您需要始终 return 完整对象,而不是基于 class 的版本,您可以 return 部分对象。
但现在您可以调用 updateState("myKey", "myValue")
,它应该像基于 class 的等效方法一样工作。
对于更复杂的状态管理,还有useReducer
,在这里可能会派上用场。