在我们的 React 组件中,我们从 REST api(比如说 Car(接收一个对象,允许用户进行更改,并最终保存结果。
为了方便这一点,我们创建了一个自定义的反应钩子来接收状态。示例可能如下所示:
type Car = {
brand: string,
color: string
}
type Props = {
// A service that handles cars
service: Service<Car>
}
function CarEditor(service: Service<Car>) {
const { loading, error, resourceState } = useService(service);
return <form>
<input value={resourceState.brand} />
<input value={resourceState.color} />
</form>;
}
在上面的示例中,resourceState
的类型为Car
。
我在如何对这辆车进行改装方面有点挣扎。一个想法是,我们使用对setState
的调用来管理此对象:
function CarEditor(service: Service<Car>) {
const { loading, error, resourceState } = useService(service);
const [ car, updateCar ] = useState(resourceState);
return <form>
<input value={resourceState.brand} />
<input value={resourceState.color} />
</form>;
}
注意:为简洁起见,我省略了事件处理程序
问题:
- 我是否应该对
Car
的每个属性使用 1 次调用来使用状态。对于复杂对象来说,这似乎是很多重复,但我担心使用整个对象是一种反模式。 useService
本身公开一个updateResourceState
函数,并完全包含 Car 的状态,而不是在主组件中useState
调用会更好吗?
对这一切来说都是全新的,我正在尝试以遵循最佳实践的方式设计它,并且对于坐着的 React 开发人员来说,惊喜最少。
- 如果将复杂对象存储在功能组件的状态中,则不是反模式,建议使用
useReducer
。而且您具有Car
类型的resourceState
一点也不复杂。 - 取决于您的
useService
.如果您将resourceState
存储为useService
中的状态,您只需在useService
中进行更新resourceState
函数并在CarEditor
组件中调用它,它将是干净的且易于维护。