Я только что обновил свое полнофункциональное приложение, поддерживающее реакцию, до Redux v4, но теперь получаю следующую ошибку:
Error: Error: Error: Error: You may not call store.getState() while the reducer is executing. The reducer has already received the state as an argument. Pass it down from the top reducer instead of reading it from the store.
Я подозреваю, что проблема в том, что у меня есть множество компонентов внутри других, каждый со своим собственным connect(mapStateToProps, mapDispatchToProps)(Component), и я полагаю, что это неправильный способ его реализации, хотя я не уверен, как это сделать.
Любое направление приветствуется!
Трассировки стека:
This error is located at:
in Connect(SideBarApp) (at SceneView.js:9)
in SceneView (at createTabNavigator.js:10)
in RCTView (at View.js:43)
in RCTView (at View.js:43)
in ResourceSavingScene (at createBottomTabNavigator.js:86)
in RCTView (at View.js:43)
in RCTView (at View.js:43)
in TabNavigationView (at createTabNavigator.js:127)
in NavigationView (at createNavigator.js:59)
in Navigator (at createNavigationContainer.js:376)
in NavigationContainer (at SceneView.js:9)
in SceneView (at SwitchView.js:12)
in SwitchView (at createNavigator.js:59)
in Navigator (at createNavigationContainer.js:376)
in NavigationContainer (at AppNavigator.js:36)
in App (created by Connect(App))
in Connect(App) (at index.ios.js:23)
in Provider (at index.ios.js:22)
in TheNewsApp (at renderApplication.js:32)
in RCTView (at View.js:43)
in RCTView (at View.js:43)
in AppContainer (at renderApplication.js:31)
This error is located at:
in NavigationContainer (at SceneView.js:9)
in SceneView (at SwitchView.js:12)
in SwitchView (at createNavigator.js:59)
in Navigator (at createNavigationContainer.js:376)
in NavigationContainer (at AppNavigator.js:36)
in App (created by Connect(App))
in Connect(App) (at index.ios.js:23)
in Provider (at index.ios.js:22)
in TheNewsApp (at renderApplication.js:32)
in RCTView (at View.js:43)
in RCTView (at View.js:43)
in AppContainer (at renderApplication.js:31)
This error is located at:
in NavigationContainer (at AppNavigator.js:36)
in App (created by Connect(App))
in Connect(App) (at index.ios.js:23)
in Provider (at index.ios.js:22)
in TheNewsApp (at renderApplication.js:32)
in RCTView (at View.js:43)
in RCTView (at View.js:43)
in AppContainer (at renderApplication.js:31)
getState@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:79579:24
runComponentSelector@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:78896:56
initSelector@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:79019:28
Connect(SideBarApp)@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:78969:29
constructClassInstance@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:20826:32
updateClassComponent@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:22393:35
performUnitOfWork@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:24922:27
workLoop@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:24955:47
renderRoot@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:24988:21
performWorkOnRoot@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:25549:23
performWork@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:25481:30
performSyncWork@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:25456:20
requestWork@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:25362:26
scheduleWork@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:25224:28
enqueueSetState@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:20681:23
setState@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:2380:37
dispatch@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:80901:27
navigate@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:80517:24
nav@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:80470:44
combination@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:79810:38
dispatch@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:79628:38
setLoginStatus@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:112247:19
http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:112199:44
tryCallOne@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:8818:16
http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:8919:27
_callTimer@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:8162:17
_callImmediatesPass@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:8198:19
callImmediates@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:8417:33
__callImmediates@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:7741:32
http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:7580:34
__guard@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:7721:15
flushedQueue@http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false:7579:21
flushedQueue@[native code]
invokeCallbackAndReturnFlushedQueue@[native code]
Не могли бы вы поделиться фрагментом кода, в котором вы на самом деле вызываете store.getState()?
Я не вызываю store.getState ()
Было бы полезно увидеть, что происходит в SceneView.js: 9 и createTabNavigator.js: 10.
и то, и другое не в моем коде. Я не уверен, из чего происходит SceneView, но createTabNavigator - из реакции навигации github.com/react-navigation/react-navigation



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В моем случае мне нужно удалить composeWithDevTools - плагин для хрома
import { createStore, combineReducers, applyMiddleware } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';
import thunk from 'redux-thunk';
// const enhancer = composeWithDevTools(applyMiddleware(thunk))
const enhancer = applyMiddleware(thunk)
const store = createStore(reducers, enhancer);
Спасибо. У меня это работает. Отключение расширения Redux для Chrome тоже работает. Это происходит только с сегодняшнего дня. Интересно, почему...
То же самое и здесь @JacobGoh, столкнувшись с той же проблемой, никогда не сталкивался с ней раньше. Интернет-магазин Chrome сообщает, что расширение было обновлено 27 ноября, возможно, они что-то сломали.
@JacobGoh github.com/zalmoxisus/redux-devtools-extension/issues/588
@ImanMahmoudinasab - я использую Chrome версии 55.x (хотя последняя версия - 70.x), но все еще столкнулся с той же проблемой. После удаления Redux DevTools (v 2.16.0) мое приложение работает нормально, как было предложено Вьет Ле.
У меня была такая же ошибка с сборкой PWA с полимером 3. Store.js также пытался использовать инструменты redux dev, которые мне пришлось деактивировать:
...
// Sets up a Chrome extension for time travel debugging.
// See https://github.com/zalmoxisus/redux-devtools-extension for more information.
//const devCompose = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const devCompose = compose;
// Initializes the Redux store with a lazyReducerEnhancer (so that you can
// lazily add reducers after the store has been created) and redux-thunk (so
// that you can dispatch async actions). See the "Redux and state management"
// section of the wiki for more details:
// https://github.com/Polymer/pwa-starter-kit/wiki/4.-Redux-and-state-management
export const store = createStore(
state => state,
devCompose(
lazyReducerEnhancer(combineReducers),
applyMiddleware(thunk))
);
...
Вот парочка обходной путь пока ждем исправления ...
Вернуться назад до рабочей версии v2.15.5 (Для Chrome)
chrome://extensions в URL-адрес и переключите developer mode на top right страницы.Load Unpacked. После нажатия кнопки выберите извлеченную папку.Или просто сейчас запрещать ваш расширение redux-devtool.
К вашему сведению: это не решает вопрос OP, но решает проблему, когда разработчики получают следующее сообщение об ошибке, начиная с 27.11.18.
Error: You may not call store.getState() while the reducer is executing. The reducer has already received the state as an argument. Pass it down from the top reducer instead of reading it from the store.
v2.16.2 было выпущенный
Для тех, кто ранее отключал расширение, просто снова включите его и обновите инструменты разработки redux с 2.16.0 до 2.16.2 Обновите инструменты Redux Dev
Хороший обходной путь для этой проблемы, которая буквально появилась несколько часов назад для всех, кто использовал сокращение-devtools-расширение, но на самом деле не решает вопрос OP, который был задан задолго до этого ошибочного выпуска v2.16.0 ... просто говорю
@bitstrider Конечно, это не касается вопроса ОП. Но похоже, что это помогает многим людям справиться с нынешней ситуацией. Для тех, кто интересуется статусом этой проблемы, вот проблема с github, который был опубликован для нее.
избавил меня от головной боли этим ранним утром
потратил почти час, чтобы найти эту проблему. Вернулся на v2.15.5. Теперь все работает нормально.
Выпущена версия 2.16.1 redux-devtools-extension, которая устраняет эту проблему.
Отличный крик. Эта ошибка возникла внезапно без видимой причины. Отключение инструментов redux dev исправляет это.
Подтверждая то, что упоминает Патрик, версия 2.16.1 устраняет эту проблему. Просто закройте и перезапустите Chrome - расширение должно автоматически обновиться. В мире Redux Dev Tools снова все хорошо :)
Я отключил расширение redux-devtool, но все равно ошибка. Что мне теперь делать?
В моем проекте. Эта проблема просто появляется из ниоткуда в один прекрасный день.
Мое решение: Отключите расширение Chrome - Redux Devtools. Потом все вернулось в норму.
Таким образом, с такой ошибкой вы должны протестировать в нескольких браузерах, чтобы найти проблему.
Вот что я сделал: просто прокомментировал строку для Chrome Redux Devtools Extension из моего файла store.js.
....
const store = createStore(
rootReducer,
initialState,
compose(
applyMiddleware(...middleware)
///This line--> window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
)
);
....
И вопрос только начался час назад. Как мы все знаем, расширение очень удобно во время разработки, так что давайте подождем реальных исправлений от властей.
Отключение расширения Chrome или удаление composeWithDevTool из вашего кода будет быстрым решением. Но все мы знаем, что нам нужно расширение, чтобы отслеживать состояние нашего приложения и правильно им управлять. Итак, я создал проблему сегодня, пожалуйста, поддержите, надеюсь, кто-то из команды redux свяжется с нами.
Или, если вы ищете временное решение (для Chrome), вы можете загрузить https://github.com/zalmoxisus/redux-devtools-extension/releases/download/2.15.5/extension.zip, а затем распаковать его в какую-нибудь папку.
Введите chrome: // extensions и включите режим разработчика в верхнем левом углу, затем нажмите «Загрузить распакованные» и выберите извлеченную папку для использования.
Проблема: https://github.com/reduxjs/redux-devtools/issues/413
Решение, которое работает для меня
Отключите расширение Chrome для Инструменты Redux Dev. или удалите регистратор из вашего кода.
Обновить: обновите инструменты разработки redux с 2.16.0 до 2.16.1 Обновите инструменты Redux Dev.
Должен быть исправлен сейчас. Обновите инструменты redux dev с 2.16.0 до 2.16.1
https://github.com/zalmoxisus/redux-devtools-extension/issues/588#issuecomment-442396540
У меня до сих пор бывает на 2.17.0
В моем случае проблема не была связана с расширением dev. Я столкнулся с этой ошибкой при работе с глубокими ссылками - обновлял запрос маршрута внутри reducer. Логика переноса, связанная с манипулированием URL-адресом внутри settimeout, исправила ошибку.
У меня была эта проблема с Chrome. Понижение моей версии redux с 4.0.2 до 3.7.2 исправило это для меня.
npm uninstall redux
npm install [email protected]
Убедитесь, что у вас нет кода, вызывающего побочные эффекты в ваших редукторах!
Редукторы Redux должны быть чистыми. Это означает, что у них не должно быть побочных эффектов. Побочные эффекты должны идти в саги или загадки. В моем случае редуктор выглядел так:
case REDIRECT_ON_EVENT: {
history.push('/some-route'); // side effect: redirection
return {
...state,
path: action.payload.path,
};
}
Часть history.push('/some-route'); испортила управление состоянием. Удаление его из редуктора и его размещение в саге, которая вызывается для того же типа действия, устранило проблему:
function redirectToSomeRoute() {
history.push('/some-route');
}
takeEvery(REDIRECT_ON_EVENT, redirectToSomeRoute),
Note: I am using Saga
В моем случае я добавил код навигации внутри редуктора.
sendOTPSuccess: (state, action) => {
state.wip = false;
RootNavigation.navigate('LoginOTPScreen');
},
Вначале он работал, но когда я использовал / получал доступ к состоянию внутри вызванного нового экрана
import { useDispatch, useSelector } from "react-redux";
import * as sessionActions from "../../models/session";
const LoginOTP: () => Node = (props) => {
const session = useSelector(sessionActions.selectSession);
const dispatch = useDispatch();
...
выскочила ошибка.
“Error: You may not call store.getState() while the reducer is executing.”
Редуктор должен быть чистой функцией. Он должен принимать полезные данные и изменять состояние и ничего больше. Что-то еще считается побочным эффектом.
В моем случае я загрузил новый компонент, который также потребляет данные state, и изменение состояния еще не завершено. Это вызывает проблему.
Я просто переместил навигацию на соответствующий saga
// worker Saga:
function* sendOTPSaga({ payload }) {
const { phoneNumber } = payload;
try {
const response = yield call(Api.sendOtp, { phoneNumber });
if (response.status == 200) {
yield put(sessionActions.sendOTPSuccess(response.data));
RootNavigation.navigate('LoginOTPScreen'); // <---- Here
...
Можете ли вы добавить трассировку стека? Это поможет нам дать более точный ответ.