#reactjs #ecmascript-6 #babeljs #stateless #arrow-functions
#reactjs #ecmascript-6 #babeljs #без состояния #функции со стрелками
Вопрос:
Вот сообщение об ошибке:
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 });
Я безуспешно перепробовал все связанные ответы, какие-либо предложения?
Комментарии:
1. синтаксис на первый взгляд выглядит нормально… вы проверили, чтобы убедиться, что
{props.component}
подобное использование в JSX допустимо? Я не знаю, что это не так — просто не видел этого раньше. Я проверю одно из своих приложений.2. Я думаю, что да, я использую его в других компонентах, которые работают нормально, но почему-то я допускаю ошибку в этом.
3. каким должен быть props.component? Насколько я понимаю, вы передаете компонент в props, а затем связываете все остальные props с этим компонентом. Но я мог бы прочитать это неправильно
4. Он представляет HTML-тег или другой компонент, в данном случае
span
по умолчанию именование не подходит, но я исправлю это, как только решу проблему5. Вы не можете использовать
{...}
для вычисления имени компонента. Смотрите спецификацию: facebook.github.io/jsx .
Ответ №1:
Вам просто нужно скопировать то, что вы делали раньше const Component = props.component
а затем выполните <Component onClick={props.onClick} styleName={props.classNames} style={props.style} />
React отличает компоненты от html, проверяя, написан ли элемент с заглавной буквы. В вашем случае, поскольку вы просто выполняете `<{props.component}’, который react не будет воспринимать как компонент, и он также не будет знать, как его анализировать как html-элемент.
Комментарии:
1. Это решение работало нормально. Я думаю, было бы еще полезнее, если бы вы случайно знали, где это задокументировано, и разместили ссылку, спасибо в любом случае!
2. facebook.github.io/react/docs/… это касается конкретно этой части
3. Добавляя к этому ответу, вы можете извлекать реквизиты для переменных в определении функции, например, так
const Icon = ({name, className, onClick, Component, style}) =>
, что просто не забудьте использовать заглавныеComponent
буквы в реквизитах
Ответ №2:
Я думаю props.component
, что это вызывает это, а не синтаксис функции стрелки. Это то, на что указывает ошибка.
Например, в одном из моих приложений это работает нормально:
return <About />
;
Но это дает идентичную ошибку:
return <{'About'} />
Ошибка:
SyntaxError: /src/components/application.js: Unexpected token (89:16)
88 | case 'about':
> 89 | return <{'About'} />;
| ^
Если только не существует сценария использования, который мне не хватает, что, безусловно, возможно. Легко проверить, хотя — что произойдет, если вы импортируете компонент, который вы ожидаете отобразить, и используете его в JSX вместо {props.component}
?
Комментарии:
1. В вашем примере
About
представляет строку, в моем примере она представляет значение prop, я обновил вопрос, показывающий тот же код без использования функции без состояния или синтаксиса стрелки, и он работает нормально (то есть с использованием фигурных скобок).