未访问的参考:无法访问orderstodisplay'初始化之前 - 尝试更新重新渲染react的值

发布于 2025-02-10 03:39:37 字数 3531 浏览 2 评论 0原文

我正在尝试将文档的标题设置为“/{ordernumber} orders”,对于该ordernumber值,以更新每次用户单击“按钮”和“过滤阵列”的不同数量的订单,则显示屏幕。

对于上下文,我正在导入一个JSON文件,对其进行过滤以显示我想要由用户输入决定的正确元素,然后我正在计算该数组的长度,该数组的长度需要存储在ordernumber变量中以更新文档标题。

我知道我正在登录控制台时访问阵列的正确值,我的问题是如何更新此状态,而无需抛出此错误的情况下,每个渲染都会更改此状态:(无用的ReferageError:无法访问'OrderStoDisplay'在初始化之前)

代码:

import { Col, Row } from "antd";
import { useContext, useEffect, useMemo, useState } from "react";
import Order from "../components/Order";
import { AppContext } from "../context/Context";
import AntButton from "../elements/Button";
import ordersToDisplay from "../orders.json";

const OrdersPage = () => {
    const [filteringStatus, setFilteringStatus] = useState("");
    const {orderAmount, setOrderAmount} = useContext(AppContext)
    const [test, setTest] = useState("")

    const setDiplayAcceptedOrders = () => {
        setFilteringStatus("accepted");
        setTest(ordersToDisplay.length)
    };
    
    const setDiplayCompletedOrders = () => {
        setFilteringStatus("complete");
        setTest(ordersToDisplay.length)
    };
    
    const setDiplayInProgressOrders = () => {
        setFilteringStatus("inProgress");
        setTest(ordersToDisplay.length)
    };


    const ordersToDisplay = useMemo(() => {
        if (filteringStatus) {
          return ordersToDisplay.filter((i) => i.orderStatus === filteringStatus);
        }
        return ordersToDisplay;
    }, [filteringStatus]);


    console.log("Orders to display: ", ordersToDisplay);
    console.log("test value: ", test)



    return(
        <div className="container">
            <Row justify="space-between" align="middle">
                <Col span={6}>
                    <h1>Orders</h1>
                </Col>
                <Col span={6}>
                    <AntButton onClick={setDiplayAcceptedOrders} name="Accepted"/>
                </Col>
                <Col span={6}>
                    <AntButton onClick={setDiplayInProgressOrders}  name="In Progress"/>
                </Col>
                <Col span={6}>
                    <AntButton onClick={setDiplayCompletedOrders} name="Complete"/>
                </Col>
            </Row>
            <Row>
                <Col span={12}>
                    <h3>{filteringStatus == "" ? "All Orders" : filteringStatus}</h3>
                    {ordersToDisplay.map((e) => {
                        return(
                            <Order
                            key={e.id}
                            productName={e.productName}
                            dateOrdered={e.dateOrdered}
                            orderStatus={e.orderStatus}
                        />
                        )
                    })}
                </Col>
            </Row>
        </div>
    )
}

export default OrdersPage;

App):

const App = () => {
    const [orderAmount, setOrderAmount] = useState("")

    const Routes = useRoutes([
        {path: "/", element: <HomePage/>},
        {path: `/(${orderAmount})orders`, element: <OrdersPage/>}
    ])
    
  return (
        <AppContext.Provider value={{
            orderAmount, setOrderAmount
        }}>
            <div>
                {Routes}
            </div>
        </AppContext.Provider>
  );
};

export default App;

I am trying to set the title of my document to "/{orderNumber}orders" and for that orderNumber value to update every time user clicks the button and different number of orders from filtered array are displayed on the screen.

For context, I am importing a json file, filtering it to display the correct elements I want decided by user input, and I am then calculating the length of that array, of which that integer needs to be stored in orderNumber variable to update document title.

