React JS中如何让order状态钩子成功更新?
React useState状态更新后无法立即获取新值的问题解决
核心问题是React的useState状态更新是异步的——你调用update()后,order并不会立刻变成新值,紧接着执行axios.post时,传递的还是更新前的旧状态,所以后端接收不到正确的订单数据,看起来就像状态没更新一样。
给你两种直接可行的解决方式:
方式一:直接构建新状态并复用
不用单独的update函数,直接在processOrder里生成新的订单对象,既用来更新状态,也用来发请求:
const processOrder = async (e) => { e.preventDefault(); // 先构建完整的新订单对象 const newOrder = { ...order, specBurger: specItemsString, protein: proteinItemsString, bread: breadItemsString, toppings: toppingsItemsString, sides: sideItemsString, drinks: drinkItemsString, // 注意:toFixed返回字符串,后端如果要数字就转成Number price: Number(price.toFixed(2)), }; // 更新状态 setOrder(newOrder); // 用新对象发请求 try { await axios.post('http://localhost:8800/ordered', newOrder); navigate("/pages/Confirmation"); } catch (err) { console.log(err); } }
方式二:监听状态变化再发请求
如果想保留update函数,可以用useEffect监听order的变化,当状态真正更新后再执行请求:
const processOrder = (e) => { e.preventDefault(); update(); } // 监听order状态,更新后触发请求 useEffect(() => { // 过滤初始状态(避免页面加载就发空请求) if (order.price !== 0.00) { const sendRequest = async () => { try { await axios.post('http://localhost:8800/ordered', order); navigate("/pages/Confirmation"); } catch (err) { console.log(err); } }; sendRequest(); } }, [order, navigate]); // 依赖数组里要包含order和navigate
另外提醒下:price.toFixed(2)会返回字符串类型,如果后端接口要求价格是数字,记得用Number()转一下,避免类型不匹配导致的问题。
内容的提问来源于stack exchange,提问作者Zachary Koman
相关产品推荐
相关产品推荐

