【问题标题】:How can I update the state in a class component?如何更新类组件中的状态?
【发布时间】:2021-08-02 09:48:05
【问题描述】:

我有这些代码可以在表格中显示所有挂单。单击“确认”按钮后,将更新状态,仅加载挂单。我唯一的问题是,除非我转到另一个页面,然后我必须返回待处理订单页面才能查看更新后的状态,否则状态不会更新。

class PendingOrders extends Component {
  constructor() {
    super();
    this.state = { orders: [] };
  }

  columns = [
    "Order ID",
    {
      name: "Confirm",
      options: {
        filter: true,
        sort: false,
        empty: true,
        customBodyRender: (
          value,
          tableMeta,
        ) => {
          return (
            <FormControlLabel
              value={value}
              control={
                <Button value={value} color="secondary" variant="primary">
                  confirm
                </Button>
              }
              onClick={(e) => {
                try {
                  firestore.collection("orders").doc(tableMeta.rowData[0]).set(
                    {
                      orderStatus: "Confirmed",
                    },
                    { merge: true }
                  );
                } catch (err) {
                  console.log(err);
                }
              }}
            />
          );
        },
      },
    },
   

  componentDidMount() {
    try {
      firestore
        .collection("orders")
        .where("orderStatus", "==", "Pending")
        .get()
        .then((snapshot) => {
          const orders = [];
          snapshot.docs.map((doc) => {
            const items = [];
            orders.push({
            const items = [];
            doc.data().items.forEach((item) => {
              items.push(`${item.productName}(${item.qty}),`);
            });
           const data = doc.data();
            orders.push({
          "Order ID": doc.id,
           "Items":items,
            });
          });
          this.setState({ orders: orders });
          // console.log(this.state.orders);
        });
    } catch (err) {
      console.log(err);
    }
  }

  render() {
    return (
      <div>
        <MUIDataTable
          title={"Pending Orders"}
          columns={this.columns}
          data={this.state.orders}
          options={this.options}
        />
      </div>
    );
  }
}

我已经发现了错误。我没有使用.get().then(),而是将其更改为onSnapshot,它已经可以使用了。

 componentDidMount() {
        try {
          firestore
            .collection("orders")
            .where("orderStatus", "==", "Pending")
            .onSnapshot((snapshot) => {
              const orders = [];
              snapshot.docs.map((doc) => {
                const items = [];
                orders.push({
                const items = [];
                doc.data().items.forEach((item) => {
                  items.push(`${item.productName}(${item.qty}),`);
                });
               const data = doc.data();
                orders.push({
              "Order ID": doc.id,
               "Items":items,
                });
              });
              this.setState({ orders: orders });
              // console.log(this.state.orders);
            });
        } catch (err) {
          console.log(err);
        }
      }

【问题讨论】:

  • 如果我停留在挂单页面,那么它不会更新。但是,如果我将转到另一个页面并返回到待处理订单页面,它将被更新。

标签: javascript reactjs firebase google-cloud-firestore mui-datatable


【解决方案1】:

您应该直接更新状态...

this.setState(prevState => {orders: [...prevState.orders, data]})

【讨论】:

  • 这将导致错误提示“×Unhandled Rejection (TypeError): data is not iterable”
  • 等一下,这个 this.setState(prevState => {orders: [...prevState.orders, data]}) 没有显示数据
【解决方案2】:

您没有将数据附加到新订单数组中。你的代码:

snapshot.docs.map((doc) => {
  const items = [];
  const data = doc.data();
  orders.push({
  });
});

应该是什么:

snapshot.docs.map((doc) => {
  const items = [];
  const data = doc.data();
  // Append data to the array, or the right keys if you don't want the whole data
  orders.push(data);
});

【讨论】:

  • 我更新了代码,。如果我使用orders.push(data),数据不会显示
  • 你能做一个console.log(data) 并检查 Firebase 中的数据是否更新?
  • 如果我点击按钮,新更新的数据将不会显示。但是,如果我转到另一个页面,然后返回待处理订单页面,则数据会在 firestore 中更新。
  • 哦,没关系。我已经解决了。我没有使用 get 然后,而是将其更改为 onSnapshot,因为我正在实时获取数据
  • 最好将您的答案发布给未来的读者;)
猜你喜欢
  • 2021-05-13
  • 2022-07-19
  • 2018-05-21
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 2020-11-15
相关资源
最近更新 更多