React:处理多个浏览器,浏览器选项卡以限制重复操作
React : Handle multiple browser(s), browser tabs to restrict duplicate operations
我有一个按钮 Submit
,单击它会执行一些调用 API 的操作。 Post点击,按钮被禁用或者基本上按钮的初始状态和操作被改变。
我有两个或多个浏览器选项卡显示 Submit
的相同屏幕。如果在任何一个选项卡中执行了 Submit
操作,则其他选项卡应显示更新的版本。其他选项卡应显示禁用版本,不应显示初始状态。
如何实现?我正在使用 React、JS
如果您正在寻找仅限客户端的解决方案,这里有一个很棒的 article 关于在浏览器选项卡之间共享状态。限制是它不适用于不同的 browsers/machines.
从 UI/UX 的角度来看,处理此问题的最佳方法是使用验证。如果 User A
单击提交,然后 User B
从不同的浏览器或选项卡单击提交,应该向 User B
显示错误,指示“此操作已经发生”。
话虽如此,您想要实现的目标是可能的。
一种方法是使用 WebSocket。 WebSocket 是客户端和服务器之间的持久连接,允许双向通信。
你的 React 应用程序中带有提交按钮的页面将是某个 websocket 频道的“订阅者”。当第一次点击提交按钮时(无论从哪里点击),消息可以从 WebSocket 服务器“发布”到 ALL
订阅者,无论使用的浏览器或选项卡如何。
基本上,您可以在 React 应用程序中添加一个 onMessage
处理程序,您可以在收到特定消息时禁用提交按钮。
我不知道你在服务器端使用什么技术,但对于 WebSocket 服务器,有很多选择。对于 React 应用程序,react-websocket 可以直接使用。
#1 必须在服务器端限制数据重复。
- 我会推荐一些像 node-cache. Node-cache will having scalability issues, so better to go with redis 这样的缓存。 (逻辑应该是这样的:如果表单提交了
user_id
,或者form_id
,你可以为它创建一个缓存,如果你继续它,将它存储在数据库中,其他情况抛出错误。在其他浏览器上,如果 unique_id
既不在缓存中也不在 db
中,则必须在 submit
之前验证。如果存在,则可以在 db
中抛出错误nr.2 浏览器。
#2 如果你想禁用按钮,你必须使用websockets
你可以在客户端完成
const Form = () => {
const [buttonDisabled, setButtonDisable] = useState(false);
// first tab fire
const onSubmit = () => {
.
.
.
localStorage.setItem("formSubmited", "true");
};
useEffect(() => {
const disableButton = (e) => {
if (e.storageArea.formSubmited) {
setButtonDisable(true);
}
};
// second tab fire
window.addEventListener("storage", disableButton);
return () => {
window.removeEventListener("storage", disableButton);
};
}, []);
.
.
.
};
我有一个按钮 Submit
,单击它会执行一些调用 API 的操作。 Post点击,按钮被禁用或者基本上按钮的初始状态和操作被改变。
我有两个或多个浏览器选项卡显示 Submit
的相同屏幕。如果在任何一个选项卡中执行了 Submit
操作,则其他选项卡应显示更新的版本。其他选项卡应显示禁用版本,不应显示初始状态。
如何实现?我正在使用 React、JS
如果您正在寻找仅限客户端的解决方案,这里有一个很棒的 article 关于在浏览器选项卡之间共享状态。限制是它不适用于不同的 browsers/machines.
从 UI/UX 的角度来看,处理此问题的最佳方法是使用验证。如果 User A
单击提交,然后 User B
从不同的浏览器或选项卡单击提交,应该向 User B
显示错误,指示“此操作已经发生”。
话虽如此,您想要实现的目标是可能的。
一种方法是使用 WebSocket。 WebSocket 是客户端和服务器之间的持久连接,允许双向通信。
你的 React 应用程序中带有提交按钮的页面将是某个 websocket 频道的“订阅者”。当第一次点击提交按钮时(无论从哪里点击),消息可以从 WebSocket 服务器“发布”到 ALL
订阅者,无论使用的浏览器或选项卡如何。
基本上,您可以在 React 应用程序中添加一个 onMessage
处理程序,您可以在收到特定消息时禁用提交按钮。
我不知道你在服务器端使用什么技术,但对于 WebSocket 服务器,有很多选择。对于 React 应用程序,react-websocket 可以直接使用。
#1 必须在服务器端限制数据重复。
- 我会推荐一些像 node-cache. Node-cache will having scalability issues, so better to go with redis 这样的缓存。 (逻辑应该是这样的:如果表单提交了
user_id
,或者form_id
,你可以为它创建一个缓存,如果你继续它,将它存储在数据库中,其他情况抛出错误。在其他浏览器上,如果unique_id
既不在缓存中也不在db
中,则必须在submit
之前验证。如果存在,则可以在db
中抛出错误nr.2 浏览器。
#2 如果你想禁用按钮,你必须使用websockets
你可以在客户端完成
const Form = () => {
const [buttonDisabled, setButtonDisable] = useState(false);
// first tab fire
const onSubmit = () => {
.
.
.
localStorage.setItem("formSubmited", "true");
};
useEffect(() => {
const disableButton = (e) => {
if (e.storageArea.formSubmited) {
setButtonDisable(true);
}
};
// second tab fire
window.addEventListener("storage", disableButton);
return () => {
window.removeEventListener("storage", disableButton);
};
}, []);
.
.
.
};