【问题标题】:setState() not changing the valuesetState() 不改变值
【发布时间】:2021-02-22 19:43:55
【问题描述】:

我从昨天开始一直在努力解决这个问题,但无法解决。

基本上,我们正在为一家餐厅制作一个网站,客户可以使用该网站订购食物并付款。 我现在实现的功能是,当用户按下结帐按钮时,它会转到 /order_confirm 并显示所有订购的菜单。我试图通过将 url 设置为 /order_confirm/id 来传递订单号,其中 id 是订单号。一切正常,除了当我执行 setState() 来更改状态的 ordId 的值并将状态值传递给相应的类时,似乎 setstate 根本没有更改值。

handleCheckoutRequest = async () => {
const { tableNumber } = this.state;
const orderOrdered = 1;
const menuItemIds = this.props.menuItems.map((a) => a.id);
const menuItemCounts = this.props.menuItems.map((a) => a.count);

await API.post(`/orders/`, null, {
      params: { tableNumber, orderStatus: orderOrdered },
    })
      .then(async (response) => {
        const orderId = response.data.id; // this works

    await API.post(`/ordered_items/${orderId}`, null, {
      params: { menuItemIds, menuItemCounts },
    })
      .then((response) => {
        this.setState({
            responses: ["Successfully added order items"], // this works
            responseStatus: "success", // this works as well
            ordId: orderId, // this doesn't
        });
        console.log(orderId); // display 25 on the console (which is right)
        console.log(this.state.ordId); // display -1 which is the default value
      })
      .catch((error) => {
        console.log(error);
      });
  })
};

我在控制台中收到此错误。

无法对未安装的组件执行 React 状态更新。这是 无操作,但它表明您的应用程序中存在内存泄漏。修理, 取消所有订阅和异步任务 componentWillUnmount 方法。

我尝试过设置节奏,使用 setState() 中的箭头函数,在外部声明方法并使用该方法更改值。这一切都没有奏效。


这是 handleCheckout 方法。
handleCheckout = () => {
  const { menuItems } = this.props;
  const { tableNumber } = this.state;
  let responses = [];
  if (tableNumber === -1 || !tableNumber)
    responses.push("No table has been selected");
  if (menuItems.length < 1)
    responses.push("No menu items have been added to cart");
  if (responses.length > 0) {
    this.setState({ responses, responseStatus: "fail" });
    return;
  }
  this.setState({ responses: [], responseStatus: "" });

  this.handleCheckoutRequest();
};

这是我将状态作为道具传递的部分。

<div className="cart__bottom">
   <Checkout
      id={this.state.ordId}
      onTableChange={this.handleTableChange}
      onCheckout={this.handleCheckout}
      responses={responses}
      responseStatus={responseStatus}
   />
</div>

这是它通过的地方的 render()

render() {
const { id, onTableChange, onCheckout, responses, responseStatus } = this.props;
return (
  <div className="cart__checkout">
    <Response responses={responses} responseStatus={responseStatus} />
    <input
      className="input mb-2"
      type="number"
      name="tableNumber"
      placeholder="Table Number"
      onChange={onTableChange}
    />
    <Link to={{
      pathname: "/order_confirm/" + id
    }}>
      <button
        className="button is-primary is-fullwidth"
        onClick={onCheckout}
      >
        Checkout
      </button>
    </Link>
  </div>
);

}

我还发现一篇文章似乎可以解决我的问题。唯一的障碍是我对 React 的应用不够好,无法应用解决方案。
Avoid React state update warnings on unmounted components

【问题讨论】:

  • 这能回答你的问题吗? setState doesn't update the state immediately
  • 提示是尽量避免嵌套承诺。您也在使用异步等待,然后您没有使用它。尝试坚持其中之一。
  • 尝试将api请求逻辑与UI逻辑分离。我认为“存储库模式”可以解决您的问题。
  • @Sysix 尝试了前 3 个答案,但没有解决问题。
  • 你在哪里使用状态?也许你需要useEffect

标签: javascript reactjs


【解决方案1】:

尽量不要将异步等待与普通承诺混为一谈。坚持其中之一。 也尽量不要嵌套承诺,因为这会给你带来回调地狱。

const postOrder = async () => {
  const apiPostOrdersResponse = await API.post(`/orders/`, null, {
    params: { tableNumber, orderStatus: orderOrdered },
  });

  const orderId = apiPostResponse.data.id;

  const apiPostOrderItemResponse = await API.post(
    `/ordered_items/${orderId}`,
    null,
    {
      params: { menuItemIds, menuItemCounts },
    }
  );

  this.setState({
    responses: ['Successfully added order items'],
    responseStatus: 'success',
    ordId: orderId,
  });
};

【讨论】:

  • 如果你控制台记录orderId会发生什么
  • 我在 const orderId 行下做了 console.log(orderId),但控制台什么也没显示。试了 3 次,还是一样的结果。
猜你喜欢
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 2019-07-10
  • 2020-12-10
  • 2019-12-21
  • 2022-01-06
相关资源
最近更新 更多