[英]React Hot Loader: this component is not accepted by Hot Loader
我正在使用https://github.com/stylesuxx/generator-react-webpack-redux作為生成器,並且正在使用熱加載器。 我的代碼能夠正常加載到瀏覽器中,但是當我在瀏覽器中打開開發面板時,遇到
React Hot Loader: this component is not accepted by Hot Loader.
Please check is it extracted as a top level class, a function or a variable.
Click below to reveal the source location:
ƒ (props, context, updater) {
// This constructor gets overridden by mocks. The argument is used
// by mocks to assert on what gets mounted.
if (process.env.NODE_ENV !== 'production'…
在我的client.js
,代碼如下所示:
import React from 'react';
import ReactDOM from 'react-dom';
import { AppContainer } from 'react-hot-loader';
import { Provider } from 'react-redux';
import { Router, IndexRoute, Route, browserHistory, hashHistory } from 'react-router';
import App from './containers/App';
import configureStore from './stores';
import Contact from './containers/contact/Contact'
import Homepage from './containers/homepage/Homepage'
import About from './containers/about/About'
import Theme from './containers/themes/Themes'
import Login from './containers/login/Login'
import Signup from './containers/signup/Signup'
const store = configureStore();
const routes = {
path: '/',
indexRoute: {onEnter: (nextState, replace) => replace('/home')},
childRoutes: [
require('./containers/homepage').default,
require('./containers/themes').default,
require('./containers/contact').default,
require('./containers/about').default,
require('./containers/login').default,
require('./containers/signup').default,
{
path: '*',
indexRoute: { onEnter: (nextState, replace) => replace('/error/404') }
}
]
}
ReactDOM.render((
<Provider store={store}>
<Router onUpdate = {() => window.scrollTo(0, 0)}
history={hashHistory}
routes={routes}
/>
</Provider>
), document.getElementById('app'));
// if (module.hot) {
// module.hot.accept('./containers/App', () => {
// const NextApp = require('./containers/App').default; // eslint-
disable-line global-require
//
// ReactDOM.render(
// <AppContainer>
// <Provider store={store}>
// <NextApp />
// </Provider>
// </AppContainer>,
// document.getElementById('app')
// );
// });
// }
我應該如何修改注釋的代碼以使Hot Loader接受該組件,我嘗試使用下面的代碼,但它不起作用。
if (module.hot) {
module.hot.accept('./containers/App', () => {
const NextApp = require('./containers/App').default; // eslint-disable-line global-require
ReactDOM.render(
<AppContainer>
<Provider store={store}>
<Router onUpdate = {() => window.scrollTo(0, 0)}
history={hashHistory}
routes={routes}
/>
</Provider>
</AppContainer>,
document.getElementById('app')
);
});
}
我看到很多代碼重復。 代替所有的ReactDOM.render((
嘗試創建為您呈現DOM的函數。
看看我的示例倉庫
首先,我創建render
函數:
const render = () => { ReactDOM.render(
(
<Provider store={store}>
<BrowserRouter>
{renderRoutes(routes)}
</BrowserRouter>
</Provider>
),
document.getElementById('root'), ) }
然后,我渲染該應用程序:
render()
然后,我處理熱重載:
if (module.hot) {
module.hot.accept()
}
也可以這樣處理:
if (module.hot) {
module.hot.accept('./app', () => {
const UpdatedApp = require('./app').default // require('./app').default = renderRoutes(routes)
render(UpdatedApp)
})
}
但是我的觀點是,您不想復制呈現DOM代碼。 當您提取代碼並創建用於呈現客戶端代碼的專用功能時。 您將看到更清晰的解決方案。
它還將幫助您處理服務器端渲染,因為您將能夠使用相同的功能在服務器上渲染代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.