在对表单使用绑定方法时,如何传递 total 的值?

How can I pass the value of total when using bind method for the forms?

提问人:JS3 提问时间:11/11/2023 更新时间:11/11/2023 访问量:21

问:

我有这个表格,我想传递总计的值。

对于总数我已经能够传递数组的值。cart

const [total, setTotal] = useState<number | undefined>(undefined);
  const calculateTotal = () => {
    return cart.reduce((total, item) => total + item.price * item.quantity, 0);
  };

  useEffect(() => {
    const calculatedTotal = calculateTotal();
    setTotal(calculatedTotal);
  },[cart])

const  addOrderInfo = addCustomerOrder.bind(null, cart)

在表单的返回函数中:

 <form action={addOrderInfo}>
   //input fields here
</form>

提交表格:

export default async function addCustomerOrder(cart: any, formData: FormData): Promise<{ message: string }> {    
    const cookieStore = cookies()
    const supabase = createServerActionClient({ cookies: () => cookieStore })
    console.log(formData, "formData")
    console.log(cart, "prev state")

    try{
       //rest of the data here
        return {  message: `Succesfully added the data` }
    }catch(e){
        return {message: "Failed to submit the form."}
    }

}
JavaScript ReactJS 打字稿 形式 next.js

评论

0赞 MrXQ 11/11/2023
尝试使用表单隐藏输入<input type="hidden" name="total" value={total} />

答:

1赞 adsy 11/11/2023 #1

这里有一些东西需要清理,在找到问题的根源之前会有所帮助。

total是从状态项派生而来的,所以实际上,根本不应该使用。这样做“有效”,但是一种代码味道,因为您正在手动管理从其他状态计算的状态。如果您忘记保持它们同步,这往往会导致错误。 是正确的工具。carttotaluseStateuseMemo

关于主要问题。没有必要做类似的事情,这不是你在 React 中做这种事情时通常看到的模式。您可以简单地定义一个包含额外信息的新闭包,并将其传递给主处理程序。addCustomerOrder.bind(null, cart)

将您发布的所有顶部区块替换为:

  const total = useMemo<number>(() => {
    const calculateTotal = () => {
      return cart.reduce((total, item) => total + item.price * item.quantity, 0);
    };

    return calculateTotal();
  }, [cart])

将表单包装替换为

 <form action={(data) => addCustomerOrder(cart, total, data)}>
   //input fields here
</form>

现在更改签名:addCustomerOrder

export default async function addCustomerOrder(cart: any, total: number, formData: FormData): Promise<{ message: string }> {    

评论

0赞 JS3 11/29/2023
谢谢,但我在函数中也有一个,我现在的问题是如何显示messageaddCustomerOrdermessage