Ошибка синтаксического анализа подстановки переменных (неожиданный токен, ожидаемое "...") - PullRequest
0 голосов
/ 05 января 2019

У меня есть код, который динамически настраивает текстовое поле.

Эта версия кода работает нормально :

  if (props.responsetxt === null) {
    txtField = (
      <TextField
        autoFocus
        margin="dense"
        id="name"
        label={emailField}
        type="email"
        fullWidth
        onChange={e => emailFieldUpdate(e)}
      />
    );

Однако я использую material-ui, и я хочу использовать их опцию error (https://material -ui.com / demos / text-fields / )

Но если я изменю свой код следующим образом:

let errorFlag = null;  // add this
    txtField = (
      <TextField
        {errorFlag} // add this
        autoFocus
        margin="dense"
        id="name"
        label={emailField}
        type="email"
        fullWidth
        onChange={e => emailFieldUpdate(e)}
      />
    );

Я получаю ошибку:

Ошибка синтаксического анализа: неожиданный токен, ожидаемое "..."

  Line 45:  Parsing error: Unexpected token, expected "..."

  43 |     txtField = (
  44 |       <TextField
> 45 |         {errorFlag}
     |          ^
  46 |         autoFocus
  47 |         margin="dense"
  48 |         id="name"

Я не понимаю, почему динамические параметры label и onChange могут работать нормально, а замена {errorFlag} не может?

UPDATE

function DownloadForm(props) {
  const intl = props.intl;
  const boxTitle = intl.formatMessage({ id: 'downloadRequest.title' });
  const cancelButton = intl.formatMessage({ id: 'button.cancel' });
  const closeButton = intl.formatMessage({ id: 'button.close' });
  const downloadButton = intl.formatMessage({ id: 'button.download' });
  const emailField = intl.formatMessage({ id: 'downloadRequest.emailField' });
  let boxText = null;
  let waitingAnimation = null;
  let returnArr = {};
  let errorFlag = null;
  const emailFieldUpdate = e => {
    returnArr['email'] = e.target.value;
    if (!EmailValidator(e.target.value)) {
        console.log('setting true !');
        errorFlag=true;
    }
  };
  returnArr['subset'] = props.selectedSubset;
  if (props.showWaitingAnimation) {
    waitingAnimation = <CircularProgress />;
  }
  if (props.responsetxt === null) {
    returnArr['correlID'] = UUIDGenerator();
    returnArr['boxOpened'] = TAI64.now().toHexString();
    boxText = intl.formatMessage({ id: 'downloadRequest.prompt' });
  } else {
    boxText = props.responsetxt;
}
  let txtField, submitButton, closeText;
  if (props.responsetxt === null) {
    txtField = (
      <TextField
        error={errorFlag}
        autoFocus
        margin="dense"
        id="name"
        label={emailField}
        type="email"
        fullWidth
        onChange={e => emailFieldUpdate(e)}
      />
    );
    submitButton = (
      <Button
        color="primary"
        onClick={() =>
          props.submit(returnArr, process.env.REACT_APP_ITS_AWS_SQS_DOWNLOAD)
        }
      >
        {downloadButton}
      </Button>
    );
    closeText = cancelButton;
  } else {
    closeText = closeButton;
  }
  return (
    <div>
   <Dialog open={props.open} aria-labelledby="form-dialog-title">
        <DialogTitle id="form-dialog-title">{boxTitle}</DialogTitle>
        <DialogContent>
          <DialogContentText>{boxText}</DialogContentText>
          {waitingAnimation}
          {txtField}
        </DialogContent>
        <DialogActions>
          <Button color="primary" onClick={props.close}>
            {closeText}
          </Button>
          {submitButton}
        </DialogActions>
      </Dialog>
    </div>
  );
}
export default injectIntl(DownloadForm);

1 Ответ

0 голосов
/ 05 января 2019

Из документа:

  <TextField
      error
      id="standard-error"
      label="Error"
      defaultValue="Hello World"
      className={classes.textField}
      margin="normal"
  />

Здесь error - это короткий синтаксис error={true}, который невозможно воспроизвести динамически. Однако вы можете сделать следующее:

  <TextField
    error={errorFlag}
    autoFocus
    margin="dense"
    id="name"
    label={emailField}
    type="email"
    fullWidth
    onChange={e => emailFieldUpdate(e)}
  />

И, как говорится в сообщении об ошибке, деконструкция одного атрибута JSON также может работать:

  <TextField
    ...{error : errorFlag}

Переименование в error еще больше уменьшит синтаксис:

  <TextField
    ...{error}

РЕДАКТИРОВАТЬ:

Вы используете компонент React без состояния, что означает, что он никогда не будет выполнять рендеринг сам по себе, и вызов emailFieldUpdate также не будет. Я преобразовал ваш компонент в компонент с состоянием, где errorFlag теперь в вашем состоянии.

Вызов this.setState({ errorFlag: true }) обновит ваш флаг и повторно отобразит ваш компонент, показывая вам ошибку. Я также сделал несколько изменений читабельности кода:

import React, { Component } from 'react'
export default class DownloadForm extends Component {
    constructor(props) {
        super(props)

        this.state = {
            errorFlag: null,
            returnArr: {}
        }
    }

    emailFieldUpdate = e => {
        this.setState({ returnArr:{ email: e.target.value }})
        if (!EmailValidator(e.target.value)) {
            console.log('setting true !');
            this.setState({ errorFlag: true })
        }
    };

    render() {
        const { selectedSubset, responsetxt, showWaitingAnimation, intl, submit, open, close } = this.props //Decontructs your props
        const { errorFlag, returnArr } = this.state //Deconstructs your state

        const [boxTitle, cancelButton, closeButton, downloadButton, emailField] = 
        ['downloadRequest.title', 'button.cancel', 'button.close', 'button.download', 'downloadRequest.emailField'].map(id =>
            intl.formatMessage({ id })
        );
        let boxText = null;
        let waitingAnimation = null;

        returnArr['subset'] = selectedSubset;
        if (showWaitingAnimation) {
            waitingAnimation = <CircularProgress />;
        }
        if (!responsetxt) {
            returnArr['correlID'] = UUIDGenerator();
            returnArr['boxOpened'] = TAI64.now().toHexString();
            boxText = intl.formatMessage({ id: 'downloadRequest.prompt' });
        } else {
            boxText = responsetxt;
        }
        return (
            <div>
                <Dialog open={open} aria-labelledby="form-dialog-title">
                    <DialogTitle id="form-dialog-title">{boxTitle}</DialogTitle>
                    <DialogContent>
                        <DialogContentText>{boxText}</DialogContentText>
                        {waitingAnimation}
                        {!responsetxt && 
                            <TextField
                                error={errorFlag}
                                autoFocus
                                margin="dense"
                                id="name"
                                label={emailField}
                                type="email"
                                fullWidth
                                onChange={this.emailFieldUpdate}
                            />
                        }
                    </DialogContent>
                    <DialogActions>
                        <Button color="primary" onClick={close}>
                            {responsetxt ? closeButton : cancelButton}
                        </Button>
                        {!responsetxt && 
                            <Button
                                color="primary"
                                onClick={() => {submit(returnArr, process.env.REACT_APP_ITS_AWS_SQS_DOWNLOAD)}}>
                                {downloadButton}
                            </Button>
                        }
                    </DialogActions>
                </Dialog>
            </div>
        );
    }
}

Похоже, вы используете React-intl, посмотрите эту документацию, чтобы отправлять свои сообщения прямо в ваш JSX: https://github.com/yahoo/react-intl/wiki/Components#formattedmessage

Также я предлагаю прочитать условный рендеринг в React и деконструкция в JS

...