this.props 在 React 组件中的箭头函数中显示为未定义

Posted

技术标签:

【中文标题】this.props 在 React 组件中的箭头函数中显示为未定义【英文标题】:this.props shows as undefined in an arrow function within React Component 【发布时间】:2018-04-19 08:43:08 【问题描述】:

我正在使用箭头函数在 React 组件中绑定 this。请参阅下面的handleChange() 函数。当我在箭头函数内部放置断点时,我发现很奇怪:this 被定义了,但是this.propsundefined。尽管如此,this.props.onChange() 还是被正确调用了!!!这种奇怪的行为有什么解释吗?

class MyComponent extends React.Component 
    render() 
        const  someProp  = this.props;

        // <TextField> is an input component from Material UI library
        return (
            <TextField
                onChange=this.handleChange
            />
        );
    

    handleChange = event => 
        const value = event.target.value;
        this.props.onChange(value);
    ;

附:另一方面,render() 方法行为正常 - 定义了 this.props

更新

这是 Babel 生成的转译代码:

_this.handleChange = function(event) 
    var value = event.target.value;
    _this.props.onChange(value);

【问题讨论】:

请说明如何调用handleChange @FuzzyTree,我更新了代码以显示如何调用 handleChange 你看过实际执行的代码(即转译的代码)吗?转译后的代码可能没有使用this 你用的是什么 babel 预设? @nem035,这是我的 Babel 预设:“babel-preset-es2015”:“^6.24.1”、“babel-preset-react”:“^6.24.1”、“babel- preset-react-app": "^3.0.3", "babel-preset-stage-1": "^6.24.1" 【参考方案1】:

你很有可能被 babel 欺骗了。

由于您使用的是 babel-preset

class A 
  method = () => 
    this.prop.a();
  ;

会look something like:

var A = function A() 
  var _this = this;

  this.method = function () 
    _this.prop.a();
  ;
;

查看上面的代码,method 中的_thisthis 似乎都指向类实例(因为this in a function called as a method of an object binds to that object)。

然而,在 JS 中,this 是 dynamic property,所以我们不能仅通过阅读代码以可预测的方式静态确定其值;我们必须运行它。

这意味着handleChange 中的this 不一定与您期望的this 相同。这取决于如何调用handleChange。但是,无论我们如何称呼handleChange_this 都不会受到影响(这也是 Babel 这样做的原因之一)

在您的特定代码中,您将handleChange 传递给TextFieldonChange 事件处理程序,这将默认将this 覆盖为undefined

React 事件处理程序将上下文覆盖到 undefined(calling the handler as a plain function):

ReactDOM.render(
  <input onChange=logThis placeholder="Start typing" />,
  document.querySelector('#example')
)

function logThis() 
  console.log(this);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="example"></div>

这意味着在handleChange 中,thisTextField 设置的任何约束,而_this 仍指向MyComponent 的实例。

因此一切仍然有效(因为_this 是正确的),但this 很可能是undefined

【讨论】:

感谢您的详细解释。非常感谢!现在一切都说得通了。 很高兴为您提供帮助 ?

以上是关于this.props 在 React 组件中的箭头函数中显示为未定义的主要内容,如果未能解决你的问题,请参考以下文章

React 的组件与 this.props对象

React中的this.props.children

2Reactjs中的属性(this.props)

react 组件中的 props

如何理解react中的super(),super(props)

使用 react-router 从 this.props.children 访问 React 组件