组件在渲染时甚至没有使用 useEffect 和 useState

Component is rendering without even use of useEffect and useState

发生的事情是我没有使用 useEffect 和 useState 当我从购物车中删除项目时它仍然呈现更新的状态,这是因为 Redux 吗??

我是 React 的初学者,到目前为止我学到的是当发生任何变化时我们使用 useEffect 或 useState 来更新状态。但是在这里我很困惑。

const CartScreen = ({ history, match, location }) => {
  const qty = location.search ? Number(location.search.split('=')[1]) : 1
  console.log(qty)

  const cart = useSelector((state) => state.cart)

  const { cartItems } = cart
  console.log(cart)
  console.log("Render again")

  const dispatch = useDispatch()

这是我的 removeItem 处理程序

 const removeItemHandler = (id) => {
    dispatch(cartRemoveItem(id))
  }

  
  return (
    <div className="CartScreen">
      <div className="CartItem_Container">
        {cartItems.length === 0 ? (
          <p>No item</p>
        ) : (
          cartItems.map((product) => {
            return (
              <>
                <div className="Cart_Card">
                  <div>
                    <img src={product.image} width="70px" height="70px"></img>
                  </div>
                  <div className="Cart_Breif">
                    <p className="CartProduct_Name">
                      {product.name}{' '}
                      <span className="qty">
                        <select
                          value={product.qty}
                          onChange={(e) => {
                            dispatch(
                              cartAddItem(
                                product.product,
                                Number(e.target.value)
                              )
                            )
                          }}
                        >
                          {[...Array(product.countInStock).keys()].map((x) => (
                            <option key={x + 1} value={x + 1}>
                              {x + 1}
                            </option>
                          ))}
                        </select>
                      </span>
                    </p>
                    <p className="About_Product">{product.description} </p>

                    <p className="price">
                      ${product.price}{' '}
                      <span className="removeItem" onClick={()=> removeItemHandler(product.product)}>Remove</span>
                    </p>
                  </div>
                </div>
              </>
            )
          })
        )}
      </div>

      <div className="ProceedTo_Checkout"
        onClick={() => {
          history.push('/address')
        }}
      >
        <p>Proceed To CheckOut</p>
      </div>
    </div>
  )
}

export default CartScreen

您的组件因 useSelector 而重新呈现。您很可能正在通过调度 cartRemoveItem 来更新商店。 useSelector hook 将 redux store 中最新的选择器值与之前的选择器值进行比较,如果它们不同,则强制组件重新渲染。

只要状态或道具发生变化,组件就会重新呈现,如果您使用 useSelector 挂钩,然后在特定状态上,那么您的组件将跟踪该状态的任何变化,并在它发生变化时重新呈现