热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(续)Cssinjs一次实践

前言在上一章cssinjs一次实践中的末尾留了三个彩蛋:1、styled.div&styled(div)有什么区别2、模版字符串中的样式是怎么解析的?为

前言

在上一章css in js 一次实践中的末尾留了三个彩蛋:

1、styled.div & styled('div') 有什么区别

2、模版字符串中的样式是怎么解析的?为什么可以嵌套?

3、为什么会返回一个组件?

本章就从源码来简单解释一下。

第一个问题

先看包里的package.json,找到main字段

按照这个路径去找入口,并没有找到,如果有哪位小伙伴找到了,记得和我说一下。 既然主入口没找到,那就去src下面的index里找找看
进入这个文件,源码是

// @flow
import type { Target } from '../types'
import domElements from '../utils/domElements'export default (styledComponent: Function, constructWithOptions: Function) => {const styled = (tag: Target) => constructWithOptions(styledComponent, tag)// Shorthands for all valid HTML ElementsdomElements.forEach(domElement => {styled[domElement] = styled(domElement)})return styled
}

可以看到&#xff0c;函数内定义了一个styled函数&#xff0c;接收一个Target类型的参数&#xff0c;这个Target类型定义是export type Target &#61; string | ComponentType<*>,而这个ComponentType就是从react包里导出的

type ComponentType

&#61; ComponentClass

| FunctionComponent

;

对应了React中两种组件的定义方式&#xff08;类定义和纯函数定义&#xff09;。接着看&#xff0c;注释上说

对所有有效的html元素建立快捷键,这个docElements里定一个所有的html元素&#xff0c;遍

历这个docElements元素&#xff0c;将html元素添加为styled对象的属性。至于这句

styled(domElement)

大家别忘了上面Target的类型定义里前面还可以接收一个string类型参数。至此&#xff0c;

第一个问题解决&#xff0c;styled.div 和 styled(&#39;div&#39;)没有任何区别&#xff0c;styled.div只是style(&#39;div&#39;)的

快捷方式&#xff0c;但是 style.形式的使用只支持html元素&#xff0c;对React组件不适用&#xff0c;

所以&#xff0c;在为组件定义样式的时候还是使用styled(ReactComponent)。

第二个问题

ES6里标签模版的形式&#xff0c;函数即标签&#xff0c;模版紧跟在标签后面作为标签的参数&#xff0c;也就是styled.div后面的模版字符串里的内容作为style.div函数的参数调用。 具体关于模版字符串的内容请参考阮一峰的ES6模版字符串

关于styled解决css嵌套问题,先贴一下css.js的代码&#xff1a;

// &#64;flow
import interleave from &#39;../utils/interleave&#39;
import isPlainObject from &#39;../utils/isPlainObject&#39;
import { EMPTY_ARRAY } from &#39;../utils/empties&#39;
import flatten from &#39;../utils/flatten&#39;
import type { Interpolation, RuleSet, Styles } from &#39;../types&#39;export default (styles: Styles,...interpolations: Array
): RuleSet &#61;> {if (typeof styles &#61;&#61;&#61; &#39;function&#39; || isPlainObject(styles)) {// $FlowFixMereturn flatten(interleave(EMPTY_ARRAY, [styles, ...interpolations]))}// $FlowFixMereturn flatten(interleave(styles, interpolations))
}

css这个函数是作为一个参数供style对象调用的&#xff0c;因为之间的关系太深&#xff0c;没办法贴出来&#xff0c;有兴趣的小伙伴可以自己去看一下。

可以看到css.js返回了一个flatten函数&#xff0c;字面意思是拉伸、变平。这个函数的作用就是把嵌套的css变为一层&#xff0c;Array.flat()函数。

第三个问题

其实第三个问题大家应该都能想到&#xff0c;没错&#xff0c;就是HOC(高阶组件),利用高阶组件的Prop将style传递给children&#xff0c;类似于这种&#xff1a;

const StyledComponent &#61; (options) &#61;> (Target) &#61;> {return class extends React.Component{static displayName &#61; ...(styled.Target)render(){const {styles} &#61; options;const props &#61; Object.assign({},this.props,{style:styles})return }}}

结尾

时间仓促&#xff0c;并没有将这个包很详细的讲一下&#xff08;其实我不会。。。&#xff09;&#xff0c;这个包里还有很多很好玩的东西&#xff0c;比如观察者模式、发布订阅模式、once函数、curry函数等等。写这篇的主要目的就是想要看看一个包是怎么实现的&#xff0c;它里面用到的思想和技巧能够对我们产生很大的启发&#xff0c;所以我建议小伙伴们在使用一个第三方的时候尽可能的去看看人家是怎么实现的&#xff1f;为什么这么实现&#xff1f;这能快速提高我们的思维方式和coding能力。

最后&#xff0c;如果我有写的不对的地方&#xff0c;欢迎指正&#xff0c;谢谢。

祝生活愉快。

转:https://juejin.im/post/5c2cd6776fb9a049a62cb1d1



推荐阅读
  • 深入浅出 webpack 系列(二):实现 PostCSS 代码的编译与优化
    在前一篇文章中,我们探讨了如何通过基础配置使 Webpack 完成 ES6 代码的编译。本文将深入讲解如何利用 Webpack 实现 PostCSS 代码的编译与优化,包括配置相关插件和加载器,以提升开发效率和代码质量。我们将详细介绍每个步骤,并提供实用示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 如何使用ES6语法编写Webpack配置文件? ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 在处理木偶评估函数时,我发现可以顺利传递本机对象(如字符串、列表和数字),但每当尝试将JSHandle或ElementHandle作为参数传递时,函数会拒绝接受这些对象。这可能是由于这些句柄对象的特殊性质导致的,建议在使用时进行适当的转换或封装,以确保函数能够正确处理。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
author-avatar
帕皮丝汀阿奎莱拉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有