【问题标题】:Unexpected token syntax error in a stateless function using arrow syntax使用箭头语法的无状态函数中出现意外的标记语法错误
【发布时间】:2016-10-03 19:39:11
【问题描述】:

这是错误信息:

SyntaxError: <local path>/Icon.jsx: Unexpected token (13:2)
  11 | 
  12 |   return (
> 13 |     <{props.component} onclick=props.onClick styleName=props.classNames style=props.style/>
     |      ^
  14 |   );
  15 | };

我似乎无法弄清楚如何在无状态函数返回中修复这个语法错误,这里是代码:

import React from 'react';
import CSSModules from 'react-css-modules';
import styles from './Icon.css';

const Icon = (props) => {
  let classNames = `icon-${props.name}`;

  if (props.className) {
    classNames = `${classNames} ${props.className}`;
  }

  return (
    <{props.component} onclick={props.onClick} styleName={props.classNames} style={props.style} />
  );
};    

Icon.propTypes = {
  name: React.PropTypes.string.isRequired,
  className: React.PropTypes.string,
  onClick: React.PropTypes.func,
  component: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.func]),
  style: React.PropTypes.object,
};

Icon.defaultProps = {
  component: 'span',
};

export default CSSModules(Icon, styles, { allowMultiple: true, errorWhenNotFound: false });

这是 .babelrc 配置:

{
  "presets": [
    "es2015",
    "stage-0",
    "react"
  ],
  "plugins": [
    [
      "transform-runtime",
      "react-intl", {
        "messagesDir": "./build/messages",
        "enforceDescriptions": false
      }
    ]
  ]
}

这里是同样的组件,没有无状态函数或箭头语法,工作正常:

import React from 'react';
import CSSModules from 'react-css-modules';
import styles from './Icon.css';

class Icon extends React.Component {

  static defaultProps = {
    Component: 'span',
  };

  /**
   * render component
   * @return {object}
   */
  render() {
    const {
      Component,
      name,
      className,
      style,
      onClick,
    } = this.props;
    let classNames = `icon-${name}`;

    if (className) {
      classNames = `${classNames} ${className}`;
    }
    return <Component onClick={onClick} styleName={classNames} style={style} />;
  }
}

Icon.propTypes = {
  name: React.PropTypes.string.isRequired,
  className: React.PropTypes.string,
  onClick: React.PropTypes.func,
  Component: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.func]),
  style: React.PropTypes.object,
};


export default CSSModules(Icon, styles, { allowMultiple: true, errorWhenNotFound: false });

我已经尝试了所有相关的答案,但没有成功,有什么建议吗?

【问题讨论】:

  • 语法乍一看没问题...您是否检查过以确保在 JSX 中像这样使用 {props.component} 是有效的?我不知道它不是——只是以前没见过。我将签入我的一个应用程序。
  • 我想是的,我在其他可以正常工作的组件中使用它,但不知何故我在这个组件中犯了一个错误。
  • props.component 应该是什么?我的阅读方式是您将一个组件传递给道具,然后将所有其他道具绑定到该组件中。但我可能读错了
  • 表示html标签或其他组件,本例默认span,命名不好,等我解决问题再修复
  • 您不能使用{...} 来计算组件名称。请参阅规范:facebook.github.io/jsx

标签: reactjs ecmascript-6 babeljs stateless arrow-functions


【解决方案1】:

你只需要复制你在const Component = props.component之前所做的事情

然后做&lt;Component onClick={props.onClick} styleName={props.classNames} style={props.style} /&gt;

React 通过检查元素是否大写来区分组件和 html。在你的情况下,因为你只是在做 `

【讨论】:

  • 此解决方案运行良好。我认为,如果您有机会知道该文档的记录位置并发布链接,那将更加有用,无论如何,谢谢!
  • facebook.github.io/react/docs/… 专门介绍了该部分
  • 添加到这个答案中,您可以像 const Icon = ({name, className, onClick, Component, style}) =&gt; 一样将 props 提取到函数定义中的变量中,但请记住在 props 中将 Component 大写
【解决方案2】:

我认为是 props.component 导致了这种情况,而不是箭头函数语法。这也是错误所指示的。

例如在我的一个应用程序中,这可以正常工作:

return &lt;About /&gt;;

但这给出了相同的错误:

return <{'About'} />

错误:

SyntaxError: /src/components/application.js: Unexpected token (89:16)

  88 |       case 'about':
> 89 |         return <{'About'} />;
     |                 ^

除非有我遗漏的使用场景,这绝对是可能的。虽然很容易测试 - 如果您导入一个您希望在 JSX 中呈现并使用它而不是 {props.component} 的组件会发生什么?

【讨论】:

  • 在您的示例中,About 代表一个字符串,在我的示例中它代表一个道具值,我更新了显示相同代码的问题,但没有使用无状态函数或箭头语法,它工作正常(也就是说,使用大括号)。
猜你喜欢
  • 2016-04-14
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多