React的组件封装新规范,应该以HTML的结构树进行填写
公众号 傻梦兽IT有话说 欢迎大家进行一个关注,给我一点一点的小努力!
近一年的code review的工作中,需要制作一些高可用的业务场景组件。那我的首要工作当然也是要写高可用的组件库啦。
在这一段时间的工作里面,我发现一个问题,像我们这些中小企业来讲一般都是基于antd的组件进行开发。当然react也给出了一套自己的组件封装规范。 可重用的组件是什么样的?
我们以antd的modal组件为例子。按照antd的案例代码来演示。我们平时写代码的时候是怎么阅读的呢?大概是如下情况。 Return , , , ]} > Some contents...
Some contents...
Some contents...
Some contents...
Some contents...
复制代码
我们在进行抽象组件的时候,把很多的行为,使用参数的形式进行了传递,从而进行功能上的多态行为实现。 这么做的问题是什么呢?
有没有发现我们在阅读代码的时候,这种写法有点变扭?我们需要去看一个title的结构的时候是不知道这个组件是长什么样子的。或者footer的这些样子我们也需要进行文档的api查阅后才知道它是用来做什么!我们只有一个children阅读量比较可观。
在这里我比较期待看到的结果是类似html的结构数据。就类似下面的代码,可读性的同时,部分的ui我们也可以进行控制render。我们追随到bootstrap的modal。 Modal title
One fine body… 复制代码
这个时候我就在想,我们有没有方式把Modal变成以上的方式呢? Modal title
Some great contents of the modal 复制代码
但是,这并不是从代码量上看起来更复杂了。我们已将控制组件行为的能力赋予给了组件的使用者而不是创建者,这称为控制反转。它肯定比我们现有的 antd Modal 组件有更多的代码,但它更简单,更灵活,适合我们未来的用例,而且不会变得更加复杂。
例如,考虑这样一种情况:我们不想只渲染表单,而是想要渲染我们喜欢的任何内容。我们的 Modal 支持这一点,但 Modal 需要接受一个新的参数。或者,如果我们希望关闭按钮显示在内容的下方,该怎么办?我们需要一个名为 renderCloseBelow 的特殊参数。但是对于我们的 Modal,这显而易见可以轻松做到。你只需将 ModalCloseButton 组件移动到所需的位置即可。
更加灵活,更少的接口暴露。 创建我们的第一个复合组件
我们只需要使用到Context的一点点小修改即可完成我们的操作。 import * as React from "react" import VisuallyHidden from "@reach/visually-hidden" /* Here the Dialog and CircleButton is a custom component Dialog is nothing button some styles applied on reach-dialog component provided by @reach-ui */ import {Dialog, CircleButton} from "./lib" const ModalContext = React.createContext() //this helps in identifying the context while visualizing the component tree ModalContext.displayName = "ModalContext" function Modal(props) { const [isOpen, setIsOpen] = React.useState(false) return } function ModalDismissButton({children: child}) { const [, setIsOpen] = React.useContext(ModalContext) return React.cloneElement(child, { onClick: () => setIsOpen(false), }) } function ModalOpenButton({children: child}) { const [, setIsOpen] = React.useContext(ModalContext) return React.cloneElement(child, { onClick: () => setIsOpen(true), }) } function ModalContentsBase(props) { const [isOpen, setIsOpen] = React.useContext(ModalContext) return (
FaceTime即将推出降噪功能,但您现在就可以使用由于我们中的许多人都是在线交流而不是面对面交流,尤其是在工作中。2021年6月的WWDC2021中,Apple透露了即将在macOSMontereyiPhone15和iPadOS1
iCloud钥匙串有什么用?如何使用?iCloud钥匙串内置于每部iPhoneiPad和Mac设备中,是Apple为macOSiOS和iPadOS提供的安全密码管理器。该功能会保存您的密码,以便您可以快速轻松地登录网站
macOSMontereybeta3带来重新设计的Safari选项卡界面苹果在macOSMonterey和iOS15的前两个测试版中对Safari进行了重大更改。现在有了第三个测试版,苹果在听到那些测试该软件的人的批评后,在Safari设计上退了一步。
苹果在iOS15中取消了这22个有用的Siri集成苹果公司宣布,今年秋季iOS15发布后,所有新的和现有的操作系统版本将不再支持与苹果和第三方应用程序的大量Siri交互,这可能会引起用户和开发者的强烈反对。。此列表相当广泛,包括常
如何区分自己mac电脑的CUP型号2020年11月11日后,苹果发布的新版Mac电脑采用了M1芯片,此芯片为ARM平台,造成原先英特尔(Intel)CPU下的一些软件可能在M1芯片上无法运行!如何下载适合自己cup
全球第二!小米正式超越苹果今日凌晨,雷军发文称,第二季度全球手机市场占有率小米跻身全球第二,正式超越苹果。从Canalys发布的排名数据显示,三星仍然占据榜首,达19,小米的市占率达到17,同比增长83。而
如何解决M1Mac重新安装macOS时收到个性化错误在重新安装时,您可能会收到一条信息,提示在准备更新期间出现了错误。如果您抹掉了搭载AppleM1芯片的Mac,您可能无法通过macOS恢复功能重新安装macOS。系统可能会显示信息
如何高效使用Mac标签功能?你知道如何使用mac标签功能吗?刚开始使用Mac时,你是不是一脸懵逼,打开访达没有分区没有像Windows一样的文件路径,虽然可以在访达窗口的侧边栏,看到Mac默认的系统文件夹,文
如何更改PS中的键盘快捷键你知道如何更改Photoshop中的键盘快捷键吗?下面小编来教大家如何在Mac上更改Photoshop中的键盘快捷键以及如何将键盘快捷键重置为其默认值。在Photoshop中修改键
美知名电信运营商约5000万用户数据被泄露新网邮箱资讯近日,美国知名电信运营商TMobile承认,在8月初的一次数据泄露中,申请该公司信用卡的4000多万用户的姓名社会安全号码驾照或其他身份信息被泄露此外,780万每月付费
精品单词域名Monero。com以约205万出售新网域名资讯近日,精品单词域名Monero。com以316,250美元(折合人民币205万)的价格达成交易。据了解,Monero在英文中有门罗币之意,是当下流行的加密货币中的一种。