【发布时间】:2018-07-29 04:30:22
【问题描述】:
只要我将"react-hot-loader/babel" 添加到我的.babelrc,它就会破坏我的 React 组件。
具体来说,我有一些看起来像这样的代码:
export default class Editor extends React.Component {
componentDidMount() {
console.log('this.canvas',this.canvas);
// ...
}
setRef = node => {
console.log('setRef');
this.canvas = node;
}
render() {
// tabIndex is needed to receive keyboard events -- https://stackoverflow.com/a/12887221/65387
return <canvas className={this.props.className} ref={this.setRef} tabIndex={0} />;
}
}
当我运行它时,我在我的 Chrome 开发工具中看到了这个:
设置参考
this.canvas 未定义
这很奇怪,因为我们可以看到它在设置 this.canvas 之前 调用 componentDidMount 所以我不知道 react-hot-loader/babel 正在做什么来破坏它。
没有react-hot-loader/babel,一切正常,包括热重载。
所以,我的问题是:
- “react-hot-loader/babel”实际上是做什么的?
- 如何让它不破坏我的类属性?
这适用于 React 16.1、react-hot-loader 3、webpack 3.11、babel 6.x
我的.babelrc,如果你想看到的话:
{
"plugins": [
"transform-object-rest-spread",
"syntax-jsx",
"transform-react-jsx",
"transform-react-display-name",
"transform-class-properties",
"transform-function-bind",
"transform-decorators-legacy"
],
"compact": false,
"env": {
"development": {
"plugins": [
"transform-react-jsx-self",
"transform-react-jsx-source",
[
"styled-components",
{
"displayName": true,
"minify": false
}
]
// https://stackoverflow.com/q/48857689/65387
//"react-hot-loader/babel"
],
"presets": [
[
"env",
{
"targets": {
"browsers": "last 2 chrome versions"
},
"modules": false
}
]
],
},
"webpack": {
"presets": [
[
"env",
{
"targets": {
"node": "current"
},
"modules": "commonjs"
}
]
]
}
}
}
【问题讨论】:
-
这个绑定问题?
-
我在全新安装的 create-react-app 中检查了您的代码,它适用于 ES7 提案,所以我猜测您的 webpack 配置在添加
react-hot-loader时缺少任何指令。 -
@Dez 谢谢 Dez。我可能缺少什么指令?这是我的 webpack 文件:gist.github.com/mnpenner/df723cb33682c137290caefaf890444e
-
@mpen,你能创建一个有问题的最小项目吗?将有助于更快地解决您的问题
-
@TarunLalwani 在这里:transfer.sh/9i0du/stack48857689.zip 运行
yarn然后yarn dev启动它(或者npm i和npm run dev,如果你愿意的话)
标签: reactjs webpack react-hot-loader