2016-10-03 2 views
0

Вот сообщение об ошибке:Непредвиденная ошибка маркера синтаксиса в безгосударственной функции, используя стрелку синтаксис

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 }); 

Я пробовал все соответствующие ответы без успеха, любые предложения?

+0

Синтаксис выглядит нормально на первый взгляд ... вы проверили, чтобы убедиться, что использование '{props.component}', как это в JSX, действительно? Я не знаю, что это не так - просто не видел этого раньше. Я проверю одно из своих приложений. –

+0

Я так думаю, я использую его в других компонентах, которые отлично работают, но почему-то я ошибаюсь в этом. – rfc1484

+0

Что такое props.component? Как я читаю, вы передаете компонент в реквизиты, а затем привязываете все остальные реквизиты к этому компоненту. Но я мог бы это прочитать неправильно – finalfreq

ответ

2

Вам просто нужно скопировать то, что вы делали раньше const Component = props.component

, а затем сделать <Component onClick={props.onClick} styleName={props.classNames} style={props.style} />

Реагировать отличает компоненты от HTML, проверив, чтобы увидеть, если этот элемент прописными буквами. В вашем случае, так как вы просто делаете `< {props.component} ', который реагирует обычно на то, чтобы быть компонентом, и он не знает, как анализировать его как элемент html.

+0

Это решение работало нормально. Я думаю, что было бы еще более полезно, если бы вы знали, где это задокументировано и опубликовать ссылку, спасибо в любом случае! – rfc1484

+1

https: //facebook.github.io/react/docs/jsx-in-depth.html # html-tags-vs.-react-components, который проходит эту часть специально – finalfreq

+2

Добавляя к этому ответу, вы можете извлечь реквизиты для переменных в определении функции, например, так: 'const Icon = ({name, className, onClick, Component, style}) => 'Не забудьте загладить« Компонент »в реквизитах, хотя – Mchl

0

Я думаю, что это props.component, а не синтаксис функции стрелки. Об этом свидетельствует и ошибка.

К примеру, в одном из моих приложений, это работает отлично:

return <About />;

Но это дает одинаковую ошибку:

return <{'About'} /> 

Ошибка:

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

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

Если не является использование сценарий, который я пропускаю, который, безусловно, возможно. Легко проверить, хотя - что произойдет, если вы импортируете компонент, который ожидаете сделать, и используете его в JSX вместо {props.component}?

+0

В вашем примере 'About' представляет строку, в моем примере она представляет значение prop, я обновил вопрос, показывающий один и тот же код, без использования функции без состояния или синтаксиса стрелок, и он отлично работает (то есть, используя фигурные скобки). – rfc1484

Смежные вопросы