Какова цель литералов шаблонов (обратных кавычек) после определения переменной в ES6?
В GraphQL вы можете написать что-то вроде этого для определения запроса:
const USER_QUERY = gql'
{
user(id: 2) {
name
}
}
'
В стилизованных компонентах вы можете определить стилизованный компонент следующим образом:
const Button = styled.button'
background-color: papayawhip;
'
Что это за синтаксис? Я знаю, что с литералами шаблонов вы можете использовать переменные с этим синтаксисом: ${foo}
но я никогда не видел, чтобы это использовалось. Любое руководство будет оценено.
Ответы
Ответ 1
Это помеченные литералы шаблона. Часть перед рюкзаками является ссылкой на функцию, которая будет вызываться для обработки строки.
В функцию передаются переменные (части ${}
) в качестве аргументов, а также фрагменты строки, которые окружают переменные, разбитые на массив. Возвращаемое значение функции становится значением шаблона. Из-за этого очень обобщенного формата вы можете делать с функцией почти все что угодно. Вот быстрый и грязный пример, который берет переменные (собранные в массив для удобства), переводит их в верхний регистр и помещает обратно в строку:
function upperV(strings, ...vars) {
/* make vars uppercase */
console.log("vars: ", vars) // an array of the passed in variables
console.log("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.log(output)
Ответ 2
Шаблонные литералы имеют дополнительную функцию, называемую теговыми шаблонами. Вот что такое префикс перед открывающим обратным тылом. Префикс на самом деле является именем функции - функции передаются константные части строк шаблона и интерполированные значения (вещи в секциях ${}
), и они могут обрабатывать полученную строку как угодно (хотя обычно это другая строка, не должно быть).
Смотрите эту страницу на MDN для более подробной информации о том, как работают теговые шаблоны.