1.ä¸çå°±ä¼çè¶
å®ç¨å°ç»ä»¶ä¹LoadingButton
2.Antd源码浅析之Icon组件
3.读读antd源码之通用组件
4.antd的源码config-overrides.js组合配置问题
5.antd 中 Form 表单的使用
ä¸çå°±ä¼çè¶ å®ç¨å°ç»ä»¶ä¹LoadingButton
ç»ä»¶èæ¯
å¨å¹³æ¶çå·¥ä½ä¸ï¼ç»å¸¸ä¼éå°ä¸ä¸ªåºæ¯ï¼
ç¹å»æé®æ¶è¯·æ±ä¸äºæ¥å£æ°æ®ï¼è为äºé¿å ç¨æ·éå¤çç¹å»æ们é常ä¼ä¸ºè¿äºæé®æ·»å loadingãè¿ä¸ªæ·»å loadingçåè½æ¬èº«æ¶é常ç®åçï¼åªè¦æ们å®ä¹ä¸ä¸ªåé使ç¨å¨Buttonç»ä»¶ä¸å³å¯ï¼ä½å¨ååå°ç®¡ç类项ç®æ¶ï¼è¿æ ·çæé®å¯è½ä¼æé常é常å¤ï¼å¯è½ä¸ä¸ªç»ä»¶ä¸ï¼å¾å¤åéé½æ¯xxx_loadingï¼èæ¶èååä¸å¤ä¼é ãæ¥ä¸æ¥ï¼æ们对Buttonç»ä»¶åä¸ä¸ªç®åçå°è£ æ¥è§£å³è¿ä¸ªèæ¶èååä¸å¤ä¼é çloadingé®é¢
çµææ¥æºæ们å¨ä½¿ç¨AntdçModal对è¯æ¡æ¶ï¼å½æ们çonOk为å¼æ¥å½æ°æ¶ï¼æ¤æ¶Modalçç¡®å®æé®ä¼èªå¨æ·»å loadingææï¼å¨å½æ°æ§è¡å®æåå ³éå¼¹çªï¼å°±åè¿æ ·ï¼æ¤æ¶ï¼ä»£ç å¦ä¸ï¼
asyncFunc(){ returnnewPromise(resolve=>{ setTimeout(()=>{ resolve()},)})},handleTestModal(){ constthat=thisthis.$confirm({ title:'æµè¯å¼æ¥å½æ°',content:'å¼æ¥å½æ°å»¶è¿ä¸¤ç§ç»æ',asynconOk(){ awaitthat.asyncFunc()}})},çå°è¿ç§ææåï¼å°±æ³å°ï¼å¦æå¯ä»¥å°è£ ä¸ä¸ªButtonç»ä»¶ï¼å°éè¦æ§è¡çå½æ°ä¼ å ¥ï¼ç»ä»¶ä¸èªå¨æ ¹æ®å½æ°æ§è¡æ åµæ·»å loadingææå²ä¸æ¯é常çæ¹ä¾¿ã
å®ç°LoadingButtonå®ä¹ç»ä»¶åæ°è¿è¾¹å°±å®ä¹å 个大家ä¼å¸¸ç¨å°çåæ°ï¼text(æé®æå)ãtype(æé®ç±»å)ãasyncFunc(æé®ç¹å»æ¶æ§è¡çå¼æ¥å½æ°)ãdelay(loading延è¿)ï¼å¦å¤ï¼è¿éè¦ä¸ä¸ªç»ä»¶å é¨çloadingåéæ¥æ§å¶æ们Buttonç»ä»¶çç¶æï¼ä»£ç å¦ä¸ï¼
exportdefault{ data(){ return{ loading:false}},props:{ text:{ type:String,default:'ç¡®å®'},type:{ type:String,default:'primary'},delay:{ type:Number,default:0},asyncFunc:{ type:Function,default:()=>{ }}},}使ç¨antdä¸çButtonç»ä»¶è¿è¡äºæ¬¡å°è£å¨æ们çèªå®ä¹LoadingButtonç»ä»¶ä¸ï¼å°ä¸é¢å®ä¹çåæ°ä½¿ç¨èµ·æ¥ï¼å¹¶ç»å®ä¸ä¸ªclickäºä»¶ï¼ä»£ç å¦ä¸ï¼
<template><Button:type="type":loading="loading"@click="handleClick">{ { text}}</Button></template><script>import{ Button}from'ant-design-vue'exportdefault{ components:{ Button},methods:{ handleClick(){ }}}</script>å¤æå¼æ¥å½æ°asyncFuncè¿ä¸é¨å为æ´ä¸ªç»ä»¶æéè¦çä¸ä¸ªé¨åï¼å³æ们å¦ä½å»å¤æä¼ å ¥çå½æ°æ¯å¼æ¥å½æ°ï¼å½æä»¬ä¼ å ¥çasyncFuncå½æ°æ¯å¼æ¥å½æ°æ¶ï¼ç»ä»¶æéè¦æ·»å loadingçå¨ç»ï¼é£ä¹æ们åºè¯¥å¦ä½å»å¤æä¸ä¸ªå½æ°æ¯å¦ä¸ºå¼æ¥å½æ°å¢ï¼
åèantdæ¯å¦ä½å®ç°çï¼ä¸é¢æ们åä»ç»äºantdçModal对è¯æ¡ä¸æ类似çé»è¾ï¼é£ä¹ä¸å¦¨å»é 读ä¸ä¸è¿é¨åç¸å ³çæºç ï¼çä¸antdçå®ç°æ¹å¼ï¼
//components/modal/ActionButton.jsxonClick(){ const{ actionFn,closeModal}=this;if(actionFn){ letret;if(actionFn.length){ ret=actionFn(closeModal);}else{ ret=actionFn();if(!ret){ closeModal();}}if(ret&&ret.then){ this.setState({ loading:true});ret.then((...args)=>{ //It'sunnecessarytosetloading=false,fortheModalwillbeunmountedafterclose.//this.setState({ loading:false});closeModal(...args);},e=>{ //Emiterrorwhencatchpromisereject//eslint-disable-next-lineno-consoleconsole.error(e);//See:/post/Antd源码浅析之Icon组件
在进行B端项目开发时,我使用了Ant Design,源码其简洁优雅的源码设计深受喜爱。为了更好地理解其内部机制,源码我打算浅析Ant Design的源码Icon组件,尽管技术基础有限,源码张科公式源码但仍希望能有所收获。源码本文主要针对Ant Design 3.4.4 的源码源码进行分析,前提是源码你对JavaScript、React有一定了解。源码Antd定位为企业级产品的源码设计体系,适用于构建后台页面,源码比如CMS系统,源码它在React的源码世界里,就像Bootstrap与jQuery的源码对应关系,Vue也有Element UI这样的伴侣。
Antd源码基于TypeScript,一种JavaScript的类型超集,由微软开发,android popupwindow 源码用于进行静态类型检查,比如Vue使用Flow。JavaScript虽为弱类型,但大型库如Antd选择严谨,采用TypeScript或Flow。
打开Antd的源码目录,组件结构清晰,Icon组件位于components文件夹内。组件文档详细,包括英文说明,可在官网查看。接下来,我们将深入核心代码,index.tsx是关键文件,它使用了Typescript的jsx语法,最终编译为.js文件。
在index.tsx中,可以看到Icon组件的web象棋源码定义,包括参数如spin(旋转动画)、style(样式)和type(图标类型)。官网还提供了示例和API描述,如spin参数默认为false,style为对象,type为字符串。
代码中,Antd引入了classnames处理动态CSS,omit.js则用于过滤不需要传递的属性。IconProps是参数校验器,确保接收数据有效,Antd采用TypeScript替代React的PropTypes进行类型检查。
主体代码中,Antd使用了标签实现Icon,首先通过IconProps验证参数,然后根据传入的type动态生成CSS类名。最后,通过omit函数过滤掉type和spin,2019拜年源码因为它们在HTML标签中无意义。通过一个实例,我们可以看到生成的HTML代码。
总结来说,Antd的Icon组件实现原理清晰,虽然涉及TypeScript的使用可能对部分读者来说是个新概念,但其实质是数据类型校验。通过这个过程,我们可以学习到如何利用TypeScript来增强代码的类型安全性和可维护性。
读读antd源码之通用组件
ui组件库在ui开发框架中扮演着类似模具的角色,极大地提升了生产效率。无论是设计风格、基础功能还是操作交互,ui组件库都进行了高度统一,为项目开发提供了开箱即用的便捷。在React领域,中后台项目常用到的ui组件库,非Ant Design(antd)莫属。抄源码兼职
本文将分享antd组件库的源码,探讨我们习以为常的功能背后的逻辑处理。在阅读过程中,将遵循《阅读前端源码的思路》,文章将直接分享重点,忽略具体细节。
一个没有设计理念的ui组件库,都不好意思称作ui组件库。官方文档中,第一个栏目就是“设计”,可见设计是ui组件库的灵魂,它包含了自身的价值观和模式,并遵循一系列规范。本文将先分享阅读的第1个,通用组件的源码。
通用组件包含三个:Button、Icon、Typography。关于这些组件,我们可以从官方文档中看到一些值得思考的功能。例如,Button的点击动作反馈,Icon的内部图标封装,Typography的文本处理或功能封装等。
antd的组件源码相对混乱,但我们可以从中找到一些有趣的点。例如,Button组件中关于按钮文字是两个汉字时插入空格的逻辑,以及内容劫持的过程。Wave组件的实现主要涉及到transition和animation,其中onClick方法的关键在于updateCSS方法,它动态添加样式,并添加transition和animation。
Icon组件则被搬到了@ant-design/icons库中实现,主要是一些样式、事件和图标引用的处理。Typography组件则提供了一系列文本样式的内容,其中文本拷贝使用了copy-to-clipboard库,文本溢出处理则通过Ellipsis组件实现。
本文对antd源码之通用组件的探讨就到这里,希望能帮助你更好地理解这些组件的内部逻辑。
antd的config-overrides.js组合配置问题
在进行React项目开发时,我遇到了一个关于Ant Design配置的问题。项目中原本的icon元素在引入Ant Design后出现了空白现象,这让我感到疑惑。经过一番排查,我发现这是在引入Ant Design的`config-overrides.js`文件后,导致了原本的icon配置被覆盖。
在未引入Ant Design时,项目的配置文件是这样的:
引入Ant Design后,配置文件出现了变化,这可能是`config-overrides.js`文件中对某些配置进行了调整,导致原本的icon配置失效。
了解到`config-overrides.js`文件会覆盖原有的webpack配置后,我开始思考如何解决这个问题。经过多次尝试,我找到了一个解决方案——将原本额外配置的webpack.config.js内容整合到`config-overrides.js`中。
为了实现这一目标,我将原本的webpack配置记录整理,并将其内容整合进`config-overrides.js`中,以确保不会被覆盖。以下是我整合后的配置源码:
(具体整合后的配置源码)
通过将额外配置的webpack.config.js内容写入`config-overrides.js`中,问题得以解决,最终实现了组合配置成功的目标。
antd 中 Form 表单的使用
本文主要介绍在使用 Ant Design (antd) 中的 Form 表单组件时的常见问题以及对源码的研究分析。
在创建 Form 组件时,会通过 `useForm` 钩子生成对应的 FormStore 类对象,并返回一个 FormInstance 对象。FormStore 的 store 对象则作为表单数据的唯一数据源,包含所有已命名表单组件的值。
使用 `useForm` 获得的 FormInstance 对象能够与表单组件内的 Input 组件互动。当输入框内容发生变化时,通过 `form.getFieldsValue(true)` 或 `onFinish` 事件,可以获取输入的 id 或 name 值。实现机制上,antd 选择在创建表单元素时定义并传入 `value` 和 `onChange` 属性,这样在组件值发生变化时,可以同步更新 store。
当遇到特定问题,如如何获取表单值、如何传递 FormInstance 对象给子组件、如何监听表单值的变化等,可以利用 antd 提供的 `Form.useFormInstance` 方法简化传值,`Form.useWatch` 方法获取表单值并触发组件刷新。监听表单值变化时,需注意区分与获取表单值的差别,避免复杂的逻辑编写。
在使用 Form.Item 时,有时会遇到其不支持传入数组子组件的问题,这是因为 Form.Item 会重置子组件的属性,包括 `value` 和 `onChange`。为解决此需求,可以将子组件数组封装成一个单个组件,并代理其属性,使 Form.Item 看似一个具有 `value` 和 `onChange` 的表单组件。
以上内容是通过分析 antd 中 Form 表单组件的源码,以及在实际开发中遇到的问题,总结出的关键点与解决方案。通过了解这些细节,可以更有效地使用 Form 表单组件,避免常见错误,提高开发效率。