javascript - 在React项目中, "this"转换为 "undefined"

标签 javascript gruntjs reactjs webpack babeljs

非常简单的代码

var App = React.createClass({
    handleForm: (e) => {
        e.preventDefault();
    },
    render: () => {
        return (
            <form>
                <button type="submit" onClick={this.handleForm}>Go</button>
            </form>
        );
    }
});

转换为

// ...
_react2['default'].createElement(
    'button',
    { type: 'submit', onClick: undefined.handleFormSubmit },
    'Go'
)

但是为什么呢?我是否需要显式绑定(bind)所有内容(包括 this.setState ,由于同样的原因我无法工作)?

我正在使用 React 0.13.3 和 webpack 1.12.2 和 babel-loader 5.3.2。以前没有遇到过这样的问题。

最佳答案

当您使用箭头函数作为对象字面量中的属性值时,与任何箭头函数一样,与 this 的绑定(bind)是函数声明范围的绑定(bind)。在 ES6 模块代码中,最外层上下文中的 this 值被定义为 undefined,因此 Babel 只是内联该值。你想做的是这样的:

var App = React.createClass({
  handleForm(e) {
    e.preventDefault();
  },
  render() {
    return (
        <form>
            <button type="submit" onClick={this.handleForm}>Go</button>
        </form>
    );
  }
});

最后一点,使用 React.createClass 时,您不需要绑定(bind)任何成员函数,因为 React 会自动为您执行此操作,并且比使用 Function 更有效。原型(prototype).bind.

感谢@loganfsmyth 更新了this 为何未定义

关于javascript - 在React项目中, "this"转换为 "undefined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32937746/

相关文章:

javascript - 与同一列表中的对象连接

angularjs - Grunt 构建在 'Dist' 中遗漏了一个新目录

reactjs - 使用 Zusand/React 获取多个状态(简写语法)

javascript - 为什么我不能在一个对象内的数组中展开,而该对象具有被过滤的同一级别的另一个对象

javascript - 使用 Firefox 防止 SCEditor (MyBB) 中的拖放

javascript - 自定义YouTube播放器尺寸+自定义可叠加的海报图片?

c# - 如何将任意数量的图像动态添加到源字符串位于数据库中的 Web 表单?

javascript - 使用 grunt build 生成的 dist 文件夹不起作用

client-side - 如何使用grunt.js验证HTML/CSS文件?

javascript - 为什么 reduxReducer 中的状态变量不加 1