компонент не выполняет повторную визуализацию после изменения состояния в react.js

#reactjs #react-hooks #mern

Вопрос:

у меня есть приложение для электронной коммерции, я хочу, чтобы количество товара в торговых тележка** должна быть увеличена, как пользователь нажимает на значок плюса , но когда пользователь нажимает на изменения состояния элемента, но компонент не повторно отображает там не обновляется количество количество в корзину , но когда я обновить страницу номеру обновляется

основной код:

 const [item, setItems] = useState([]);

useEffect(() => {

    setItems(items);
  
  }, []);

const handlePlus = (number, index) => {
    let Nnumber = (number  = 1);

        let changeitems = item;
    
        changeitems[index].qty = Nnumber;
    
        setItems(changeitems);
    
        localStorage.setItem("items", JSON.stringify(changeitems));
      };
 

JSX:

 <span  onClick={(e) => {
                            handlePlus(eachItem.qty, index);
                          }}
                        >
                          <i className="bi bi-plus-circle-fill text-success"></i>{" "}
                        </span>
 

Полный код

 import { Fragment, useState, useEffect } from "react";

const Cartitemscreater = ({ items ,cartUpdater}) => {


  


  const [total, setTotal] = useState(0);

  const [item, setItems] = useState([]);
  const [available,setAvailable] = useState(true)

  useEffect(() => {

    setItems(items);
  let totalPr = 0;
    for (let index = 0; index < items.length; index  ) {
      let price = parseInt(items[index].productprice);

      totalPr  = price * items[index].qty;
    }
    setTotal(totalPr);
  }, []);





  let changeItems = []

  const handlePlus = (number, index) => {
    let Nnumber = (number  = 1);

    changeItems = item;

    changeItems[index].qty = Nnumber;

    setItems(changeItems);

    localStorage.setItem("items", JSON.stringify(changeItems));




  };





  const handleMinus = (number, index) => {
    let Nnumber = (number -= 1);

    let changeitems = item;

    changeitems[index].qty = Nnumber;

    setItems(changeitems);

    localStorage.setItem("items", JSON.stringify(changeitems));


  };
const  handleDelete  = (_id,index)=>{

let deleteState = []

for (let index = 0; index < item.length; index  ) {
if(item[index]._id!==_id){

  deleteState.push(item[index])
}
  
}

setItems(deleteState)
cartUpdater(deleteState.length)
if(deleteState.length===0){

  setAvailable(false)

return localStorage.removeItem("items")
}

  localStorage.setItem("items",JSON.stringify(deleteState))



}
 return (
    <Fragment>
      { available ?<div className="container my-5">
     
 <div className="table-responsive-xl">

          
            <table class="table  mt-5 ">
              <thead>
                <tr>
                 
                  <th scope="col">Product image</th>
                  <th scope="col">Product title</th>

                  <th scope="col">Product price</th>
                  <th scope="col">Product quantity </th>
                </tr>
              </thead>
              { item.map((eachItem, index) => {
                return (
                  <tbody key={eachItem._id} className="shadow">
                    <tr>
                      
                      <td>
                        <img
                          src={`/products/${eachItem._id}/${eachItem.prImage}`}
                          className="img-fluid imgs "
                          alt="somethings"
                          style={{
                            width: "130px",
                            height: "80px",
                            objectFit:"cover"
                          }}
                        />

<p><small className="text-muted">{eachItem.productdescription}</small></p>

<span onClick={()=>{

handleDelete(eachItem._id,index)


}}><i class="bi bi-trash fs-4 text-danger"></i></span>


                      </td>
                      <td>{eachItem.producttitle}</td>

                      <td className="fw-bold">$ {eachItem.productprice}</td>

                      <td>
                        <span
                          onClick={(e) => {
                            handleMinus(eachItem.qty, index);
                          }}
                        >
                          {" "}
                          <i className="bi bi-dash-circle-fill text-danger"></i>
                        </span>

                        <span className="mx-2"> {eachItem.qty}</span>

                        <span
                          onClick={(e) => {
                            handlePlus(eachItem.qty, index);
                          }}
                        >
                          <i className="bi bi-plus-circle-fill text-success"></i>{" "}
                        </span>
                      </td>
                    </tr>
                  </tbody>
                );
              })}
            </table>
            </div>
        
        
      </div>:          <p className="mt-lg-5 fw-bold text-danger fs-4"> {"Cart is empty "}<i class="bi bi-cart-fill"></i> </p> }
    </Fragment>
  );
};

export default Cartitemscreater;
 

Ответ №1:

Номер не обновляется, потому что состояние использования асинхронно. React не обновляет мгновенно, вместо этого он просто помещает обновление состояния в очередь, чтобы избежать ненужной повторной визуализации. Если вам действительно нужно обновление, вы можете воспользоваться этой функцией обновления.

Пример:

 const useForceUpdate = () => {
    const [value, setValue] = useState(0);
    return () => setValue((value) => value   1);
  };
 

Просто вызовите его в том же событии щелчка.

Комментарии:

1. спасибо ,но я написал еще один код для удаления товаров в корзине, и он отлично работает, когда я нажимаю на значок удаления/корзины, состояние меняется, таким образом, повторно отображается компонент и отображаются только те товары, которые остались . так почему же эта функция удаления работает ,но вышеизложенное, пожалуйста, не проверяйте код, который я предоставил для функции удаления, еще раз спасибо .

2. Вы пробовали код? Можешь показать мне, что ты сделал?

3. я не мог по-настоящему понять ваш код , я могу предоставить весь код, проверить его, и если вы сможете внести некоторые изменения, спасибо