细读 ES6 | 模板字符串进阶用法

简介: 细读 ES6 | 模板字符串进阶用法

前言


模板字符串(template string)是 ECMAScript 2015 规范中的一种新特性,在平常开发中使用频率非常高。也可称作模板字面量(template literal)。


正文


常规用法


模板字符串使用反引号(` `)来代替普通字符串中的用双引号和单引号。

// 单行字符串
`single line text`
// 多行字符串
`multiline text 1
 multiline text 2`
// 嵌入表达式
function sayHi(name) {
  console.log(`Hi, ${name}~`)
}
// 模板字符串内使用反引号,需在前面添加转义符 (\)
`\`` === '`' // true


需要注意的是,模板字符串内的「任意字符」都是它的一部分,包括很容易被视觉忽略的前导尾随空格、换行符等「空白符」。比如:

String.raw`multiline text 1
 multiline text 2` // "multiline text 1\n multiline text 2"


以上 String.raw() 是模板字符串的标签函数(下面会介绍),它返回指定模板字符串的原始字符串,可以看到它是包含 \n(换行符和空格)的。

它也支持嵌套语法,比如:

const className = `flex-center ${isShow ? `display ${isLarge ? 'big' : 'normal'}` : ''}`


以上这些内容,相信看到这篇文章的你都懂,没什么问题。


进阶用法


如果你在项目中使用过 CSS-in-JS,可以经常看到类似这样的语法:

import styled from 'styled-components'
const Button = styled.button`
  color: palevioletred;
  font-size: 1em;
  margin: 1em;
  padding: 0.25em 1em;
  border: 2px solid palevioletred;
  border-radius: 3px;
`


以上是 styled-components 的基础用法。

这看起来有点“奇怪”的语法,正是模板字符串中的标签模板(tagged template)。看个例子:

alert`Hey`


以上等同于 alert('Hey'),在这里 alert 被称作「标签函数」。


因此「标签模板」实际上只是函数调用的一种特殊形式。标签指的是函数(即 alert() 方法),而函数后面的模板字符串就是它的参数。


如果标签模板中的模板字符串是包含变量的,就不是简单的调用了。比如:

const name = 'Frankie'
// 标签模板
tag`Hey, ${name}~`
// 等同于这样调用函数
tag(['Hey, ', '~'], 'Frankie')

标签函数的第一个参数,是模板字符串中由不包含 ${expression} 部分的字符串拆分而成的数组。即 `Hey, ${name}~` 中的剔除掉 ${name} 后拆分组成的数组。而后面的参数则为模板字符串中的所有变量。注意,标签函数并不是只能返回字符串,它也是一个普通函数,可以返回任何值。


形式如:

function tagFunction(strArr, ...values) {
  // some statements...
}


其中标签函数第一个参数中,存在一个特殊的属性 raw,通过它可以访问模板字符串的「原始字符串」,而不经过特殊字符的转换。

function tagFunction(strArr) {
  console.log(strArr.raw[0])
}
tagFunction`multiline text 1
 multiline text 2` // "multiline text 1\n multiline text 2"


应用场景


  1. 写 GraphQL 应用常用的 graphql-tag 库,就是应用了标签函数的语法,写法很简洁。

import gql from 'graphql-tag';
const query = gql`
  {
    user(id: 5) {
      firstName
      lastName
    }
  }
`


未完待续...


目录
相关文章
|
Windows
FL Studio20.9.2永久免费中文版水果软件
FL Studio随着近年来摇滚、电音的发展,越来越多的人开始对电子音乐编曲感兴趣,而电音编曲的首要条件,就是需要一个好的DAW(数字音频工作站),常用的DAW有很多,例如Cubase、Nuendo、Pro Tools、 SONAR等等,但以小编的个人体验感而言,最顺手的还是FL Studio。
8076 0
|
2月前
|
NoSQL 数据管理 Redis
Redis Desktop Manager 0.8.8 安装教程(Windows redis-desktop-manager-0.8.8.384详细步骤)
本文详细介绍了Redis Desktop Manager 0.8.8.384免费版的Windows安装与配置流程:从网盘下载安装包、以管理员身份运行,到逐步完成向导安装;并指导如何连接本地Redis(127.0.0.1:6379)进行测试与数据管理。兼容Win10/Win11。
|
8月前
|
SQL XML Java
吃透 MyBatis 核心
本文系统解析MyBatis核心原理与实战应用,涵盖架构流程、动态SQL、关联查询、缓存机制及PageHelper分页插件,结合Druid数据源优化与阿里云部署实践,助力开发者掌握Java持久层核心技术,提升数据库操作效率与项目部署能力。
|
API 开发工具 开发者
HarmonyOS NEXT实战:拨打电话
本课程介绍如何在HarmonyOS SDK中使用Telephony Kit实现拨打电话功能。通过CallPhoneDemoPage示例,讲解如何输入电话号码并调用makeCall接口拨号,涉及call模块的使用及设备通话能力检测。
8181 0
|
传感器 机器学习/深度学习 Oracle
2025如何通过智能物资管理工具实现降本增效?核心功能实现路径!
本文探讨了基于物联网与决策科学的现代物资管理系统架构,分析了物资管理工具从静态台账向智能中枢演进的技术路径。通过“感知-决策-执行”三层架构、多模态感知与自适应预测等关键技术,实现库存优化与智能调度。结合主流工具选型与实施策略,揭示物资管理向自感知、自优化方向发展的未来趋势。
570 0
|
设计模式 前端开发 JavaScript
20个GitHub仓库助你成为React大师
20个GitHub仓库助你成为React大师
654 0
|
Shell Linux iOS开发
使用 pipx 安装并执行 Python 应用程序 (1)
使用 pipx 安装并执行 Python 应用程序 (1)
1108 0
使用 pipx 安装并执行 Python 应用程序 (1)
|
存储 边缘计算 数据处理
边缘云概述
边缘云是分布式云数据中心,位于网络边缘,提供低延迟、高带宽的实时服务。它减少数据传输时间,支持本地化处理,确保数据安全,并在无网络时仍能运作。应用于CDN、互动直播和本地服务,与云计算互补,共同优化数据处理。随着5G和IoT的发展,边缘云将在未来扮演关键角色。
|
NoSQL 网络协议 Linux
卡速售电商系统2.0搭建教程(详细图文版)
本文详细介绍了在Linux服务器上(推荐CentOS 7.x / Ubuntu 20.04)使用宝塔面板安装和配置卡速售的安装及配置过程,包括安装PHP 8.0及其扩展(fileinfo、redis、swoole4)、调整内存限制、配置二进制日志等。同时提供了安装系统程序的具体步骤,如添加站点、上传并解压文件、设置运行目录及伪静态规则,并通过进程守护管理器启动程序。最后附有故障排查指导,确保安装顺利进行。
729 5
|
Linux
`grep`命令搜索多个文件中的特定模式
`grep`命令搜索多个文件中的特定模式
2221 2