Синтаксическая ошибка при отображении JavaScript в виде текста в React

Я пишу некоторую документацию в React и получаю синтаксическую ошибку, когда пытаюсь написать JavaScript в функции рендеринга. Я не уверен, является ли это проблемой безопасности с обходным решением или это действительно проблема парсера:

export default class Docs extends Component {
  render = () =>
    <div>
      <h1>Example:</h1>
      <div className = {styles['code-block']}>
        `
        import Calendar from './Calendar'

        const config = {
          api_key: 1234,
          calendars: [{ name: 'demo', url: '[email protected]' }]
        }
        `
      </div>
    </div>
 }

Я пробовал как с обратным тиком, так и без него, но все равно получаю ту же синтаксическую ошибку:

Module build failed: Syntax Error: Unexpected token, expected }

ссылка на толстую кишку сразу после api_key. Есть ли способ сделать это, или мне лучше выбрать другой подход.

попробуйте обернуть его {``}, прямо сейчас синтаксический анализатор не понимает, что следует экранировать в фактический JS, а что такое строка в JSX

rlemon 30.10.2018 18:14

@rlemon, мне нужно беспокоиться о том, что парсер анализирует его как JS?

crash springfield 30.10.2018 18:16

нет, это то, что делает литерал шаблона. превращая его в строку. но без указания парсеру обрабатывать что как JS, это просто произвольные обратные кавычки. просто не включайте туда никаких упаковок ${}. или экранируйте его внутри строки.

rlemon 30.10.2018 18:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
65
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий
    export default class Docs extends Component {
  render = () =>
    <div>
      <h1>Example:</h1>
      <div className = {styles['code-block']}>
        {`
        import Calendar from './Calendar'

        const config = {
          api_key: 1234,
          calendars: [{ name: 'demo', url: '[email protected]' }]
        }
        `}
      </div>
    </div>

}

Вам просто нужно заключить его в скобки:

{`
  import Calendar from './Calendar'

  const config = {
    api_key: 1234,
    calendars: [{ name: 'demo', url: '[email protected]' }]
  }
`}

Многострочный код следует заключать в круглые скобки и использовать разметку, отличную от html, вам нужно будет использовать фигурные скобки для их анализа:

export default class Docs extends Component {
  render = () => ( {/* 1 */}
    <div>
      <h1>Example:</h1>
      <div className = {styles['code-block']}>
       { {/* 2 */}
        `
        import Calendar from './Calendar'

        const config = {
          api_key: 1234,
          calendars: [{ name: 'demo', url: '[email protected]' }]
        }
        `
       }
      </div>
    </div>
   )
 }

{/ * 1 * /}

Вместо круглых скобок вы также можете использовать фигурные скобки и использовать оператор возврата, например:

  render = () => {
    return ( <div> {/* optional parentheses */}
     Optional, since it is in same line as return line
    </div>)
  }

Или вроде:

  render = () => {
    return (  {/* required parentheses */}
      <div>
       Required, since it is in different line from return line
    </div>
   )
  }

Это означает запуск HTML-разметки, такой как <div> в предыдущем примере.

{/ * 2 * /}

Использование фигурной скобки в предыдущем примере приведет к тому, что все заключено в литерал шаблона или внутри строки. Обратите внимание, что если вы используете переменную типа ${some_var} внутри литерала шаблона, это приведет к тому, что ее значение будет не таким, как оно есть. Если вы хотите в каком-то случае, просто избегайте фигурной скобки, например $\{some_var}

Оператор backquote(`) - это не текст или строка, это оператор, как функция JavaScript. Функция JavaScript должна находиться внутри {} при использовании внутри JSX. поэтому вы должны написать, как показано ниже:

export default class Docs extends Component {
  render = () =>
    <div>
      <h1>Example:</h1>
      <div className = {styles['code-block']}>
        {`
        import Calendar from './Calendar'

        const config = {
          api_key: 1234,
          calendars: [{ name: 'demo', url: '[email protected]' }]
        }
        `}
      </div>
    </div>
 }

Другие вопросы по теме