在下面提供的代码中,我可以看到this.mBaseService
是在第一个debugger
上方定义的,而不是在第二个debugger
下定义的。
有人能解释为什么会这样吗?我有一个理论是React或Next.js可能在内部清除属性。
import Link from 'next/link';
import React, { Component, Fragment } from 'react';
import ReactDropzone from 'react-dropzone';
import { Container, Row, Col, Button, Jumbotron, ListGroup, ListGroupItem } from 'reactstrap';
import DefaultHomeView from '../components/default-home-view';
import Page from '../components/page';
import EteeReport from '../components/etee-report';
import Layout from '../components/layout';
import { ServiceBaseService } from '../services/service-base/service-base.service';
export default class extends Page {
mBaseService = new ServiceBaseService();
constructor(props) {
super(props);
this.state = {
files: [],
};
console.log('it exists!', this.mBaseService);
debugger;
//this.mBaseService = new ServiceBaseService();
}
fHandleOnDrop = async files => {
debugger;
const oResponse = await this.mBaseService.fpPost('/reports', {
oDataToPost: JSON.stringify(files),
});
// TODO: if valid csv then parse and chart the data
this.setState({
files: this.state.files.concat(files),
});
};
fClearFiles = () => {
this.setState({
files: [],
});
};
render() {
return (
<Layout {...this.props} navmenu={false} container={false}>
{!this.state.files.length && (
<DefaultHomeView {...this.props} fHandleOnDrop={this.fHandleOnDrop} files={this.state.files} />
)}
{this.state.files.length && <EteeReport {...this.props} {...this.state} fClearFiles={this.fClearFiles} />}
</Layout>
);
}
}
答案 0 :(得分:1)
此问题可能特定于如何使用Babel编译代码。如this related answer中所述,类字段(箭头方法)被转换为构造函数代码,而this
被_this
,_this2
等替换。 this
在箭头中的行为。
属性可能无法在调试器中的this
上使用,而不能在临时_this?
变量上使用,该变量在原始代码中被视为适当的上下文。
在这种特定情况下,这是由于fHandleOnDrop
作为回调传递的事实引起的:
<DefaultHomeView {...this.props} fHandleOnDrop={this.fHandleOnDrop} files={this.state.files} />
这意味着this.props.fHandleOnDrop()
已被取消引用并以错误的this
调用,而该函数内部使用_this?
变量来引用适当的上下文:
fHandleOnDrop = async files => {
console.log(this.mBaseService) // should be ok
eval('console.log(this.mBaseService)') // should fail
如果Babel配置为不通过不使用es2015
预设将箭头向ES5目标弹射的话,情况可能并非如此。
不管这些担忧如何,总是有这种行为特定于特定开发工具的可能性。