gpt4 book ai didi

javascript - 功能组件 props/state/store 未在功能中更新 - 什么是可行的替代方案?

转载 作者:行者123 更新时间:2023-11-28 03:19:03 25 4
gpt4 key购买 nike

首先描述我需要实现的目标。我在前端 (React) 中显示的信息主要对应于数据库行,用户可以对这些对象执行常规 CRUD 操作。但是,我还在发送到前端的 JSON 中添加了一些虚拟行,因为有些对象是“默认”的,除非用户确实想要修改它们,否则不应将其插入数据库中。因此,我需要做的是,一旦用户想要修改前端中的“默认”对象,我首先必须将该对象 POST 到特定端点,该端点将其从常量复制到数据库,然后才跟进请求修改该行。

其次,围绕此的架构。为了在前端存储行的状态,我通过 easy-peasy 使用 Redux我有一个 thunk 来在修改之前进行第一次保存。一旦用户想要在 UI 中的任何位置编辑“默认”对象(大约有 20 种不同的编辑对象的方法),程序流程如下所示:

  1. 用户编辑内容并按“保存”
  2. 在保存函数中调用 Thunk 并awaited
  3. Thunk POST 到后端将对象插入数据库并返回相应的行
  4. 后端响应行的 ID
  5. Thunk 调用 action 并使用正确的 ID 更新存储中的这些对象
  6. Thunk 返回,函数指针移回修改函数
  7. 修改函数使用正确的 ID 发出另一个请求
  8. 修改函数使用修改后的值更新存储

现在,我遇到的问题是从步骤 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>
);
}

如果您比我更了解功能组件,那么您就会知道在 onSave()insertToDatabaseIfNecessary() 会更新 Redux 存储中的值,但是当我们进行实际修改并 post(...items) 然后 POST 的值不会更新,因为它们将在下次调用组件时更新。如果这是基于类的组件,它们将会更新,但 easy-peasy 不支持基于类的组件。我想一种方法是直接使用基于类的组件和 Redux,但我感觉可能有一种不同的模式可以用来解决我的问题,而无需诉诸基于类的组件。

问题:是否有一种合理的方法可以使用功能组件来做到这一点?

最佳答案

easy-peasy 中的 Thunk 可以处理异步事件,因此你应该将 axios 帖子放在那里,例如

insertToDatabaseIfNecessary : thunk(async (actions, payload) => {
// First update the data on the server
await axios.post(payload.items);

// Assuming that the post succeeds, now dispatch and action to update your store.
// (You'd want to check your post succeeded before doing this...)
actions.updateYourStoreData(payload);
})

这个简单的 thunk 将等待异步发布完成,因此您可以在 Foo 组件中使用如下操作:

insertToDatabaseIfNecessary();

您不需要等待它或在 Foo 组件中使用 onSave 函数。

关于javascript - 功能组件 props/state/store 未在功能中更新 - 什么是可行的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59357440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com