gpt4 book ai didi

javascript - react 热加载器 : this component is not accepted by Hot Loader

转载 作者:行者123 更新时间:2023-11-28 04:03:56 26 4
gpt4 key购买 nike

我正在使用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')
// );
// });
// }

我应该如何修改注释代码以使热加载器接受该组件,我尝试使用下面的代码,但它不起作用。

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')
);
});
}

最佳答案

我看到很多代码重复。尝试创建为您渲染 DOM 的函数,而不是所有的 ReactDOM.render(()。

看看我的例子 repo

首先我创建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 代码。当您提取代码并创建用于呈现客户端代码的专用函数时。您会更清楚地看到解决方案。

它还将帮助您处理服务器端渲染,因为您将能够使用相同的函数在服务器上渲染代码。

关于javascript - react 热加载器 : this component is not accepted by Hot Loader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46861859/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com