Я испытал функцию useEffect из ловушки React. Когда я использую его с useSelector из React-redux, это работало так странно.
Мой редуктор:
const initialState = { a: 0 };
function mainReducer(state = initialState, action) {
const { type, payload } = action;
switch (type) {
case 'A': return { ...state, a: payload }
default:
return state;
}
}
Мой компонент:
function MyComponent(props) {
const { a } = useSelector(state => state.mainReducer);
const dispatch = useDispatch();
useEffect(() => {
console.log('did mount: ', a);
dispatch({ type: 'A', payload: 1 })
}, []);
useEffect(() => {
console.log('use effect: ', a);
dispatch({ type: 'A', payload: a });
}, [a])
return (<View style={styles.container}>
<Text style={styles.text}>{a}</Text>
</View>);
};
Результат
Журнал:
did mount ran: 0
useEffect ran: 0
Последний result является переменной 'a' = 0
????
Как я понимаю, после первого рендеринга оба эффекта выполнялись последовательно в своем порядке в коде.
(Шаг 1 ) Так что первый эффект запуска fist -> log 'сделал mount run: 0'. Затем он отправляет значение 1 для хранения
(Шаг 2). Второй эффект запускается после -> log 'did mount run: 0'. Затем он отправляет значение 0 для хранения
Но я не понимаю, что второй эффект должен отслеживать изменение из переменной 'a', поэтому будет:
В следующее время рендеринга:
(Шаг 3) второй useEffect следует запускать, когда значение 'a' изменяется с 0 на 1 (с шага 1).
А затем:
(Шаг 4) должно быть третье повторное рендеринг, когда значение снова меняется с 1 на 0 (с шага 2)
Таким образом, журнал должен быть:
did mount ran: 0
useEffect ran: 0
useEffect ran: 1
useEffect ran: 0
Не могли бы вы объяснить мне, что я скучаю? Спасибо