#reactjs #typescript #webpack #redux #electron
#reactjs #typescript #webpack #redux #electron
Вопрос:
У меня есть настольное приложение Electron, содержащее приложение React Redux. Redux отлично работает при локальном запуске приложения в процессе разработки, но не обновляет компоненты после того, как приложение было встроено в собственное настольное приложение.
Многие статьи и проблемы, похоже, считают, что хранилище настроено неправильно, или что я напрямую изменяю состояние, а не обновляю его, или что моя mapStateToProps
функция настроена неправильно.
Я не вижу, как что-либо из этого может быть проблемой, поскольку мое приложение работает во время разработки, и я вижу, что хранилище обновляется, а компонент повторно отображается.
Однако в процессе производства происходит следующее:
- Состояние хранилища инициализировано
- Отправляется действие
- Состояние обновляется (я вижу в инструментах разработки)
- Ни один из моих подключенных компонентов не перерисовывается с обновленными реквизитами.
Единственное различие, которое я вижу между разработкой и производством, заключается в том, что в Electron во время разработки приложение загружается через http://localhost
, а во время производства оно загружается через file:///
Мой магазин настроен как:
export const store = createStore(rootReducer, composeWithDevTools(applyMiddleware(thunk)));
Хранилище предоставляется как:
<Provider store={store}>
<App />
</Provider>
Я подключаю свой компонент к хранилищу как:
const mapStateToProps = (state: RootState) => {
return {
hasLoaded: state.products.hasLoaded,
products: state.products.products
};
};
const mapDispatchToProps = {
getProducts: getProducts
};
export default connect(
mapStateToProps,
mapDispatchToProps
)(ProductsList);
Затем вызываем GetProducts изнутри компонента, например:
componentDidMount() {
this.props.getProducts();
}
Я ожидаю, что состояние будет обновлено с помощью извлеченных продуктов, а затем компонент должен повторно отображать обновленное состояние хранилища в качестве реквизита.
Вместо этого состояние хранилища обновляется — как я вижу это в Redux DevTools — но подключенный компонент никогда не перерисовывается и не componentDidUpdate
вызывается.
Ответ №1:
Я провел много дней с тем же чувством и проблемой, что и вы. Обнаружив, что в производстве функция подписки из redux все еще работала, но react-redux не удалось подключиться должным образом, я попробовал понизить рейтинг, и это сработало.
Комментарии:
1. Я предположил, что это ошибка, и это понижение исправило аналогичную проблему. Я не думаю, что это «не дает ответа».
2. Затем вы должны соответствующим образом отредактировать свой ответ, удалив вопросы.
3. @lacavazan, до какой версии react-redux вы понизили рейтинг?
Ответ №2:
Можете ли вы попробовать просто удалить composeWithDevTools
?
export const store = createStore(rootReducer, applyMiddleware(thunk));
В приведенном ниже примере используется хранилище приложений React. Он также не работает с Redux devtools.
const store = createStore(
rootReducer,
initialState,
compose(
applyMiddleware(...middleware),
window.__REDUX_DEVTOOLS_EXTENSION__ amp;amp; window.__REDUX_DEVTOOLS_EXTENSION__()
)
);
Я удалил эту часть перед производственной сборкой, потому что для этого требовался плагин для разработчиков браузера; Я надеюсь, что React Native будет таким же.
window.__REDUX_DEVTOOLS_EXTENSION__ amp;amp; window.__REDUX_DEVTOOLS_EXTENSION__()
Комментарии:
1. Раньше я удалял расширение redux devtools и просто использовал redux
compose
, но, к сожалению, это не имело никакого эффекта.
Ответ №3:
Добавление следующего в electron-webpack.config.json решило проблему, react-redux должен быть внесен в белый список.
{
"whiteListedModules": ["react-redux"]
}