javascript - 为什么装饰器会抛出无效类型的错误

标签 javascript reactjs babeljs

最小示例:

import React from 'react';
import ReactDOM from 'react-dom';


const decorator = context => WrappedComponent => <WrappedComponent context={context}/>;

@decorator(1)
class Parent extends React.Component {
    render(){
        return 1;
    }
}

ReactDOM.render(<Parent />, document.getElementById('app-root'));

错误:

react.development.js:225 Warning: React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: . Did you accidentally export a JSX literal instead of a component?

react-dom.development.js:55 Uncaught Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object.

当我从组件顶部删除装饰器时,一切都运行良好。

<小时/>

巴贝尔配置:

"plugins": [
    [
      "@babel/plugin-proposal-decorators",
      {
        "legacy": true
      }
    ]
  ] 

我的装饰器有什么问题?

最佳答案

返回的 JSX 代码不是有效的表达式,您应该尝试包装在这样的类中。

const decorator = (providedContext) => (WrappedComponent) => {
   return class extends React.Component {

      componentDidMount() {

      }
      render() {
         return <WrappedComponent context={providedContext}/>
      }
   }
}

关于javascript - 为什么装饰器会抛出无效类型的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54184974/

相关文章:

webpack - 意外 token 'const' 运行 webpack、babel 和 karma 时

javascript - 按钮不工作的事件监听器 - vanilla JavaScript

php - 针对不同页面上的 iFrame 的表单

javascript - 从类名中获取 div 的 id

javascript - React Native 如何并排制作两个 View 的动画

javascript - react 组件中的绑定(bind)函数

javascript - 获取来自rabbitMQ的所有消息

node.js - 为什么会有这种不同的行为?

javascript - 是否可以针对特定浏览器目标运行 browserify/babel 中的构建?

javascript - 可以使用 Babel 转译成 TypeScript 吗?