I know I am accessing the correct value of the arrays as I have console logged it, my issue is how to update this state change every re render without this error throwing: (Uncaught ReferenceError: Cannot access 'ordersToDisplay' before initialization)

Code:

import { Col, Row } from "antd";
import { useContext, useEffect, useMemo, useState } from "react";
import Order from "../components/Order";
import { AppContext } from "../context/Context";
import AntButton from "../elements/Button";
import ordersToDisplay from "../orders.json";

const OrdersPage = () => {
    const [filteringStatus, setFilteringStatus] = useState("");
    const {orderAmount, setOrderAmount} = useContext(AppContext)
    const [test, setTest] = useState("")

    const setDiplayAcceptedOrders = () => {
        setFilteringStatus("accepted");
        setTest(ordersToDisplay.length)
    };
    
    const setDiplayCompletedOrders = () => {
        setFilteringStatus("complete");
        setTest(ordersToDisplay.length)
    };
    
    const setDiplayInProgressOrders = () => {
        setFilteringStatus("inProgress");
        setTest(ordersToDisplay.length)
    };


    const ordersToDisplay = useMemo(() => {
        if (filteringStatus) {
          return ordersToDisplay.filter((i) => i.orderStatus === filteringStatus);
        }
        return ordersToDisplay;
    }, [filteringStatus]);


    console.log("Orders to display: ", ordersToDisplay);
    console.log("test value: ", test)



    return(
        <div className="container">
            <Row justify="space-between" align="middle">
                <Col span={6}>
                    <h1>Orders</h1>
                </Col>
                <Col span={6}>
                    <AntButton onClick={setDiplayAcceptedOrders} name="Accepted"/>
                </Col>
                <Col span={6}>
                    <AntButton onClick={setDiplayInProgressOrders}  name="In Progress"/>
                </Col>
                <Col span={6}>
                    <AntButton onClick={setDiplayCompletedOrders} name="Complete"/>
                </Col>
            </Row>
            <Row>
                <Col span={12}>
                    <h3>{filteringStatus == "" ? "All Orders" : filteringStatus}</h3>
                    {ordersToDisplay.map((e) => {
                        return(
                            <Order
                            key={e.id}
                            productName={e.productName}
                            dateOrdered={e.dateOrdered}
                            orderStatus={e.orderStatus}
                        />
                        )
                    })}
                </Col>
            </Row>
        </div>
    )
}

export default OrdersPage;

app

const App = () => {
    const [orderAmount, setOrderAmount] = useState("")

    const Routes = useRoutes([
        {path: "/", element: <HomePage/>},
        {path: `/(${orderAmount})orders`, element: <OrdersPage/>}
    ])
    
  return (
        <AppContext.Provider value={{
            orderAmount, setOrderAmount
        }}>
            <div>
                {Routes}
            </div>
        </AppContext.Provider>
  );
};

export default App;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

谎言月老 2025-02-17 03:39:37

您正在用试图记忆的内容掩盖导入的OrderStoDisplay。重命名回忆版/变量。您只需要在状态中存储当前filteringstatus状态,test状态似乎是不必要的,并且从我所看到的不使用。

要在上下文中更新OrderAmount状态,请使用useffect挂钩,并依赖于计算/记忆的orders值值要更新OrderAmount值。

例子:

import { Col, Row } from "antd";
import { useContext, useEffect, useMemo, useState } from "react";
import Order from "../components/Order";
import { AppContext } from "../context/Context";
import AntButton from "../elements/Button";
import ordersToDisplay from "../orders.json";

