es6字符串模板之标签化模板

es6字符串模板

我们经常搞前端开发工作的都会用到。它可以保留字符串换行格式,还能接受变量。这个给前端的字符串拼接带来了非常大的方便。但是还有一种用法可能是我们平时还是没有怎么用到的。

styled-components

在项目中熟悉使用react的童鞋可能会用过styled-components,它的写法如下:

const Title = styled.h1`font-size: 1.5em;text-align: center;color: palevioletred;
`;

效果

最终就是生成一个带有上面样式属性的h1标签。

es6基础

这里看到它用到的就是es6的字符串模板。一开始我以为是预编译工具的语法。后面重温js基础时候看到了这个:

`string text``string text line 1string text line 2``string text ${expression} string text`tagFunction`string text ${expression} string text`

developer.mozilla.org

代码来源:模板字符串 - JavaScript | MDN

字符串模板前面是可以接受函数名字的,而这个函数的参数 arguments的内容是个数组,数组的第一个值是所有普通字符串的数组,剩余的元素是模板里面变量值

例如上面的代码tagFunction`string text ${expression} string text`

假设expression遍历的值是100,tagFunction的arguments的值就是

[["string text","string text"],100,
...其他变量值 //这里只有一个变量,所以不存在其他变量值]

 所以,我们可以理解是执行了tagFunction函数并给该函数传递了解析字符串`string text ${expression} string text`对象

新的书写风格

既然是执行函数,那函数是可以返回值的,那我们可以在这个函数里面return个函数,这样我们就有机会把代码写成这样


alink.styles`color:${color};font-size:16px;background-color:${bgColor};
`
.props`href:${url};tabIndex:1;`
.content`跳转到:${url}`
  1. styles设置样式属性
  2. props设置标签属性
  3. content设置标签内容 

HTMLElement对象拓展

那我们给html标签对象进行拓展方法如下:

 HTMLElement.prototype.styles = function () {return this
}
HTMLElement.prototype.props = function () {return this
}
HTMLElement.prototype.content = function () {return this
}

还需要对 arguments对象进行解析,得到key,value

解析arguments

const getAttAndValueString = (args, isContent) => {let startIndex = 0const attr = args[0].map((item) => {return item.replace('\n', '').replace(/\s/g, '').trim()}).filter(item => item)const value = args.slice(1).filter(item => item)let resultString = ''attr.forEach((element, index) => {if (element.endsWith(':') || isContent) {resultString += `${element}${value[startIndex]}`startIndex++} else {resultString += `${element}`}})return resultString
}

最终代码

  const getAttAndValueString = (args, isContent) => {let startIndex = 0const attr = args[0].map((item) => {return item.replace('\n', '').replace(/\s/g, '').trim()}).filter(item => item)const value = args.slice(1).filter(item => item)let resultString = ''attr.forEach((element, index) => {if (element.endsWith(':') || isContent) {resultString += `${element}${value[startIndex]}`startIndex++} else {resultString += `${element}`}})return resultString}HTMLElement.prototype.styles = function () {let resultString = getAttAndValueString(Array.from(arguments))console.log("resultString", resultString)const styleAttr = this.getAttribute("style");if (styleAttr) {resultString = `${styleAttr.endsWith(";") ? styleAttr : styleAttr + ";"} ${resultString}`}this.setAttribute("style", resultString);return this}HTMLElement.prototype.props = function () {// let resultString = getAttAndValueString(Array.from(arguments))// let obj = resultString.split(";").filter(item => item.length > 0)// obj.forEach(item => {//     const [prop, ...value] = item.split(":");//     this.setAttribute(prop, value.join(":"))// })return this}HTMLElement.prototype.content = function () {// this.innerText = getAttAndValueString(Array.from(arguments), true)return this}var alink = document.querySelector('#alink')var color = 'red'var bgColor = 'blue'var url = 'http://baidu.com'alink.styles`color:${color};font-size:16px;background-color:${bgColor};`.props`href:${url};tabIndex:1;`.content`跳转到:${url}`

在线效果

https://jsbin.com/kawumewoto/4/edit?html,js,output

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/172462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

灯塔的安装

Docker 安装 docker 安装参考:https://docs.docker.com/engine/install/ shell脚本: curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh灯塔安装 mkdir docker-ARL;cd docker-ARL curl https://bootstrap.pypa.io/get-pip.py -o get-pip…

一些权限方面的思考

一些权限方面的思考 背景说明自定义注解解析自定义注解 背景 鉴权可以通过切面做抽取 说明 都是一些伪代码, 不能直接使用, 提供一种思路. 都是一些伪代码, 不能直接使用, 提供一种思路. 都是一些伪代码, 不能直接使用, 提供一种思路. 自定义注解 自定义注解: Permission …

【Linux学习】基础IO

目录 八.系统文件IO 8.1 前言 8.2 C语言文件IO C语言常用的基本函数 C语言默认打开的的三个流 8.3 系统文件IO open接口 close接口 write接口 read接口 8.4 C语言文件IO与系统文件IO的关系 八.系统文件IO 8.1 前言 系统文件 I/O(输入/输出)是指在…

pandas 如何获取dataframe的行的数量

pandas的dataframe提供了多种方法获取其中数据的行的数量,本偏文章就是介绍几种获取dataframe行和列出量的方法。 为了能够详细说明如何通过代码获取dataframe的行数和列数,需要先创建一个dataframe如下: import pandas as pdtechnologies …

C++设计模式之策略模式

策略模式 介绍示例示例测试运行结果应用场景优点总结 介绍 策略模式是一种行为设计模式。在策略模式中,可以创建一些独立的类来封装不同的算法,每一个类封装一个具体的算法,每一个封装算法的类叫做策略(Strategy),为了保证这些策…

NX二次开发UF_CURVE_ask_wrap_curve_parents 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_wrap_curve_parents Defined in: uf_curve.h int UF_CURVE_ask_wrap_curve_parents(tag_t curve_tag, tag_t * defining_face, tag_t * defining_plane, tag_t * defin…

18. Python 数据处理之 Numpy

目录 1. 简介2. 安装和导入Numpy3. ndarray 对象4. 基本运算5. 索引、切片和迭代6. 条件和布尔数组7. 变换形状8. 操作数组 1. 简介 数据分析的流程概括起来主要是:读写、处理计算、分析建模和可视化4个部分。 Numpy 是Python 进行科学计算,数据分析时…

C#每天复习一个重要小知识day10:静态类

1.静态类的概念 用static修饰的类。 静态类其实很简单,把它的特点和作用牢记就行了。 2.静态类的特点 1)只能包含静态成员 //访问修饰符是啥自己定,但工具类里面的成员变量和成员方法一般都是用public的,除非你有某种需求&am…

关于银河麒麟操作系统黑屏问题

一.问题说明 安装xx所软件后在/etc/ld.so.conf.d/下创建了一个JinCEarth.conf的配置文件,ldconfig使其生效,然后安装任意一个包,重启时将会黑屏 1.根本原因:ld.so.cache的改变使得/usr/lib/x86_64-linux-gnu/libXrandr.so.2的库…

MySQL进阶_10.锁

文章目录 一、概述二、MySQL并发事务访问相同记录2.1、读-读2.2、写-写2.3、读-写2.4、并发问题的解决方案 三、锁的不同角度分类3.1、 读锁、写锁3.1.1、 锁定读 3.2、表级锁、页级锁、行锁3.2.1、表锁3.2.2、意向锁3.2.2.1、意向锁的作用3.2.2.2、意向锁的互斥性 3.2.3、自增…

2019年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

文章目录 2019年考研英语二真题SectionⅠ Use of EnglishSection II Reading ComprehensionText 121——细节信息题22——细节信息题23——细节信息题24——细节信息题25——词义题 Text 226——细节信息题27——细节信息题28——细节信息题29——细节信息题30——态度题 Text …

springboot2.0 集成swagger3+Knife4j导出离线API 配置

springboot 版本2.3.1 一、集成swagger3 引入swagger依赖包 <!--swagger3集成--><dependency><groupId>org.springframework.plugin</groupId><artifactId>spring-plugin-core</artifactId><version>2.0.0.RELEASE</version>…

Linux面试题(三)

目录 34、du 和 df 的定义&#xff0c;以及区别&#xff1f; 35、awk 详解。 36、当你需要给命令绑定一个宏或者按键的时候&#xff0c;应该怎么做呢&#xff1f; 37、如果一个 linux 新手想要知道当前系统支持的所有命令的列表&#xff0c;他需要怎么做&#xff1f; 38、…

第一百八十一回 如何绘制阴影效果

文章目录 1. 概念介绍2. 使用方法2.1 SegmentedButton2.2 ButtonSegment 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 1. 概念介绍 我们在本章回中介绍的SegmentedButton组件是一种分段式按钮&#xff0c;它把多个按钮连接成一组显示&#xff0c;组内再对不同的按钮进…

[计算机网络]应用层概述

0.写在前面: 该层为教学模型的最后一层,某种意义上来说是最接近各位开发者的一层,正因如此,这层中的很多定义和概念大家都有属于自己的理解, 完全按照书本反而才是异类,因此在这里我会去结合我做前端开发的一些经验,来处理和讲解一些概念,另外本层中的部分协议也不会过多阐述了…

VUE简易购物车程序

目录 效果预览图 完整代码 效果预览图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

Python 进阶(十一):高精度计算(decimal 模块)

《Python入门核心技术》专栏总目录・点这里 文章目录 1. 导入decimal模块2. 设置精度3. 创建Decimal对象4. 基本运算5. 比较运算6. 其他常用函数7. 注意事项8. 总结 大家好&#xff0c;我是水滴~~ 在进行数值计算时&#xff0c;浮点数的精度问题可能会导致结果的不准确性。为了…

【Amazon】通过直接连接的方式导入 KubeSphere集群至KubeSphere主容器平台

文章目录 一、设置主集群方式一&#xff1a;使用 Web 控制台方式二&#xff1a;使用 Kubectl命令 二、在主集群中设置代理服务地址方式一&#xff1a;使用 Web 控制台方式二&#xff1a;使用 Kubectl命令 三、登录控制台验证四、准备成员集群方式一&#xff1a;使用 Web 控制台…

第六届 传智杯初赛B组

文章目录 A. 字符串拼接&#x1f37b; AC code B. 最小差值&#x1f37b; AC code C. 红色和紫色&#x1f37b; AC code D. abb&#x1f37b; AC code E. kotori和素因子&#x1f37b; AC code F. 红和蓝&#x1f37b; AC code &#x1f970; Tips&#xff1a;AI可以把代码从 j…

Android获取原始图片Bitmap的宽高大小尺寸,Kotlin

Android获取原始图片Bitmap的宽高大小尺寸&#xff0c;Kotlin val options BitmapFactory.Options()options.inJustDecodeBounds trueval decodeBmp BitmapFactory.decodeResource(resources, R.mipmap.p1, options)//此时&#xff0c;decode出来的decodeBmp宽高并不是原始图…