useSelector в дочернем компоненте повторно отображает родительский компонент - PullRequest
0 голосов
/ 13 июля 2020

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

  • useMemo
  • createSelector
  • React.memo (Header)

Есть предложения?

enter image description here

HEADER COMPONENT

const Header = ({ currentUser }) => {
    const { hidden } = useSelector(state => state.cart);

    return (
         ... ...  ); }; экспорт заголовка по умолчанию; 

КОМПОНЕНТ ЗНАЧКА КОРЗИНЫ

const CartIcon = () => {
    const selectCartItems = createSelector(
        state => state.cart,
        cart => cart.cartItems
    );
    const cartItems = useSelector(selectCartItems);
    const dispatch = useDispatch();

    const totalItemsCount = (cartItems) => {
        return cartItems.reduce((acc, crr) =>
            acc + crr.quantity
            , 0)
    };
    const totalItems = useMemo(() => totalItemsCount(cartItems), [cartItems])

    return (
        <div className="cart-icon" onClick={(() => dispatch(actionCreators.onToggleCart()))}>
            <ShoppingIcon className="shopping-icon" />
            <span className="item-count">{totalItems}</span>
        </div>
    );
};

export default CartIcon;

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Вероятно, потому что ваше значение state.cart обновляется с учетом товаров в корзине. useSelector принудительно выполняет повторную визуализацию всякий раз, когда возвращаемая ссылка изменяется, поэтому Header повторно визуализируется всякий раз, когда любые данные корзины.

Вы должны изменить его, чтобы выбрать только данные, необходимые компоненту Header:

const hidden = useSelector(state => state.cart.hidden);
0 голосов
/ 13 июля 2020

В Header, если hidden изменит значение, компонент будет повторно визуализирован.

Обновляется ли dispatch(actionCreators.onToggleCart()) state.cart?

Вы должны отказаться от подписки на hidden в заголовке, чтобы проверить, вызывает ли это повторный рендеринг.

...