const OrdersPage = () => {
  const [filteringStatus, setFilteringStatus] = useState("");
  const { orderAmount, setOrderAmount } = useContext(AppContext);

  const setDiplayAcceptedOrders = () => {
    setFilteringStatus("accepted");
  };
    
  const setDiplayCompletedOrders = () => {
    setFilteringStatus("complete");
  };
    
  const setDiplayInProgressOrders = () => {
    setFilteringStatus("inProgress");
  };

  // rename to something else, anything but ordersToDisplay
  const orders = useMemo(() => {
    if (filteringStatus) {
      return ordersToDisplay.filter((i) => i.orderStatus === filteringStatus);
    }
    return ordersToDisplay;
  }, [filteringStatus]);

  useEffect(() => {
    console.log("Orders to display: ", orders); // <-- output derived value

    // update amount when orders array updates
    setOrderAmount(orders.length);
  }, [orders, setOrderAmount]);

  return (
    <div className="container">
      <Row justify="space-between" align="middle">
        <Col span={6}>
          <h1>Orders</h1>
        </Col>
        <Col span={6}>
          <AntButton onClick={setDiplayAcceptedOrders} name="Accepted"/>
        </Col>
        <Col span={6}>
          <AntButton onClick={setDiplayInProgressOrders}  name="In Progress"/>
        </Col>
        <Col span={6}>
          <AntButton onClick={setDiplayCompletedOrders} name="Complete"/>
        </Col>
      </Row>
      <Row>
        <Col span={12}>
          <h3>{filteringStatus == "" ? "All Orders" : filteringStatus}</h3>
          {orders.map((e) => { // <-- use here
            return (
              <Order
                key={e.id}
                productName={e.productName}
                dateOrdered={e.dateOrdered}
                orderStatus={e.orderStatus}
              />
            )
          })}
        </Col>
      </Row>
    </div>
  );
};

export default OrdersPage;

You are masking the imported ordersToDisplay with what you are trying to memoize. Rename the memoized version/variable. You need only store in state the current filteringStatus state, the test state seems unnecessary and isn't used from what I see.

To update the orderAmount state in the context, use a useEffect hook with a dependency on the computed/memoized orders value to issue a side-effect to update the orderAmount value.

Example:

import { Col, Row } from "antd";
import { useContext, useEffect, useMemo, useState } from "react";
import Order from "../components/Order";
import { AppContext } from "../context/Context";
import AntButton from "../elements/Button";
import ordersToDisplay from "../orders.json";

const OrdersPage = () => {
  const [filteringStatus, setFilteringStatus] = useState("");
  const { orderAmount, setOrderAmount } = useContext(AppContext);

  const setDiplayAcceptedOrders = () => {
    setFilteringStatus("accepted");
  };
    
  const setDiplayCompletedOrders = () => {
    setFilteringStatus("complete");
  };
    
  const setDiplayInProgressOrders = () => {
    setFilteringStatus("inProgress");
  };

  // rename to something else, anything but ordersToDisplay
  const orders = useMemo(() => {
    if (filteringStatus) {
      return ordersToDisplay.filter((i) => i.orderStatus === filteringStatus);
    }
    return ordersToDisplay;
  }, [filteringStatus]);

  useEffect(() => {
    console.log("Orders to display: ", orders); // <-- output derived value

    // update amount when orders array updates
    setOrderAmount(orders.length);
  }, [orders, setOrderAmount]);

  return (
    <div className="container">
      <Row justify="space-between" align="middle">
        <Col span={6}>
          <h1>Orders</h1>
        </Col>
        <Col span={6}>
          <AntButton onClick={setDiplayAcceptedOrders} name="Accepted"/>
        </Col>
        <Col span={6}>
          <AntButton onClick={setDiplayInProgressOrders}  name="In Progress"/>
        </Col>
        <Col span={6}>
          <AntButton onClick={setDiplayCompletedOrders} name="Complete"/>
        </Col>
      </Row>
      <Row>
        <Col span={12}>
          <h3>{filteringStatus == "" ? "All Orders" : filteringStatus}</h3>
          {orders.map((e) => { // <-- use here
            return (
              <Order
                key={e.id}
                productName={e.productName}
                dateOrdered={e.dateOrdered}
                orderStatus={e.orderStatus}
              />
            )
          })}
        </Col>
      </Row>
    </div>
  );
};

export default OrdersPage;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文