#react-native #redux #reducers
#react-native #redux #редукторы
Вопрос:
При использовании react-devtools это говорит мне, что причина, по которой мой корневой компонент повторно визуализировался, заключалась в том, что хуки изменились?
когда я удаляю все useSelectors, мой корневой компонент отображается только один раз, при включении он отображается 6 раз.
каковы некоторые предположения относительно того, почему это происходит?
import {
/// Data State Constants...
SET_USER_DATA,
SET_BADGE_COUNT,
} from "../Actions/gameState";
const initialState = {
/// Data state...
userData: [],
badgeCount: 0,
};
export default function gameState(state = initialState, action) {
const { type, payload } = action || {};
switch (type) {
/////////////////////////
/// Data state Reducers...
/////////////////////////
case SET_USER_DATA: {
return { ...state, userData: payload };
}
case SET_BADGE_COUNT: {
return { ...state, badgeCount: payload };
}
default:
return state;
}
}
Комментарии:
1. Мы никак не можем сказать, что происходит, не видя кода, мое предложение — попытаться воспроизвести проблему на
snacks.expo.io
2. Возможно, вы изменяете / переназначаете свойство, которое вы выбираете с помощью useSelectors, после каждого рендеринга, и это изменение вызывает повторный рендеринг компонента. К сожалению, я не могу вам правильно помочь, не видя никаких фрагментов кода.
3. Я использую logger, поэтому я бы видел эти изменения по мере их появления, но никакие свойства не меняются.
4. перечислите свой компонент и редукторы, чтобы мы могли взглянуть на код. трудно догадаться, что могло бы это сделать, не видя хотя бы редуктора.
5. что касается компонента. ничего особенного не происходит. Я получаю состояние из redux следующим образом { someState } = useSelector(state=>state.MyState). и для редуктора это выглядит так: (я только что опубликовал его в OP)
Ответ №1:
Хорошо, дело в том, что useSelector сравнивает новое значение со старым со строгим ===
. Вы можете либо вызвать один useSelector для каждого поля, либо реализовать shallowEqual
from react-redux
:
const someState = useSelector(state=>state.myState.someState, shallowEqual)
Вот документация:
https://react-redux.js.org/next/api/hooks#equality-comparisons-and-updates