范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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 ( setIsOpen(false)} {...props} /> ) } function ModalContents({title, children, ...props}) { return ( //we are making generic reusable component thus we allowed user custom styles //or any prop they want to override Close

{title}

{children}
) } export {Modal, ModalDismissButton, ModalOpenButton, ModalContents} 复制代码   在使用组件的过程中,我们就可以获取到一个完整的html结构树。 Login} /> 复制代码   ModalOpenButton的位置和布局你可以随意的放置,也不用去实现onClick: () => setIsOpen(true),;   当然如果你想让Button Loing 拥有onclick的事件的时候,可以参考这种思路 const callAll = (...fns) => (...args) => fns.forEach(fn => fn && fn(...args)) 复制代码   只需要把以上的代码修改成 function ModalOpenButton({children: child}) { const [, setIsOpen] = React.useContext(ModalContext) return React.cloneElement(child, { onClick: callAll(() => setIsOpen(true), child.props.onClick), }) } 复制代码 复制代码总结   不要匆忙地就进行组件的抽象,也不要把一切都留给参数。也许它现在是一个简单的组件,但你不知道将来需要实现哪些用例,不要认为这是时间和可维护性之间的权衡,复杂性可能会呈指数级增长。   在 React 发挥复合组件的优势,让你的生活更轻松。

FaceTime即将推出降噪功能,但您现在就可以使用由于我们中的许多人都是在线交流而不是面对面交流,尤其是在工作中。2021年6月的WWDC2021中,Apple透露了即将在macOSMontereyiPhone15和iPadOS1iCloud钥匙串有什么用?如何使用?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在英文中有门罗币之意,是当下流行的加密货币中的一种。
如何做公众号的引流呢?微信公众号,也就是微信公众平台。利用公众账号平台进行一对多的媒体性行为活动,如商家通过申请公众微信服务号通过二次开发展示商家微官网微会员微推送微支付微活动微报名微分享微名片等,现已2款电动汽车售价不到3万,性能出色能上牌,续航超过150公里纯电动乘用车技术条件征求意见稿(新国标)刚发布,因为低速电动车纳入微型电动车范畴得到了国家的承认。未来3万元左右的微型电动车市场必定会迎来一次大爆发。很多企业都看到了机会,提早推出都是高颜值旗舰,荣耀50对比vivoS10,谁更值得购买?对于智能手机,不同用户会有不同的需求,发烧友可能更看重配置和性能,但普通人的首要目标是足够好看,拥有出色的手感,所以线下市场和线上市场,往往受欢迎的机型会大相径庭,那么今天就来聊聊华为Mate40的特殊屏幕的设计,真的符合年轻人风格在机身后部,华为Mate40系列依然采用类似Mate30系列的圆形摄像头设计,三款手机的占用空间比一个大,提交的专利草图显示,这一专利技术是由华为Mate30Pro实现的,四摄像头简约美学实力出色三星GalaxyTabS7FEWiFi版火热预定中作为安卓大屏平板的标杆产品,三星GalaxyTabS7FE自推出以来就秉持专为便携沉浸娱乐与高效办公设计的初衷,以标志性大屏,自然的书写体验与强悍多任务处理能力,为用户带来诸多优秀最便宜的三星旗舰10月发售,GalaxyS21FE或只卖4000?去年,三星推出了基于S20系列打造的廉价版小屏旗舰GalaxyS20FE,获得了不错的市场表现,这也是三星首次为旗舰系列推出廉价机型,由于核心配置保持旗舰配置,且更加轻薄售价更低,未来iPadPro黑科技曝光,iPadmini5让路新机跌至谷底价由于自研的苹果SiliconM1芯片的性能规格可与竞品桌面产品相媲美,未来苹果可能会发现更多的应用场景,可以发挥iPadProM1的性能潜力。多年来,这家库比蒂诺科技巨头一直在吹捧OPPO新科技黑腹大将金九银十的网络上,数码圈连续出新品,网络上也是出现了很多爆料新产品的文章。作为一线手机厂商,OPPO经常公开各种有趣的黑科技,正如最近消息,OPPO可变色眼镜专利被曝光,造型十分高为什么全球科技巨头,都抢着把服务器放在贵州?到底有啥好处呢?我国的国货之光华为公司,为建设七星湖云端中心,在贵州选址后,最终挖空一座大山来建设天然散热的机房,存放大量的终端服务器,工程简直令人叹为观止。国内大型网络公司比如百度腾讯京东购物移快递女王22岁丧夫又改嫁司机,她凭啥能在马云那套现146亿有这么一个女人,年幼丧父。青年和丈夫创业,可22岁时,丈夫意外身亡。公司一批男人均不服她,自立门户。可她硬生生将飘零的公司扛起来,她就是申通的创始人陈小英。在申通的低谷时期,她壮大虚拟货币业务被定性为非法金融活动,比特币,以太坊加速暴跌关注时事热点,传播观点价值,今天,木子带你看世界。据人民网9月24日下午报道,央行,银保监会外汇局等十部委发布了关于进一步防范和处置虚拟货币交易炒作风险的通知。通知指出,比特币超话