当我试图在Reaction应用程序中更新状态时,我的结果是不确定.我基本上是在try 从List组件中删除一项,并try 通过获取先前的状态来更新状态.但当我试图删除该项目时,我的定义变得不明确.

现在,我有这个代码:


const Checkout = () => {
  const [products, setProducts] = useState([]);
  const [loading, setLoading] = useState(true);
  const [finalPrice, setFinalPrice] = useState(0);

  const { basketItems, setBasketItems } = useContext(ProductTypeContext);

  useEffect(() => {
    basketItems &&
      basketItems.forEach((id) => {
        axios
          .get(`http://localhost:6969/api/products/${id}`)
          .then((data) => {
            setProducts((prevState) => [...prevState, data.data.product]);
            setFinalPrice((prevState) => Number(prevState) + Number(data.data.product.price));
            setTimeout(() => {
              setLoading(false);
            }, 300);
          })
          .catch((err) => console.log(err));
      });
  }, []);

  if (loading) {
    return <div>Loading...</div>;
  }

  return (
    <>
      <div className="checkout-container">
        {products.map((product, index) => (
          <div key={index} className="checkout-products">
            <img src={product.img} width="100px" />
            <div>{product.name}</div>
            <div>{product.price}</div>
            <div>{product.taste}</div>
            <span
              onClick={() => {
                setBasketItems((prevState) => {
                  [...prevState, prevState.splice(index, 1)];
                });
              }}
            >
              X
            </span>
          </div>
        ))}
      </div>
      <div>Final Price: {finalPrice}</div>
    </>
  );
};

export default Checkout;

我想当我点击X按钮时,有些地方出了问题,那就是更新状态.有什么建议吗?

推荐答案

Splice方法返回移除的元素,而不是修改后的array.

更新此部件:

<span
onClick={() => {
    setBasketItems((prevState) => {
    const newState = [...prevState];
    newState.splice(index, 1);
    return newState;
    });
}}
>
X
</span>

在您的代码中,最终价格只在获取数据时更新.您可以创建一个函数来根据current products数组计算最终价格,并在移除商品时调用它.

更新最终价格功能:

const calculateFinalPrice = (products) => {
  return products.reduce((total, product) => total + Number(product.price), 0);
};

在我们更新的代码上使用此函数:

<span
onClick={() => {
    setBasketItems((prevState) => {
    const newState = [...prevState];
    newState.splice(index, 1);
    return newState;
    });
    setFinalPrice((prevState) => calculateFinalPrice(prevState.splice(index, 1)));
}}
>
X
</span>

Reactjs相关问答推荐

使用setInterval判断数据的时间,然后在过期后从对象中删除;遇到性能问题

为什么这个'Suspense'子组件在挂起promise解决后会丢失它的状态,而不是呈现?<>

react 表复选框不对任何操作做出react

在Reaction+Redux+RTKQuery中对API调用进行排序

ReactJs;Reaction-Hook-Form:仅当 Select 了特定 Select 列表选项时才显示文本输入

为多租户SSO登录配置Azure AD应用程序

更改滑块标记的文本 colored颜色 ./Reaction/MUI 5

在每页上应用字体-NextJS

Github 操作失败:发布 NPM 包

无法使用 Suspense 和 Await 获取数据

.populate() 方法在 mongodb 中不起作用

React Wordpress Apache 在索引之外重新加载 -> 未找到页面

Redux 工具包不更新状态

在 React 中,为什么在使用 addEventListener 时外部元素上的 onclick 事件监听器在内部元素的 onclick 事件监听器之前执行?

React v6 中的公共和私有路由

react-router v6 中的 BrowserRouter 和 createBrowserRouter 有什么区别?我可以在不使用数据 API 的情况下使用 createBrowserRouter 吗?

如何检索包含动态段的未解析路径?

Cypress - 替换 React 项目中的变量

如何解决在 react.js 中找不到模块错误

如何跨微前端 React 应用管理状态管理?