首先对我需要实现的目标进行一些描述。我在前端(React)中显示主要对应于数据库行的信息,用户可以对这些对象执行常规的 CRUD 操作。但是,我还在发送到前端的 JSON 中添加了一些虚拟行,因为有些对象是“默认值”,除非用户真正想要修改它们,否则不应将它们插入数据库。所以我需要做的是一旦用户想要在前端修改一个“默认”对象,我首先必须将该对象发布到一个特定的端点,将它从常量复制到数据库,然后再跟进请求修改该行。
其次,围绕此的架构。为了在前端存储行的状态,我通过easy-peasy使用 Redux,并且thunk在修改之前进行了第一次保存。一旦用户想要在 UI 中的任何位置编辑“默认”对象(大约有 20 种不同的编辑对象的方法),程序的流程如下所示:
- 用户编辑某些内容并按“保存”
- 在保存函数中调用 Thunk 并
await编辑 - Thunk POST 到后端以将对象插入数据库并返回相应的行
- 后端以行的 ID-s 响应
- Thunk
action使用正确的 ID 调用并更新存储中的这些对象 - Thunk 返回,函数指针移回修改函数
- 修改函数使用正确的 ID-s 发出另一个请求
- 修改函数用修改后的值更新存储
现在,我遇到的问题是从第 5 步到第 7 步,因为组件看起来基本上是这样的:
const Foo = () => {
const insertToDatabaseIfNecessary = useStoreActions((actions) => actions.baz.insertIfNecessary)
const items = useStoreState((state) => state.baz.items);
const onSave = async () => {
await insertToDatabaseIfNecessary();
// do the actual modifying thing here
axios.post(...items);
}
return (
<button onClick={onSave}>Save!</button>
);
}
如果你比我更了解函数式组件,那么你就知道会更新 Redux 存储中onSave()的insertToDatabaseIfNecessary()值,但是当我们进行实际修改时,post(...items)发布的值不会更新,因为它们将在下一个更新调用组件的时间。如果这是基于类的组件,它们将被更新,但 easy-peasy 不支持基于类的组件。我想一种方法是直接使用基于类的组件和 Redux,但我觉得可能有一种不同的模式可以用来解决我的问题,而无需求助于基于类的组件。
问题:有没有一种理智的方法可以用功能组件做到这一点?