如何在Button的onClick功能之后或期间重定向?

Posted

技术标签:

【中文标题】如何在Button的onClick功能之后或期间重定向?【英文标题】:How to redirect after or during the onClick function of Button? 【发布时间】:2022-01-01 10:49:03 【问题描述】:

我正在尝试在我的 Next.js 网站中添加一项功能,该功能允许用户单击按钮来创建新组,然后将他们重定向到“邀请成员”页面,该页面使用动态 URL 中自动生成的 group_id路由。我目前正在使用 Next.js 的路由器,但我觉得有更好(或工作)的方式来做到这一点。 JS(export default function groups ()内):

const [num, setNum] = useState("");
const router = useRouter()
const createGroup = async () => 
  const  data, error  = await supabase
    .from("chatgroups")
    .insert([
      
        group_name: groupName,
        creator: user.email,
        description: groupDesc,
        accepted_members: user.email + " ",
        invited_members: ""
      
    ]);

  if (error) 
    console.log(error);
   else 
    setNum("/groups/" + String(data[0].group_id));
    
    router.push(num);
  
;

html(以相同的 JS 脚本返回):

<button type="button" className="bg-yellow-500 rounded px-12 py-2" onClick=()=> 
  createGroup()
   >Insert test group</button>

我尝试将路由器用于服务器和客户端,但都无法识别 .push()

import  Router  from "next/dist/client/router";
import  Router  from "next/dist/server/router"; //neither of these recognized the method.

我的目标是执行 createGroup() 函数,其中“data”的值将接收自动生成的新 SQL 行的 int id。然后我想用这个id重定向到“/groups/[id]”,其中[id]是新的ID。我尝试使用带有const [num, setNum] 的链接,但它在设置新值之前执行重定向。我对 Next.js 比较陌生,因此我将不胜感激。

期望的输出: 单击按钮 -> 将行添加到 group_id = 17 的 SQL 表。 将用户重定向到“/groups/invite_members/17”。

编辑:我已将上面的主要 JS 代码更新为使用 useRouter(),现在它仅在每第二次点击时才有效。

【问题讨论】:

设置状态是异步操作,你在router.push调用中使用的num在你第一次点击按钮时不会有你在setNum(...)设置的值。尝试将值设置为变量并在 router.push 调用中使用它,例如const path = "/groups/" + String(data[0].group_id); 然后设置状态并调用router.push(path); @juliomalves 谢谢你,解决了! 【参考方案1】:

问题是调用setNum does not update num immediately,因为设置状态是一个异步操作。

这意味着在调用router.push(num) 时,在第一个按钮上单击num 时仍将具有其默认值(""),并且只有在第二次单击该按钮时,num 状态才会更新为之前设置的值。

要修复它,您可以将值设置为变量并在 router.push 调用中使用它。

const path = "/groups/" + String(data[0].group_id);

setNum(path);

router.push(path);

【讨论】:

以上是关于如何在Button的onClick功能之后或期间重定向?的主要内容,如果未能解决你的问题,请参考以下文章

如何在脚本中使用对话框制作警报 onclick 功能以将警报容器重用于其他对话框

如何在无序列表元素上添加 onClick 功能?

button按钮如何在onclick中调用java后台函数

如何在点击按钮上获得javascript功能

如何在反应中使用 axios 发出 POST 请求?

pyqt5中添加一个按钮b,b的功能是添加一个文本框,添加之后如何显示到界面上?