reactjs - 如果解构 PreventDefault - 在 React 中使用 babel - 这是未定义的

标签 reactjs babeljs

我刚刚遇到了最疯狂的错误。在我的 onKeyDown 中,我从 e 中解构了 preventDefault。但是,当我调用 preventDefault() 时,我会得到:

TypeError: this is undefined[Learn More]react-dom.js:13987:5

我正在使用 React v15.4.1,该行在下面的屏幕截图中突出显示:

如果我不解构并仅使用e.preventDefaut(),它就可以工作。有人知道为什么吗?这是 babel 中的错误吗?

const El = React.createClass({
  displayName: 'El',
  onKeyDown(e) {
    let { key, preventDefault } = e;
    preventDefault();
  },
  render() {
    return React.createElement('input', { onKeyDown:this.onKeyDown });
  }
});

最佳答案

preventDefault 方法的实现依赖于事件对象的其他属性,这些属性由 this 引用(即:this.defaultPrevented 属性)。当您从 e 解构它时,您将该函数与基本 e 对象分离,这意味着您失去了上下文 thispreventDefault 方法需要使用正确的e 对象上下文正确调用。您可以通过使用 event 上下文调用它来确认这一点,您可以使用 Function.prototype.call 来执行此操作:

onKeyDown(e) {
  let { key, preventDefault } = e;
  preventDefault.call(e);
},

我不会解构preventDefault

关于reactjs - 如果解构 PreventDefault - 在 React 中使用 babel - 这是未定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41059756/

相关文章:

javascript - Game Of life (React.js + Redux) 的性能问题

reactjs - 如何在 react 中渲染矩阵中的元素?

reactjs - 您的测试套件必须至少包含一项测试

webpack - 将 babel-polyfill 添加到 Webpack 4 配置文件中

javascript - ES2015 Babel 字符串插值不适用于撇号(但适用于双引号)

reactjs - immer.js 合并嵌套对象

javascript - 如何从 Instagram 获取网站的动态数据

babeljs - 尝试运行 babel : "cannot find module @babel/core"

reactjs - babel JS文件无法解析 "@babel/runtime/helpers/builtin/classCallCheck"

javascript - 使用 map 过滤但保留索引