Какова цель шаблонных литералов (обратных кавычек) после функции в ES6?

В GraphQL вы можете написать что-то вроде этого, чтобы определить запрос:

const USER_QUERY = gql`
  {
    user(id: 2) {
      name
    }
  }
`

В стилизованных компонентах вы можете определить стилизованный компонент следующим образом:

const Button = styled.button`
    background-color: papayawhip;
`

Что это за синтаксис? Я знаю, что с помощью шаблонных литералов вы можете подставлять переменные с таким синтаксисом: ${foo}, но я никогда не видел, чтобы это использовалось. Любое руководство будет оценено.

Откуда взялся этот пример?

Hogan 27.11.2018 21:54

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

Dacre Denny 27.11.2018 21:56
Обратные кавычки, вызывающие функцию || Как используется обратный апостроф (`) в JavaScript? (который упоминает тегированный литерал шаблона, но не в первом ответе)
user202729 28.11.2018 05:25
Поведение ключевого слова "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) для оценки ваших знаний,...
30
4
1 719
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У шаблонных литералов есть дополнительная функция, называемая шаблонами с тегами. Вот что такое префикс перед открывающей обратной кавычкой. Префикс на самом деле является именем функции - функции передаются постоянные части строк шаблона и интерполированные значения (материал в секциях ${}), и она может преобразовать полученную строку во все, что захочет (хотя обычно это другая строка, не не должно быть).

См. эта страница на MDN для более подробной информации о том, как работают шаблоны с тегами.

«функции передаются постоянные части строки шаблона» - что это значит?

ESR 28.11.2018 04:31

Это части строки шаблона, которых нет в блоках ${}. Прочтите страницу, на которую я ссылаюсь, там есть все подробности.

Chris Tavares 28.11.2018 07:32
Ответ принят как подходящий

Это тегированные литералы шаблона. Часть перед рюкзаками - это ссылка на функцию, которая будет вызываться для обработки строки.

В функцию передаются переменные (части ${}) в качестве аргументов, а также части строки, которые окружают переменные, разбитые на массив. Возвращаемое значение функции становится значением шаблона. Из-за этого очень обобщенного формата вы можете делать с функцией практически все, что угодно. Вот быстрый и грязный пример, в котором переменные (для удобства собраны в массив), переводятся в верхний регистр и возвращаются в строку:

function upperV(strings, ...vars) {
  /* make vars uppercase */
  console.info("vars: ", vars)       // an array of the passed in variables
  console.info("strings:", strings)  // the string parts

  // put them together
  return vars.reduce((str, v, i) => str + v.toUpperCase() + strings[i+1], strings[0]);
}

let adverb = "boldly"
let output = upperV`to ${adverb} split infinitives that no ${'man'} had split before...`;
console.info(output)

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