【问题标题】:useSelector doesnt update the variable to its latest valueuseSelector 不会将变量更新为其最新值
【发布时间】:2021-10-15 15:29:47
【问题描述】:

我使用 redux 来维护订单状态并从中获取 order_id...我有一个按钮可以触发这个 handleCheckout() 函数,该函数调度 order_id 的新状态。然后在付款成功时调用此 payment_success() 函数,即使 order_id 已更改,它也会打印旧值而不是新值。可能是什么问题以及可能的解决方案是什么?

function CartList({ carts, total }) {
  var dispatch = useDispatch();

  var { user } = useSelector((state) => state.auth);
  var { order_id } = useSelector((state) => state.order);

  function payment_success(payload) {
    // console.log(payload);
    // verifyPayment(payload, order_id);
    console.log(order_id);
  }

  function payment_failed() {
    console.log("Payment Failed");
  }

  function handleCheckout() {
    getOrderId(carts[0].ProductId).then(async (data) => {
      // console.log(data);
      dispatch(createOrder(data));
      var options = {
        ...data,
        handler: payment_success,
        prefill: {
          email: "test@test.com",
          contact: 8900000000,
          name: user.name,
        },
      };
      var rpay = new window.Razorpay(options);
      rpay.open();
      rpay.on("payment.failed", payment_failed);
    });
  }

  return (
    <React.Fragment>
      <div style={{ margin: "50px 40px" }}>
        <h3>My Cart</h3>
        {carts.map((cart) => (
          <CartItem {...cart} />
        ))}
      </div>
      <Container>
        <Row className="justify-content-center">
          <Col md="3" className="d-flex flex-column align-items-center">
            <p>Total: {total}</p>
            <Button onClick={handleCheckout} variant="primary">
              Order Now
            </Button>
          </Col>
        </Row>
      </Container>
    </React.Fragment>
  );
}

【问题讨论】:

  • 我不知道为什么 redux 状态在 payment_success 中没有更新,但你总是可以尝试使用 localStorage。接近调度调用localStorage.setItemdata 存储在缓存中,然后在payment_success 调用localStorage.getItem

标签: javascript reactjs redux razorpay


【解决方案1】:

您正在从那里的最后一次渲染中对 user 变量创建一个陈旧的闭包。该变量将永远不会更新 - useSelector 触发组件更新,并且在下一次渲染中,将有一个具有正确内容的新 user 变量 - 但您的 payment_success 闭包仍然指向旧的 user 变量。

【讨论】:

  • 我也有类似的问题。如何修复它。如何将更新后的 order_id 传递给payment_successclosure
  • 您需要从您的 thunk 中返回重要信息(const result = await dispatch(thunk()) 将返回您的 thunk 将返回的所有内容)在继续之前使用 ref 或执行类似 store.getState 的操作
猜你喜欢
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 2021-07-27
  • 2018-09-10
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 2017-04-09
相关资源
最近更新 更多