模板字符串可能是我们熟悉的ES6的一个新特性。它允许我们在字符串中插入变量,还可以换行等等,用起来真的是非常的方便。.然而,ES6也增加了一个新的标签功能,主要用于模板字符串。1.什么标签功能?顾名思义,标签函数也是一个函数。这是一个非常简单的标签函数声明:functiontagFoo(){console.log('这是一个标签函数');}仔细看看tagFoo和我们常用的普通函数有什么区别?看不出区别?得出这个结论很正常,因为标签函数其实就是一个函数,所以它的声明和函数声明完全一样。那么,我们怎么知道tagFoo是一个标签函数,或者说标签函数和普通函数相比有什么特别之处呢?答案就是看tagFoo是怎么调用的。tagFoo();//ThisisatagfunctiontagFoo`atemplatestring`;//Thisisatagfunction标签函数除了是普通函数外,还可以使用模板字符串``来传递。也就是说,当使用模板字符串调用函数时,这个函数可以称为标签函数,所以我们不妨将标签函数理解为一种新的函数调用方式。那我们可能会想,这两种调用方式有什么区别呢?它们的返回值是多少?无论调用方式如何,都会调用这个函数,最终的返回值也是这个函数执行的结果。我们给tagFoo加一个返回值看看:functiontagFoo(){return'我是返回值';}letres1=tagFoo();letres2=tagFoo`atemplatestring`;console.log({res1,res2});//{res1:'我是返回值',res2:'我是返回值'}2.请问标签函数的参数?这两种调用方法只是看起来不同吗?当然不是。想必大家都注意到了,普通函数的调用方式是允许我们自己传入参数的,但是标签函数的调用方式似乎并没有给我们提供传入参数的机会。我们来看看标签函数有参数时的参数是什么://['普通模板字符串']tagFoo`带插值的模板字符串:${'var'}`;//['Atemplatestringwithinterpolation:','']vartagFoo`atemplatewithinterpolationString:${'var1'}-${'var2'}`;//['Atemplatestringwithinterpolation:','-','']var1var2从上面可以看出,标签函数调用时,接收到的一个参数总是一个数组,数组中的元素为模板字符串中的字符串部分;从第二个参数开始的其余参数接收模板字符串的插值变量,这些变量的个数是任意的。用另一种方式声明它可能更直观://{templateStrings:['Anormaltemplatestring'],insertVars:[]}tagFoo`Atemplatestringwithinterpolation:${'var'}`;//{templateStrings:['Atemplatestringwithinterpolation:',''],insertVars:['var']}tagFoo`Atemplatestringwithinterpolation:${'var1'},${'var2'}`;//{templateStrings:['AtemplatecharacterwithinterpolationString:','-',''],insertVars:['var1','var2']}也可以用图片表示:可以描述为,在templateStrings中每两个元素之间,应该有insertVars插入一个变量。两个数组中元素的顺序是有对应关系的。3.标签功能有什么用?标签函数允许我们根据模板字符串执行自己的逻辑行为,使一些操作变得非常简单。举个简单的例子,将模板字符串中的价格n转化为$n:i>=insertVars.length?'':'$'+insertVars[i]);},'');}console.log($`1号衣服原价${42},打折后价格是${2}`);//1号衣服原价$42,折后价$2console.log($`2号鞋原价${58},折后价${88}`);//不。2鞋子原价$58,折后价$88。当然这个效果不用label函数也可以实现,也很简单:function$(n){return'$'+n;}console.$(42)},折扣价为${$(2)}`);//1号衣服原价$42,打折后$2console.log(`2号鞋原价${$(58)},打折后${$(88)}`);//2号鞋原价$58,折后价$88。使用哪种方法取决于我们自己的喜好。但是,在处理一些特殊情况的时候,label函数可能会给我们很大的惊喜。就像styled-components所做的那样:constButton=styled.a`/*这会呈现上面的按钮...编辑我!*/显示:内联块;边界半径:3px;填充:0.5rem0;保证金:0.5rem1rem;宽度:11rem;背景:透明;白颜色;边框:2px纯白色;/*GitHub按钮是一个主要按钮*编辑它以专门针对它!*/${props=>props.primary&&css`background:white;颜色:黑色;`}`得到Button是一个React组件。有了styled-components,我们就可以在JS中编写css样式了!我们也可以模仿styled-components并实现一个简单的styled.aconststyled={a(stringProps,...getProps){constvarProps=getProps.map((f)=>f({})||'');conststyle=stringProps.reduce((prop,stringProp,i)=>{return(prop+stringProp+(i>=varProps.length?'':varProps[i]));},'')//删除注释andnewlines.replace(/(\n|(\/\*[\s\S]*?\*\/))/g,'')//删除空格.replace(/\s*?(?
