如何将数据从ActionFunction传递到Remix.run中的Loader函数?



我正在使用Remix.run制作应用程序。它由多个步骤组成,用户在其中填写表单并最终获得成功屏幕。所有的步骤都位于一条路线上,而成功却在它自己的路线上。

一切如何运作

我在服务器上有类似redux(实际上是XState,但它并不重要)的消息处理。它接收来自字段的当前(或初始负载的初始)状态、消息类型和数据。然后,它将新状态返回给客户端,并根据该状态呈现页面。服务器没有任何存储空间,我不想引入存储空间,因为这会使事情复杂化。
// form page
export async function loader() {
return json(await getInitialState())
}
export async function action({request}) {
let fd = await request.formData();
let {current_state, message_type, ...data} = Object.fromEntries(fd.entries());
return json(await getNextState(current_state, {type: message_type, data}));
}
export function unstable_shouldReload({submission}) {
return !submission
}
export default FormPage() {
let loaderData = useLoaderData();
let actionData = useActionData();
// awful, isn't it?
let currentState = actionData || loaderData;
}

我的问题首先,我的问题是加载器是触发每个表单提交。ActionFunction返回新状态,但LoaderFunction返回初始状态。这很好,但要获得初始状态,加载器要运行API,这是浪费调用。我用unstable_ShouldReload解决了这个问题,它还可以,但不是真的。

现在我到了表单的最后一步,感觉我有同样的问题,但现在我有单独的路由,所以我不能只是阻止运行LoaderFunction。我需要LoaderFunction实际在新页面上运行,并获得从以前的步骤传递的数据。基本上,这是相同的问题-我需要使用的数据发布的形式可用内加载器。

我试图用所有数据替换上面使用会话cookie的代码,但我有其他问题。Action返回带有会话数据的cookie, loader读取它并返回新的状态。不幸的是,它在少数情况下失败了。如果有当前会话,用户可以重新加载页面,防止再次发送信息,并在数据发送时获得结果。这不是web"通常"的方式。的工作原理。我可以改变它,通过在每次加载上销毁会话,但是如果在用户端没有JS,那么第一个POST请求就不会产生结果。否则,这是最好的解决方案(但受限于cookie的大小)。

如何将数据从最后一个动作传递到下一个加载器,或在加载器本身处理POST请求?

如何将数据从上次操作传递到下一个加载器

唯一的方法是使用会话和cookie。如果你想只能够读取会话数据一次,并确保它不再存在后,你可以使用session.flash(key, value),然后在你的加载器,当你做session.get(key)它会从会话中删除flash密钥,如果你在加载器中提交会话,那么cookie将被更新为不再有那个密钥,加载后它将不存在。

在loader本身处理POST请求

这是不可能的,加载器函数只处理GET和OPTIONS请求,对于其他的请求方法只使用action函数。

最新更新