styled-components 背后的魔法
定义组件的风格为styled-components
const Button = styled.button`
background-color: papayawhip;
border-radius: 3px;
color: palevioletred;
`
这个Button变量现在是一个React组件,可以像其他React组件一样渲染!那么它是如果实现的?
模板字符串
事实证明,这个奇怪的 styled.button`` 符号实际上是 ES6中引入的一种名为 Tagged Template Literal(模板字符串) 的新功能。
从本质上讲, styled.button``和styled.button()都是调用一个函数,但当你传入参数以后,就会发现 我们不一样、不一样、不一样 !
那么让我们创建一个简单的函数来看看哪里不一样:
const logArgs = (...args) => console.log(...args)
您可以在控制台中执行代码查看结果
logArgs('a', 'b')
// -> a b
logArgs``
// -> [""]
logArgs`I like pizza`
// -> ["I like pizza"]
显而易见,正常调用输出的是一个字符串,而以模板字符串的方式调用输出的是一个数组。
那当我们传入字符串插值以后会发生什么呢?
const favoriteFood = 'pizza'
logArgs(`I like ${favoriteFood}.`)
// -> I like pizza.
logArgs`I like ${favoriteFood}.`
// -> ["I like ", "."] "pizza"
Amazing,我们得到了一个数组和一个字符串,第一个参数是被插值分割而生成的数组,第二个参数就是插值

那当我们传入函数时,又会怎样?
logArgs(`Test ${() => console.log('test')}`)
// -> Test () => console.log('test')
logArgs`Test ${() => console.log('test')}`
// -> ["Test", ""] () => console.log('test')
你应该猜到了第二行输出的是一个字符串,第五行是一个数组和一个真正的函数。
我们来验证一下
const execFuncArgs = (...args) => args.forEach(arg => {
if (typeof arg === 'function') {
arg()
}
})
execFuncArgs('a', 'b')
// -> undefined
execFuncArgs(() => { console.log('this is a function') })
// -> "this is a function"
execFuncArgs('a', () => { console.log('another one') })
// -> "another one"
execFuncArgs(`Hi, ${() => { console.log('Executed!') }}`)
// -> undefined
execFuncArgs`Hi, ${() => { console.log('Executed!') }}`
// -> "Executed!"
应用场景
以 Button 大小为例
const Button = styled.button`
font-size: ${props => props.primary ? '2em' : '1em'};
` // font-size: 2em;
<Button primary /> // font-size: 1em;
<Button />
Refers
- https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/template_strings
- https://mxstbr.blog/2016/11/styled-components-magic-explained/
styled-components 背后的魔法的更多相关文章
- styled components草根中文版文档
1.styled components官网网址 https://www.styled-components.com/docs 以组件的形式来写样式. 1.1安装 yarn add styled-c ...
- 009_python魔法函数
11. (译)Python魔法方法指南 原文: http://www.rafekettler.com/magicmethods.html 原作者: Rafe Kettler 翻译: hit9 原版(英 ...
- python之魔法方法介绍
1.1. 简介 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加“魔法”的特殊方法. 它们经常是两个下划线包围来命名的(比如 __init__ , __lt__ ) ...
- python_面向对象魔法方法指南
原文: http://www.rafekettler.com/magicmethods.html 原作者: Rafe Kettler 翻译: hit9 原版(英文版) Repo: https://gi ...
- (转)2019年 React 新手学习指南 – 从 React 学习线路图说开去
原文:https://www.html.cn/archives/10111 注:本文根据 React 开发者学习线路图(2018) 结构编写了很多新手如何学习 React 的建议.2019 年有标题党 ...
- 【转】组件化的Web王国
本文由 埃姆杰 翻译.未经许可,禁止转载!英文出处:Future Insights. 内容提要 使用许多独立组件构建应用程序的想法并不新鲜.Web Component的出现,是重新回顾基于组件的应用程 ...
- 6周学习计划,攻克JavaScript难关(React/Redux/ES6 etc.)
作者:余博伦链接:https://zhuanlan.zhihu.com/p/23412169来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 和大家一样,最近我也看了Jo ...
- 10 个 Redis 建议/技巧
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/145.html?1455790611 Redis 在当前的技术社区里是非常 ...
- 前端资讯周报 3.6 - 3.12: 对学习Javascript最有帮助的三本书,以及HTML标题的迷思
每周一我都会分享上一周我订阅的技术站点中,和解决问题的过程中阅读到的值得分享的文章. 毕竟个人的阅读量有限,也欢迎大家留言或者私信给我你们阅读到的,对你们前端技术有帮助的任何内容,题材不限,语言不限. ...
随机推荐
- IIS的地址指向
地址指向 1)AuthwebAPI 修改web.xml文件 <connectionStrings> data source 改成当前虚拟环境的IP指向 </connectionSt ...
- ajax基本用法介绍
使用ajax需要同时在模板中引用jQuery,ajax基本使用方法如下: $.ajax({ url:'url', type:'POST', data:{'k1':v1,'k2':v2,}, dataT ...
- Vue 组件&组件之间的通信 之 子组件向父组件传值
子组件向父组件传值:子组件通过$.emit()方法以事件形式向父组件发送消息传值: 使用步骤: 定义组件:现有自定义组件com-a.com-b,com-a是com-b的父组件: 准备获取数据:父组件c ...
- (转载)Unity3D所要知道的基础知识体系大纲,可以对照着学习,不定期更新
本文献给,想踏入3D游戏客户端开发的初学者. 毕业2年,去年开始9月开始转作手机游戏开发,从那时开始到现在一共面的游戏公司12家,其中知名的包括搜狐畅游.掌趣科技.蓝港在线.玩蟹科技.天神互动.乐元素 ...
- 举例理解JDK动态代理
JDK动态代理 说到java自带的动态代理api,肯定离不开反射.JDK的Proxy类实现动态代理最核心的方法: public static Object newProxyInstance(Class ...
- js原生实现抽奖活动(方形非圆盘)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 使用C#创建Windows服务 并发布Windows 服务
一.开发环境 操作系统:Windows 10 X64 开发环境:VS2015 编程语言:C# .NET版本:.NET Framework 4.0 目标平台:X86 二.创建Windows Servic ...
- Go语言库之strconv包(转载自--http://blog.csdn.net/alvine008/article/details/51283189)
golang strconv.ParseInt 是将字符串转换为数字的函数 func ParseInt(s string, base int, bitSize int) (i int64, err e ...
- python转义符
- java - 策略模式、状态模式、卫语句,避免多重if-else(转)
前言 当代码中出现多重if-else语句或者switch语句时.弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处 ...