1.tolua源码分析(五)lua使用C#的enum
2.最新的QQ空间物品代码
3.跪求QQ空间最新代码
4.phpwindådiscuzåªä¸ªå¥½
5.没写过复杂 React 组件?来实现下 AntD 的 Space 组件吧
tolua源码分析(五)lua使用C#的enum
探讨了C#枚举如何在Lua中注册以及与普通类的注册区别。以官方提供的例子为例,展示了如何将C#的UnityEngine.Space类型的枚举推送到Lua层,并在Lua层面测试了诸如tostring、ToInt、Equals等接口,cp套利源码验证了在Lua层可以进行枚举的相等判断,以及将int转换为枚举或将枚举转换为int的操作。
在Lua层面表示C#的枚举,例子中在第行和第行将枚举推送到Lua层。由于枚举是值类型,C#层使用了enumMap缓存装箱后的object与枚举的映射关系。注册到Lua层的枚举类使用了EnumMetatable。
具体来看C#枚举注册到Lua的方法,例如在System_EnumWrap.Register方法中。在Lua层表示C#枚举的方式与普通类相似,但需要注意一些区别。
例如,当使用__tostring方法时,ToLua.ToObject将Lua栈上的userdata转换为object,通过userdata的index查找C#的object缓存,不会产生垃圾收集(GC)。同样地,ToInt方法中的CheckObject同样在C#的object缓存中查找,执行类型检查,也不会产生GC。
当比较C#的github fabric源码枚举与int类型时,由于使用了==操作符,这会触发装箱,产生一次GC。因此,在实际使用中应尽量避免在Lua层对C#枚举与number进行比较。而在Lua层直接比较两个C#枚举时,它们在Lua层被视为同一份userdata,因为它们来自于同一个C#缓存,index相同。
在将Lua栈上的number转换为C#枚举的实例时,IntToEnum方法在C#的UnityEngine_SpaceWrap类中实现。这个方法直接将double转换为int,再转换为UnityEngine.Space类型,避免了GC。在C#层推送到Lua层的枚举时,是从C#的缓存中取到枚举对应的object,然后推送到Lua层,也不会产生GC。
总结,在Lua使用C#的枚举时,从C#到Lua层的传递不会产生GC,在Lua层进行number与枚举类型之间的转换以及直接比较枚举时不触发GC。然而,当比较枚举与number时,会触发一次GC。针对这一情况,时尚头像源码可以进行针对性优化。
下一节将深入研究在开发中常见的C#委托/事件如何注册到Lua函数的实现。
最新的QQ空间物品代码
不是所有的额都能免费的.很多都是代码做的。
4.0空间强行删除自定义横幅代码:
javascript:window.top.space_addItem(,,0,0,0,0,1)
飘浮物反飘代码:
javascript:window.top.space_addItem(5,,0,3,0,0,);
5级植物新代码:
javascript:window.top.space_addItem(7,,0,0,0,1,0);
5极植物老代码:
javascript:visitCountCallBack({ "visitcount":,"dayvisit":,"spacemark":0,"markchange":0,"sun":,"love":,"rain":,"nutri":,"level":5,"gardener":5});
模块动起来代码:
javascript:R=0; x1=.1; y1=.; x2=.; y2=.; x3=1.6; y3=.; x4=; y4=; x5=; y5=; DI=document.images; DIL=DI.length; function A(){ for(i=0; i-DIL; i++){ DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=Math.sin(R*x1+i*x2+x3)*x4+x5; DIS.top=Math.cos(R*y1+i*y2+y3)*y4+y5}R++}setInterval('A()',5); void(0);
用导航做开场代码:(3款)
javascript:window.top.space_addItem(,,0,0,,,0);
javascript:window.top.space_addItem(,,0,0,,,0);
javascript:window.top.space_addItem(,,0,0,,,0);
用彩蛋做开场代码:
javascript:window.top.space_addItem(,,0,0,,,2);
用金猪畅响做开场代码:
javascript:window.top.space_addItem(,,0,0,,,0);
用blue免费播放器做开场代码:
javascript:window.top.space_addItem(,,0,0,,,0);
用4.0勋章做开场代码:(前提:要有4.0勋章)
javascript:window.top.space_addItem(,,0,0,,,0);
健康快乐挂件代码:
javascript:window.top.space_addItem(,,0,0,,,0);
俺是有钱人挂件代码:
javascript:window.top.space_addItem(,,0,0,,,0);
金牛座挂件代码:
javascript:window.top.space_addItem(,,0,0,,,0);
在横幅上刷人生果代码:(前提:花匠学徒以上的4.0空间)
javascript:window.top.space_addItem(,,0,0,,,0);
解释:
javascript:window.top.space_addItem(,人生果编号,0,0,,,0);
皮肤做挂件代码 :(黄钻用户可以任意修改物品编号任意装扮)
javascript:window.top.space_addItem(,皮肤编号,0,0,,,0);
皮肤做挂件代码 :(非黄钻用户可用5款)
夜光 javascript:window.top.space_addItem(,,0,0,,,0);
如此的 javascript:window.top.space_addItem(,,0,0,,,0);
幸福的故事 javascript:window.top.space_addItem(,,0,0,,,0);
最美的花 javascript:window.top.space_addItem(,,0,0,,,0);
那年的歌 javascript:window.top.space_addItem(,,0,0,,,0);
大家看了这么多也应该明白些道理了吧.聪明人一看就明白.其实只要修改一下物品的编号.
就可以通过代码来实现任意装扮了.所以我就不再浪费时间了.有兴趣的朋友完全可以自己去研究..
以上的代码用法:打开自己的空间把上面的代码复制下来直接打在空间地址栏上面按回车键就可以看到效果了.
对了.忘了再补充一些代码:
查看网页源代码: (包括QQ空间)
javascript:s=document.documentElement.outerHTML;document.write('<body></body>');document.body.innerText=s;
查看QQ空间加密相册首张照片地址:
/Article/image/Index.html
QQ空间FLASH模块
/Article/flash/Index.html
个性签名图/互踩/闪字
.com/piao.htm点进去把FLSAH的地址拿出来就可以直接用了!~
想转载某个QQ空间里的网络音乐,可提示是:对不起,音乐盒的主人不允许转载该歌曲...咋办?
简单!!你直需进入
.com/color-QQ彩色日志生成工具-Qchong_Com.htm
不知道这个对你有没有帮助!
跪求QQ空间最新代码
4.0空间强行自定义代码
4.0空间强行删除自定义横幅代码:
javascript:window.top.space_addItem(,,0,0,,,0);
皮肤做挂件代码 :(黄钻用户可以任意修改物品编号任意装扮)
javascript:window.top.space_addItem(,皮肤编号,0,0,,,0);
皮肤做挂件代码 :(非黄钻用户可用5款)
夜光 javascript:window.top.space_addItem(,,0,0,,,0);
如此的 javascript:window.top.space_addItem(,,0,0,,,0);
幸福的故事 javascript:window.top.space_addItem(,,0,0,,,0);
最美的花 javascript:window.top.space_addItem(,,0,0,,,0);
那年的歌 javascript:window.top.space_addItem(,,0,0,,,0);
大家看了这么多也应该明白些道理了吧.聪明人一看就明白.其实只要修改一下物品的编号.
就可以通过代码来实现任意装扮了.所以我就不再浪费时间了.有兴趣的朋友完全可以自己去研究..
对了.忘了再补充一些代码:
查看网页源代码: (包括QQ空间)
javascript:s=document.documentElement.outerHTML;document.write('<body></body>');document.body.innerText=s;
查看QQ空间加密相册首张照片地址:
更多技术到:/duguqiuhuai或空间学习//
phpwindådiscuzåªä¸ªå¥½
discuz!ï¼ç®ç§°dzï¼åphpwindï¼ç®ç§°pwï¼æ¯å½å æèåç两个PHP论åç³»ç»ï¼éçå®ä»¬ç¸ç»§å®£å¸å¼æºä»¥åï¼å¨åæ¹é¢ï¼ä¸ç®¡ææ¯ä¸ï¼è¿æ¯åè½ä¸ï¼è¿æ¯çé¢ä¸ï¼é½æäºé¿è¶³çåå±ï¼å£°å¨å¤§æ¯ï¼è¿éå½å¤é£äºåè½ç®åççµåå ¬åæ¿ç³»ç»å¯æ¯äºãå ¶é æçä¸ä¸ªå¯ä½ç¨æ¯å¤§å¤§å¸¦å¨äºPHPå¨å½å çæ®åï¼æ¬äººå°±æ¯å¨å¯»æ¾åéç论åç¨åºçæ¶åï¼æå¼å§å ³æ³¨PHPï¼è¿èä¸è½èªæç ï¼ã
客è§ç说ï¼ç®åçpwådzåæçé¿ï¼å ¶äºç¸ä¹é´çæ¿çç«äºåºè¯¥è¯´æé«äºPHP论åçæ°´å¹³ï¼å¨åè½ä¸ä¸ä» 赶ä¸äºä»¥åè½å¤åæ¼æ´å¤èè称çå¨ç½è®ºåï¼èä¸å 为å®ä»¬çæçåé度è¿è¿è¶ è¿å¨ç½ï¼å¼çå¨ç½å¸åºå¤§å¤§è缩ï¼åæ¥çä¸äºå¨ç½è®ºåé½çº·çº·è½¬æ¢æäºdzæè pwï¼æçå¨ç½é½ä¸å¾ä¸å¼å§å¼PHP论åäºã
è¦è¯´ä»ä»¬åªä¸ªæ´å¥½ï¼æ¯æ¯è¾é¾çäºæ ï¼æ¯ç«åæçé¿ï¼ä¿ºä¹ä¸æ¢å¨è¿éå¦ä¸ç»è®ºãä¸è¿ä»å¸åºä»½é¢åç½ä¸çè¨è®ºæ¥çï¼ç®ådzè¿æ¯ç¥å ä¸é£çï¼èä¸å»å¹´å½å 好å 个ç¥åç大论åé½è½¬æ¢æäºdzï¼æ¯å¦å¤å°ç½ãç§æãtompdaçï¼ï¼èpwå¨å¤§ç½ç«æ¹é¢æ¶è·çå°ã
ä½æ¯æ¯ç«å¯¹å¥½å¤æ°ææ¥è¯´ï¼ä»ä»¬é½è¦é¢ä¸´ä¸ä¸ªéæ©è®ºåç¨åºçé®é¢ï¼å æ¤ï¼dzåpwåªä¸ªæ´å¥½ï¼ä¹å°±æäºç»å¸¸è¢«é®çé®é¢ï¼è¿ç§æ²¡æçæ¡çé®é¢ï¼èªç¶è¦è¢«åå¤é®èµ·ãæ¬æè¯å¾ä»æ¯è¾æ·±çå±æ¬¡æ¥åæ两个论åçä¼å£ï¼ä¸ºæ°ææä¾éæ©çåèãå¦æéè°¬ä¹å¤ï¼æ¬¢è¿æ¹è¯ææ£ã
ä¸ãçé¢ç¯
é¦å ï¼ä»çé¢ä¸è¯´ï¼ä»æ´ä½ä¸è¯´ï¼dzççé¢æ¯è¾ç¾è§ï¼æ´ä½æ好ã
pwççé¢ç»äººä¸ç§æ¨¡ä»¿dzçæè§ãåæ¶å¨çé¢çç»èä¸ï¼çèµ·æ¥pwè¿æ¯æ²¡ædzå®ç¾ã
äºãææ¯ç¯
ä»ææ¯ä¸è¯´ï¼pwådzé½ä½¿ç¨äºæ件æ¹å¼çæ°æ®ç¼åææ¯ï¼éè¿æ常ç¨çæ°æ®è¡¨ï¼æ¯å¦è®ºåçé¢è®¾ç½®åæ°ãåºæ¬åæ°çï¼çæéæç¼åæ件ï¼æ ¹æ®æ¡ä»¶è§¦åæ´æ°æè æå¨æ´æ°ï¼ï¼æ¥åå°æ°æ®åºè¯»å次æ°ï¼æé«æçï¼å¨è¿ä¸ªæ¹é¢ä¸¤è é常ç¸ä¼¼ã
1ã模çææ¯
ä»æ¨¡çææ¯ä¸è¯´ï¼dzä»2.5fçå°±å¼å§éç¨çè¿ç§éæ模çææ¯ï¼ä»ä¿ºä¸ªäººè§åº¦ä¸è¯´ï¼è¿æ¯é常éå论åè¿ç§é¢ç¹æ´æ°çç½ç«ç¨åºä½¿ç¨çãå®éè¿å¨æçæéæ模ççæ¹å¼ï¼è§£å³äºæ¨¡ç解ææççé®é¢ã
åæ¶ï¼dzçè¿ç§æ¨¡çæ¹å¼ï¼ä½¿å¾ä¿®æ¹çé¢ä¹æ¯è¾å®¹æï¼å¾ç´è§ã
èpw使ç¨echoè¯å¥çè¿ç§æ¹å¼ï¼å§ä¸ç§°å ¶ä¸ºæ¨¡çï¼ï¼å°±å¯ç¢å¤äºï¼è¦å¢å äºä¸ä¸ªifå¤ææ¡ä»¶ï¼å°±è¦æè ¾å天ãæ·»å äºæ··åPHP代ç ç模æ¿ï¼å¨ dreamweaverä¸ä¹å®¹æ被误æä½å é¤ãç¹å«æ¯å¦æä¿®æ¹çæ¶åç¨æä¸æ ï¼å¾å¯è½ä¼ä½¿ç½é¡µæäºç½æ¿ï¼æ²¡æè¾åºï¼ï¼è®©ä¿ºæ¯æ¬¡ä¿®æ¹pw模çæ ä¸å¦å±¥èå°ï¼ææå ¢å ¢ããããææè¿ä¹æ¯ç¬¬ä¸æ¹æ¨¡çä¸ï¼dzè¿è¿å¤äºpwçåå å§ã
ä¸è¿pwç®åå¨æ¨¡çä¸ä¹å¨æ¹è¿ï¼ç°å¨çverycms 3.0就已ç»å¼å§ä½¿ç¨çæ£ç模çææ¯ï¼ä¸è¿ç®åç¨çé½è¿æ¯è¾å级ããã
2ãé度é®é¢
ä»æ¨¡çä¸çï¼ä¸¤è çæçåºè¯¥æ¯å·®ä¸å¤çï¼pwç模çå ¶å®å°±æ¯ç´æ¥å å«çæ··åäºPHPè¯å¥çä¸é¨åPHPæ件ï¼èdzç模çå¹³æ¶å¹¶ä¸éè¦è§£æï¼æ以æçåºè¯¥æ¯å·®ä¸å¤çï¼ä½æ¯ç½ä¸æ»æ¯æ人声称ç½ç«ä½¿ç¨dzçé度æ¯pwæ ¢ï¼è¿æ¹é¢æ¬äººæ²¡ææµè¯è¿ï¼ä¸æ¢å¦ä½è¯è®ºãèä¸ç½ç«è®¿é®é度è¿æ¯è¦åå¾å¤å ç´ çå½±åï¼æ¯å¦ï¼æ¬å°ç½éãæå¡å¨å¸¦å®½ãå¿çããããã客è§çè¯ä»·è¿æ¯å¾é¾çï¼é¤é使ç¨ä¸ä¸ææ¯æ段ãä¸è¿ä»å®æ¹ç½ç«çé度æ¥çï¼ææ¾è¿æ¯pwå ä¼åï¼åµåµ
æè¿çäºä¸ä¸dzçCSSæ件ï¼ææ¾æ¯ç¨CSSç¨çæç¹è¿åº¦äºï¼å¨dzä¸å¤§é使ç¨äºCSSï¼CSSæ件é«è¾¾KBå·¦å³ï¼pwåªæ2KBå·¦å³ï¼ï¼å¯è½é æäºIE渲æç½é¡µçæ¶åï¼æçæ¯è¾ä½ãåæ¶ï¼ç±äºdzçCSSæ件è¿äºåºå¤§ï¼åªå¥½éç¨äºå¤ç½®çæ¹å¼ï¼Linkï¼ã
è¿æ ·å¦æç½éå¾æ ¢ï¼ç½é¡µå·²ç»æè é¨åä¸è½½å®ï¼èCSSæ件ä¸è½½æ²¡å®æï¼ç½éæ ¢çæ¶åï¼å¸¸å¸¸åçè¿ç§æ åµï¼ï¼é£ä¹ç½é¡µæ ¹æ¬å°±ä¸è½æ£å¸¸æ¾ç¤ºã
å¨ç½éæ ¢çæ¶åï¼å dzçCSSæ件ï¼å°±è¦ç¨å¥½å ç§ï¼çè³åå ç§çæ¶é´æè½ä¸è½½ï¼èæ´ä¸ªç½é¡µåªè½å¨CSSä¸è½½å®æ以åæè½è¿è¡æ£ç¡®çæ¾ç¤ºï¼è¿å°±æ æªä¹å¨ç½éæ ¢çæ¶åï¼dz表ç°å¤§å¤§éè²äºpwäºã
ç¸åï¼pwå¨è®¾è®¡CSSçæ¶åï¼ææ¾æ¯æ¯è¾ç®æ´ï¼è¿å¯¹ç½é¡µç渲æè¯å®æ¯æ¯è¾æå©ãåæ¶ï¼pwéç¨äºæCSSæ件åµå ¥çæ¹å¼ï¼å°½ç®¡æ¯æ¬¡è®¿é®ç½é¡µé½é æäºå K 个åèçæµéï¼ä½æ¯å®é å½±å并ä¸å¤§ï¼åèè§å¾ç½é¡µæå¼é度æ¯dzè¦å¿«ï¼è¿å°±æ¯pwç¨äºä¸ä¸ªç¬¨æ³åï¼å´å¸¸å¸¸æææ¯dz强çå ¸åæ¡ä¾ï¼ã
è¿æ¹é¢ï¼å»ºè®®dzçä¸å³å¿ç®åè¿åèè¿çCSSæ件ï¼æé«ç½é¡µé度ã
ä¸ãåè½ç¯
ä¸é¢ä¿ºå°±dz5.5åpw5.3çåè½ï¼åä¸ä¸ªç®åçï¼æ¬äººçæ¥æ¯æ¯è¾æ·±å ¥ï¼å¯è½é«æçæ¥ä»å«æµ æ¾çåæï¼è¯·å¤§å®¶ææ£ï¼
1ãç»å½æ¹å¼ï¼
pwçåå°ç»å½ååå°ç»å½éç¨äºä¸åçCookieæ¹å¼ï¼è¿æ ·ååå°åå¼çæ¹å¼ï¼ä¸ªäººæè§ï¼æå©äºå®å ¨ï¼ä¹ä¾¿äºç®¡çãåå°å¸å·ä¸åå°å¸å·å¯ä»¥å½»åºåå¼ã
èdzçååå°ç»å½æ¯ç¨äºä¸ä¸ªå¸å·ï¼å°½ç®¡å¨è¿å ¥åå°çæ¶åå次æ示è¾å ¥å¯ç ï¼ä¸è¿è¿æ¯ä¸å¦pwæ¹ä¾¿ã
æ¯è¾ç¹å«çæ¯ï¼dzå¨æ³¨åçæ¶åï¼è¦æ±è¾å ¥æ示é®é¢ï¼éå¡«ï¼ï¼èä¸å¨ç»å½çé¢ä¸ï¼ä¹ææ示è¾å ¥ççé¢ï¼ä¸ªäººæè§ï¼ç»å¯¹çç»è添足ï¼æ èãå¦æ说使ç¨æ示é®é¢æ¥æ¾åå¯ç ï¼è¿æ¯æç¹éççãç¨æ示é®é¢çæ¹å¼ï¼è®©æ°æçäºæ æéä»ï¼èè¢é½æäº
2ãåæ æ¾ç¤ºï¼
pwä»5.0.1å¼å§æ¯æå·¦å³åæ æ¾ç¤ºäºï¼ç¶èåè½å¤ªç®åï¼ä¸è½æ ç¶æ¾ç¤ºåæ¿åï¼æ¤åè½ä¸å ¶è¯´æï¼ä¸å¦è¯´æ²¡æï¼å¼çæç¹æç¬ï¼å±äºåæåï¼åæ¯ä¹ç¬¦åpwçä¸è´¯ç¹ç¹ï¼ï¼å欢æ¨åºä¸äºä¸å®ç¾çä¸è¥¿è®©å¤§å®¶ä¿®æ¹ï¼ã
çäºdz5.5çåæ æ¾ç¤ºï¼åçè¿æ¯æ¯è¾å®ç¾çï¼æè§ç¸å½ä¸éäºã
3ãåå°ç®¡ççæçï¼
pwç横åæä½é常ä¸éï¼å¤§å¤§èçäºç®¡ççé¾åº¦ï¼ç¹å«æ¯å¨æ ¹æ®ç¨æ·ç»è®¾ç½®æéçæ¶åï¼é常çé£ä¸ªæ¹ä¾¿åï¼è¿æ¹é¢dzéè¦æ¹è¿ã
dzæä¾äºä¸ä¸ªæ¹æ¡çæ¹å¼æ¥è§£å³åå°éå¤æä½é®é¢ï¼åºè¯¥è¯´ä¹æä¸å®éçï¼ä½æ¯ç¨èµ·æ¥ä¸å¤ªå®¹æä¸æï¼å¦ææ¯è®¾ç½®ä¸ä¸ªåç¬ç项ç®ï¼å°±æ¯è¾ç¹çã
4ã个人空é´ï¼æéï¼åè½ï¼
dz5.5å ç½®äºminispace个人空é´åè½ï¼å¯ä»¥è¯´èªä»discuzå并äºsupsite以åï¼å¨è®ºååè½çå¤å±æ¹é¢ï¼å æ®äºå¾å¤§ä¼å¿ï¼å¸å¼äºå¾å¤ä¸ªäººç½ç«ç注æåã
è¿ä¸ªminispaceç¨dzå®æ¹çè¯è¯´ï¼æ¯è¿æ ·çï¼
âå®å ¨å©ç¨è®ºååæèµæºï¼ä¼åä¸å¿ æ´å¤ä»åºï¼å³å¯æ¥æ个æ§å±ç¤ºé¡µé¢
ä¸ X-Space å®ç¾ç»åï¼å¯é¡ºç å®ç° MiniSpace ä¸ X-Space èªç¶è¿æ¸¡ â
大ä½çäºä¸ä¸ï¼åç°è¿ä¸ªminispaceåçå¾ä¸éï¼å©ç¨å®ï¼ç¨æ·å¯ä»¥æèªå·±çä¼ç§å¸åæ´çåºæ¥ï¼å½¢æä¸ä¸ªæéçæ¹å¼ï¼æ¹ä¾¿å«äººè®¿é®ã以åå¨å«ç论åè§è¿è¿ä¸ªåè½ï¼è§å¾å¾ä¸éï¼æ²¡æ³å°dzæå®æ´åè¿å»äºãè¿ä¸ªåè½å·²ç»å¯ä»¥æ»¡è¶³å¤§é¨å论åçåè½è¦æ±äºï¼å¦æè¦æ±æ´é«ï¼æ¯å¦å¸æè½è®©ç¨æ·åå¸b0客æç« ï¼æç §å®æ¹ç说æ³ï¼ä¹å¯ä»¥è¿ç§»å°Xï¼spaceä¸å»ãä½æ´éè¦çæ¯ï¼minispaceæ¯å¼æºçï¼èXï¼spaceçæºä»£ç 并ä¸å¼æ¾ã
说å°Xï¼spaceï¼æ们è§å¾ï¼pwå¨åè½ä¸è½ç¶è¶³ä»¥ådzå¹æï¼ä½æ¯å¨è®ºåçå¤å»¶ä¸ï¼å´æ¯dzè½åäºå¥½å¤ãXï¼spaceè½å®ç°ä»¥è®ºå为ä¸å¿ç个人空é´åè½ï¼èpwblogï¼å·²ç»æ¹å为Lxblogï¼æ£å¼çæªæ¨åºï¼æ¬æä» ä»¥5.1.5çæ¬ä¸ºä¾ï¼å´å论åè²åç¥ç¦»ï¼å¸åæ¨éåè½è½ç¶ä»4.3.2å°±æäºï¼ç¶èå´ä¸ç´ä¸å¥½ç¨ï¼4.xæ¨é以åï¼å¾çåé件é½ä¸æ£å¸¸ï¼5.1.5è½ç¶å¯ä»¥æ¨éæ£å¸¸äºï¼ç¶èå¨è®ºåä¸æ´æ°çå¸åï¼å¨b0客ä¸å´ä¸ååºç°åå¸ï¼å¯ä»¥è¯´æ¨éåè½å¨pwblogä¸åªæ¯ä¸ä¸ªæ ç¨çç¹ç¼èå·²ã
说å°åºï¼æ们常常å¸æçåªæ¯ä¸ä¸ªè®ºåå¸åæéåè½çæ¹å¼ï¼pwblogæ论åä¸çå 容éå¤æ¨éå°b0客ä¸ï¼æ¢æµªè´¹ç©ºé´ï¼å没ææä¹ï¼è¿æ¹é¢dzè¿è¿èè¿äº pwï¼å¼å¾è¡¨æ¬ãä½minispaceçåè½è¿æ¯ç¥æ¾ç®åäºäºï¼æ¯å¦æ²¡ææéå¸åçåç±»åè½ã没æé¦é¡µæ¨èå¸åççï¼ä¹è®¸è®ºåå¸åçåç±»æä¹ä¸å¤§ï¼ä¸è¿ææ»æ¯æ²¡æ强å§ï¼ï¼
5ãé²çæ°´ææ¯
pw5.3ç»äºæ¥åäºä¿ºæåºçæ°æ注å第N贴以ååå¸ä½¿ç¨éªè¯ç çæ¹å¼ï¼è¿æ ·æ¢ä¸å½±åèç¨æ·ç使ç¨ï¼åéè¿éªè¯ç æ¹å¼æ¥éå¶æ¶æçæ°´æºå¨äººãdzæªæä¾æ¤åè½ï¼ä½æ¯å ·æå¯ä»¥è®¾å®ç¬¬N贴以åä¸ç¨èªå®ä¹é®ççåè½ï¼dzçéªè¯ç å¾çï¼æ ¹æ¬çä¸æ¸ ï¼ç¨èªå®ä¹é®çä¼¼ä¹æ´å¥½ä¸äºï¼ã
å¨é²æ¢èªå¨æ³¨åæ¹é¢ï¼pwådzé½ä½¿ç¨äºèªå®ä¹é®çæ¹å¼é²æ¢èªå¨æ³¨åçåæ³ï¼å ·ä½åçå¾ç®åï¼ä¸¤è å®ç°çé½å·®ä¸å¤ãåºå«å¨äºï¼dzè¦æ±è®¾ç½®ä¸ªä»¥ä¸çé®é¢æè½çæï¼èpwåªè½è®¾ç½®ä¸ä¸ªé®é¢ãå¦å¤ï¼è¿æä¸ä¸ªåºå«ï¼å°±æ¯pwå¯ä»¥èªå®ä¹é®çä¸å é¨ä½¿ç¨çformåéåï¼å¯è½å¨é²æ¢æ¶æèªå¨æ³¨åæ¹é¢ï¼ä¼æ´å ææä¸äºãpwçèªå®ä¹é®é¢åªè½ç¨äºæ³¨åï¼èdzçå¯ä»¥ç¨å¨æ³¨åãåå¸åçæ¶æ¯çæ¹é¢ã
ä»ç®åçå ·ä½åºç¨æ¥çï¼ç¨ä¸ä¸ªé®é¢å°±åºæ¬ä¸è§£å³äºèªå¨æ³¨åçé®é¢ï¼é¿æ¶é´å®è·µåç°çç»æï¼ï¼å½ç¶ä¹ä¸æé¤ç¹å¤§åç½ç«ï¼ç¨ä¸ä¸ªé®é¢å®¹æ被æ»ç ´çå¯è½æ§ï¼è¿æ¹é¢dzå¯è½å°±æ´ææä¸äºãåªæ¯dzéå¶è¦æ±ä¸ªä»¥ä¸æè½çæçåæ³ï¼ä»¤äººè´¹è§£ã
6ãåå°ç®¡çåè½
pwå ·å¤å¯ç主åè½ï¼ä¸è¿åä¸è¬çæè·¯ä¸åï¼å¯ç主æ¯ç±ç主任å½çï¼è¿æ ·ææä¼å¯¼è´æéæ··ä¹±é®é¢ï¼æ以ä¹å¾å°æ人ç¨è¿ä¸ªåè½ã
å¨åå°ç管çåè½ä¸ï¼pwæ´æ¹ä¾¿ä¸äºï¼ä¸ä» ç主é¢å表ä¸è½è¿è¡ç®¡çï¼å¨å¸åå 容页é¢ä¸ç管çæ¹å¼æ¯dzç¨ä¸ææ¹å¼æ´ç´è§ä¸äºãèä¸å¨ä¸ä¸ªä¸»é¢éé¢å é¤å¸åï¼pwæ¯dzç´è§å¤äºã
费解çæ¯ï¼pw5.3çæ¬ä¸ç§»å¨å¸åï¼é½ä¼å¨å¸ååé¢å å ¥ç§»å¨æ示âæ¬å¸è¢« xxxx ä» xxxx 移å¨å°æ¬åº(xxxxå¹´xxæxxæ¥) âï¼æ æ³æ¶é¤ï¼çæ¯é¾çæäºï¼ä»¥åçæ¬æ²¡æè¿ä¸ªæ¯ç ï¼
dzå®ç°äºâæ²è´´âçåè½ï¼å¯ä»¥æé£äºå¶å°è¢«äººç¿»ä¸æ¥çæ ç¨åå¾è´´æ²ä¸å»ï¼ç¡®å®æ¹ä¾¿å¤äºããããæ次俺å¨pwä¸ä¸ºäºæ²ä¸ä¸ªå¸åï¼ä¸å¾ä¸æåäºN个å¸åãèä¸dzçç主管çåè½ï¼å 亮ãç²¾åçæä½é½è½ä¸æ°åµæï¼æ¯pwæ¹ä¾¿å¥½å¤ã
7ãæè§å³æå¾ç¼è¾å¨
dz5.5åpw5.3å¼å§ï¼ä¸çº¦èåçææè§å³æå¾ç¼è¾å¨æ¢æäºubbcodeï¼ä¸¤ä¸ªè®ºåå称ä¸ä¸æ ·ï¼è¿éç¨ä¸ªéä¿ä¸ç¹çå称ï¼æ称为UBBCodeï¼æ¹å¼çç¼è¾å¨ï¼èæ¾å¼äºåæ¥çHTMLå¯è§åç¼è¾å¨ã
说起æ¥ï¼è¿ä¸ªubbcodeå¯è§åç¼è¾å¨ç¡®å®è§£å³äºä»¥åéç¨ä»£ç æ¹å¼ï¼æ æ³å¯è§åï¼å¯¼è´å¥½å¤éIT人士åå¸æ æ³æ§å¶æ ¼å¼ï¼èåå¨ç½ä¸æ ·ä½¿ç¨HTMLæ¹å¼ï¼å产ç大éåä½ä»£ç åå®å ¨æ§éæ£çé®é¢ã
ä¸è¿é æçåæå´æ¯ï¼å¨è½¬è´´çæ¶åï¼ä»¥åå¯ä»¥ç´æ¥ä»å«äººçç½é¡µä¸ï¼è¿å¾ç带æåä¸èµ·è½¬è¿æ¥ï¼å´æ¯é常æ¹ä¾¿ï¼è½ç¶æçé¾ä¹å«ãæ¢æäºè¿ç§ç¼è¾å¨ï¼åä¹æ²¡æ³é£ä¹æ¹ä¾¿äºï¼å æ¤å¨æ¢äºç¼è¾å¨ä»¥åï¼å®æ¹è®ºåä¸æ¯æ¨å£°è½½éä¸çããããèä¸æ°çç¼è¾å¨è¿æ好å¤å°BUGï¼æ´å æ¯å¼èµ·äºå¹¿æ³ä¸æ»¡ï¼å¦æ³¨ï¼ç¨äºä¸æ®µDZååç°ï¼dz 5.3çæè§å³æå¾ç¼è¾å¨å¥½ååå¨å¾å¤é®é¢ï¼å ä¹æ æ³ç¨ï¼è¿æ¹é¢å¯è½è¿ä¸å¦pwçç¼è¾å¨å¥½ç¨ä¸äºï¼
8ãé件ä¸ä¼ åæè§å³æå¾åè½ï¼
pwçé件è¿æ¯åªè½æ交å¸åä¸ä¼ 以åæè½è¿è¡å¾ææ··æï¼è¿æ¹é¢dzè¦å¥½çå¤ï¼å¯ä»¥ä¸ä¼ åå°±è¿è¡æ··æï¼æ¹ä¾¿å¤äº
dz对ä¸åä¸ä¸ä¼ çå¾çé件è¿æ¯æ¾ç¤ºå¤ªå¤ä¿¡æ¯ï¼çèµ·æ¥å½±åç¾è§ï¼ä¼¼ä¹æ¯åvbbåphpbbçå½±åæ¯è¾å¤§ï¼ãèpwåªæ¯æ¾ç¤ºäºâå¾çâåæ ·åæè¿°ä¿¡æ¯ï¼ä½æ¯æ´æ¶å¿çæ¯ï¼å´æè¿äºå¾çæ¾å°æ£ææåä¸æ¹ ï¼çæ¯å±¡æä¸æ¹å
9ãé件é²çé¾ææ¯çåæï¼
dzéç¨äºéèå¾çå°åï¼åæ£æµè®¿é®æ¥æºï¼å¯éï¼çåæ³æ¥é²çé¾ï¼åºè¯¥è¯´æå¡å¨è´æ æ¯è¾å¤§ï¼ææè¿è¡ï¼ä½ä¸è½å½»åºè§£å³é®é¢ã
pwç¨çåæ³æ´ç®åï¼ä½æ´ææä¸äºï¼å°±æ¯å®ææè èªå¨ä¿®æ¹é件ç®å½åï¼åºè¯¥è¯´è¿æ¯ä¸ä¸ªæèµå°è§æå¿«ç好åæ³ï¼ææ¯ä¸ä¹å¾ç®åãä¸è¿ææ°çpw5.3çæ¬ä¹å¼å ¥äºéèé件å°åçæ¹å¼ï¼åå°ä¹ä¼¼ä¹æ æ³å ³éæ¤é¡¹åè½ï¼ä¼¼ä¹æç¹ç»è添足çå³éäºãããã
åç°dzä¹å¯ä»¥å¨åå°æ工修æ¹é件ç®å½ï¼ä¹å¯ä»¥èµ·å°ä¸å®ææï¼åªæ¯æ²¡æèªå¨ä¿®æ¹çåè½ã
ã广ååè½ï¼
dzæ¯pwè¦å¥½ä¸äºï¼å¹¿ååè½æ´å®åä¸äºãæ¯å¦è´´å 广åï¼å¨å¸åä¸é¢çä½ç½®ç±»ä¼¼å¨ç½çä½ç½®ï¼çèµ·æ¥æ´æ´é½ä¸äºï¼èpwçä½ç½®å°±è®©å¸åå¸å±æ¾å¾æ¯è¾åä¹±ï¼ä¸å¥½çãdzçè´´é´å¹¿åå¯ä»¥æå ¥å¤§çGoogle Banner广åï¼æè å ¶å®å¾çå½¢å¼ç广åï¼å±ç¤ºææå¾å¥½ã
ç¸æ¯dzï¼pw广åçæå ¥ä½ç½®æ´å°ä¸äºï¼ææä¹å·®ä¸äºã
ã头åæ¾ç¤ºï¼
dzä¸è½éå¶ä¸ä¼ 头åçé¿å®½å°ºå¯¸ï¼åªè½éå¶æ»åç´ æ°ï¼æ¾å¾ä¸å¤çµæ´»ï¼ä¸å¦pwæ¹ä¾¿ãèä¸è¶ åºäºä¸å®å°ºå¯¸ç头åï¼è¢«èªå¨ç¼©æ¾åæ伸äºï¼çèµ·æ¥å¾é¾çãèä¸ dzè¿èªå¨ç»å¤´åå äºä¸ä¸ªè¾¹æ¡ï¼çæ¯æ¶å¿ãå¯è§dzæç®åçäºæ ç»å¼å¤æåäºï¼å ¶å®åªè¦åpwä¸æ ·ï¼éå¶å ¶å°ºå¯¸ï¼æ ¹æ¬ä¸éè¦æ伸ã
ãé件尺寸éå¶ï¼
pwåªè½è®¾å®ææé件ç尺寸ï¼èdzå¯ä»¥å¯¹ä¸ªå«æ ¼å¼çé件设å®ä¸ä¼ 尺寸ï¼æ¯è¾çµæ´»ä¸äºï¼ç¹å«éåä¸äºflashç½ç«ï¼æè ææ¯åç½ç«ï¼æ¯å¦ä¸ä¼ 大尺寸å¾çº¸çï¼ã
ãè¯è¯è¿æ»¤ï¼
pwåªè½ä½¿ç¨æ®éæ¹å¼è¿æ»¤ï¼ä¸æ¯æ大å°åï¼å¾ç®åçäºæ ï¼å®æ¹å°±æ¯ä¸åï¼ä¸¾æä¹å³åï¼ã
èdzä¸ä» è½è¯å«å¤§å°åï¼èä¸å ·æäºä¸å®ç模ç³è¯å«åè½ï¼ç¸å½ä¸éäºãå½ç¶ï¼è¦æ¯è½ç´æ¥æ¯ææ£å表达å¼å°±æ´ç½äºã
ãèªå®ä¹ä»£ç åè½ï¼
pwè³ä»ä¸æ¯æèªå®ä¹wincode代ç ï¼æ¯è¾åµåãè¦å¢å åè½ï¼å°±åªè½ä¿®æ¹jsæ件ï¼å¤ªè¿éº»ç¦ãããã
dzå¨è¿æ¹é¢åçæ¯è¾å®ç¾ï¼è¦å¢å æè åå°ä»£ç ãä¿®æ¹ææ¾çé¢å°ºå¯¸é½å¾å®¹æï¼å¨åå°è®¾ç½®ä¸ä¸å°±å¯ä»¥äº
ãåæ¶ç«åè½ï¼
dzå¯ä»¥è®¾å®èªå¨æ¸ çï¼èpwä¸è½
ãIPæ¥æºæ¾ç¤ºåè½ï¼
dzçIPå°ååæ¥æºæ¾ç¤ºç±»ä¼¼å¨ç½ï¼çèµ·æ¥ä¸å¤ªæ¹ä¾¿ï¼éè¦ç¹å»å°çµèå¾æ æè¡ãè¿æ¯pwçIPå°åæ¥æºæ¾ç¤ºçèµ·æ¥æ¯è¾èæä¸äºã
ãé²CCæ»å»ï¼
pwæ©å¨4.3.2å°±å¢å äºæCCæ»å»åè½ï¼èä¸è®¾ç½®èµ·æ¥æ¯è¾ç®åï¼æ°æä¹è½çæãå½å俺就æ¯å 为è¿ä¸ªåå æç¨äºpwã
dz5.5è½ç¶å·ç§°å¸¦æccæ»å»é²æ¤ï¼ä¸è¿çèµ·æ¥æ¯è¾é¾äºç解ï¼å¨åå°æ¾äºå天ä¹æ²¡æ¾å°ï¼ä¼°è®¡æ°ææ¯æä½ä¸äºçãå½å¹´æèåç«é¿è®ºåï¼ç¨dzï¼å¯å°±æ¯è¢«CCæ»å»æçé¿æå¼ä¸äºå¼ çï¼çèµ·æ¥dzçé²CCæ»å»åè½è¿æå¾ æ¹è¿ã
ãå¤ä»½åè½
pwè½æ¯æ对pwç¨åºä»¥å¤çæ°æ®è¡¨è¿è¡å¤ä»½ï¼èä¸å¤ææ åä¸æ¯æ ¹æ®è¡¨åç¼ãå¯ä»¥åç¬å¤ä»½pw表以å¤çæ°æ®è¡¨ï¼å¯¹äºé£äºå»ºç«äºæ°è¡¨çæ件ï¼å¤ä»½æ°æ®è¶ 级容æï¼è¿æ¹é¢æ¯è¾äººæ§åã
dzåªæ¯æ ¹æ®è¡¨åç¼æ¥è¿è¡å¤ä»½ï¼æ¯å¦ä½ 设置ä¸ä¸ªè¡¨ï¼å«åcdb_testï¼é£ä¹å®ä¼æå®è®¤ä¸ºæ¯è®ºåæ°æ®è¡¨èè¿è¡å¤ä»½ãä½æ¯å¦æä½ è®¾ç½®ä¸ä¸ªè¡¨ï¼å«åtestï¼é£å°±èªå·±æ³åæ³å»å§ãããã
ä½æ¯dzæ¯pw强çæ¯ï¼å¤ä»½å¯ä»¥å缩ï¼å缩åä¸è½½å转åå¤ä»½æ件åºè¯¥ä¼èç巨大ç空é´åæ¶é´ï¼å¯¹äºè¶ 大å论ååºè¯¥æ¯é常管ç¨çãdzå¤ä»½å¯ä»¥æå®æ件åï¼èä¸å¤ä»½æ°æ®ç¨åå è¿å¶è¡¨ç¤ºï¼å®å ¨ä¸äºï¼ä½æ¯å ç¨ç©ºé´ä¼å¤§ä¸äºï¼ï¼ä¼°è®¡å¯¼å ¥åæ¢å¤çä¸æå ç é®é¢å°±ä¸ä¼åå¨äºã
å¦å¤ï¼dzè¿å¯ä»¥å¤ä»½MySQL Dumpå¤ä»½ï¼ä¸æ¨è使ç¨ï¼ã
ãæ件åæ°æ®åºæ ¡éªï¼
dzå ç½®äºæ件åæ°æ®åºæ ¡éªçåè½ï¼pwåªæ¯å®æ¹æä¾äºä¸ä¸ªæä»¶æ ¡éªå·¥å ·ï¼ä¸è¿ç¨èµ·æ¥æç¹è«æå ¶å¦ï¼ææ¶åæ示使ç¨çå½æ°å¨phpæ件ä¸æ ¹æ¬ä¸åå¨
ã主é¢æ¨èåç¸å ³è´´åè½ï¼
dzéè¿qihooå®ç°äºç¸å ³è´´çåè½ï¼èä¸è¿å¯ä»¥æ¯æ主é¢æ¨èï¼è¿æ¹é¢æ¯pw强äºå¾å¤ã
ã模çåé£æ ¼è®¾ç½®
phpwindå¯ä»¥å¨åå°è®¾ç½®é£æ ¼CSSæ件ï¼è½ç¶æ°æä¸å¤ªå®¹æä¸æï¼ä½ç¡®å®è¿æ¯æ¯è¾æ¹ä¾¿çã
dzæ´è¿ä¸æ¥ï¼æcssçå 容ç»è§£éæäºè¡¨åçå½¢å¼ï¼è®©æ°æä¹è½æä½ï¼ä¸è¿å¸¦æ¥ç缺ç¹æ´å 大äºï¼å¦æä½ æ³å¨CSSä¸å¢å æ§å¶ï¼æ¯å¦è°æ´è¡é´è·çï¼ï¼å°±ä¸ç¥é该æä¹å¼äºï¼åªå¥½å»ä¿®æ¹æ¨¡çã好å¨dzè¿æä¾äºä¸ä¸ªéå åè½ï¼å¨åå°å¯ä»¥ç´æ¥ä¿®æ¹æ¨¡çï¼èä¸ç¼è¾çé¢ä¸è¿å¸¦æç´¢åè½ï¼æ»ç®æ¯äº¡ç¾è¡¥ç¢äº
dz以è¾å¤§ä¼å¿å¨åè½ä¸è¶ è¿pwï¼èä¸å¨dzæäºèè¿pwçåè½ä¸ï¼å¥½å¤é½æ¯ä»¥è¾å¤§ä¼å¿åèã
åãæ»ç»
æ»ä½æ¥è¯´ï¼dzå¨åè½ä¸ï¼çé¢ä¸ï¼ææ¯ä¸ï¼è®ºååè½å¤å»¶ä¸ï¼é½èè¿äºpwãä½pwä¹å¹¶éä¸æ æ¯å¤ï¼å ¶æCCæ»å»åè½ï¼ç®æ´å¿«éççé¢ï¼å¼ºå¤§ç管çåè½ï¼ç¬å°çé²çé¾ææ¯ï¼é½å¾æç¹è²ãæè°ä»è è§ä»ï¼æºè è§æºï¼éæ©pwè¿æ¯dzï¼ä»ç¶æ¯ä¸ä¸ªä¸ªæ§åçé®é¢ï¼å ·ä½åå³äºä½ 对ä»ä»¬çæ项ç¹ç¹æ¯å¦çéã
å¦å¤ï¼æè§dzå¨æµè§å¨å ¼å®¹æ§ä¸æç¹å°é®é¢ï¼ææ¶åä¼åºç°æ示ï¼ä»ä¹ä»æ¥è·¯ä¸æçä»ä¹ä¸è¥¿æ交信æ¯ï¼æ£æ¥norton internet securityé ç½®ä¹ç±»çç¦äººé®é¢ï¼èä¸dzçéªè¯ç 太æ¶å¿ï¼æ ¹æ¬çä¸æç½ï¼é½èµ¶ä¸å¨ç½ççéªè¯ç äºï¼åºæ¬ä¸æ²¡æ³ç¨ï¼åªå¥½å ³æç®å®ã
éè¦è¯´æçæ¯ï¼å¦ææ¯æ°æï¼éè¦éæ©è®ºåï¼è¿æ¯å»ºè®®éæ©dzï¼å 为åè½æ¯è¾å¤ï¼è®ºåçå¤å»¶å¼åçæ¯è¾å¥½ï¼supsite/X-spaceåçå¾ä¸éï¼ï¼ç¨èµ·æ¥æ¹ä¾¿ä¸äºï¼èä¸æ¨¡çä¿®æ¹èµ·æ¥æ¯è¾ç®åï¼å®¹æä¸æã
pwåªæ¯éåèæï¼å对论åå¤å»¶åè½ä¸å¤ªæå ´è¶£çé£äºäººä½¿ç¨ï¼èä¸pwç模çä¿®æ¹èµ·æ¥ç¸å½å°é¾ï¼ç¨æä¸æ 就容æåºéï¼å¯¹æ°æä¸åéã
PWéå娱ä¹ç«ï¼é度快ï¼åè½å¤ï¼å®æ¹éæåç§æ件ï¼å ä¹ä¸ç¨ç»´æ¤
pwç°æçåè½=dz+é¶è¡+å¤é件ä¸ä¼ +å¨çº¿ä¼åç»è®¡+ç¹æ®ç¨æ·ç»æ·»å +èæ¥é礼
个人认为phpwindæ¯è¾æ¹ä¾¿äº,对äºé£äºä¸æ³è±æ¶é´è£ æ件ç人æ¥è¯´ä¸ææ´å®¹æ
没写过复杂 React 组件?来实现下 AntD 的 Space 组件吧
React 开发者在日常工作中经常编写组件,但这些大多为业务组件,复杂度并不高。
组件通常通过传入 props 并使用 hooks 组织逻辑来渲染视图,偶尔会用到 context 跨层传递数据。
相对复杂的组件是怎样的呢?antd 组件库中就有许多。
今天,我们将实现antd组件库中的一个组件——Space组件。
首先,我们来了解一下Space组件的使用方法:
Space是一个布局组件,用于设置组件的间距,还可以设置多个组件的对齐方式。
例如,我们可以使用Space组件来包裹三个盒子,设置方向为水平,渲染结果如下:
当然,我们也可以设置为垂直:
水平和垂直的间距可以通过size属性设置,如large、yolov源码编译middle、small或任意数值。
多个子节点可以设置对齐方式,如start、end、center或baseline。
此外,当子节点过多时,可以设置换行。
Space组件还可以单独设置行列的间距。
最后,它还可以设置split分割线部分。
此外,你也可以不直接设置size,而是通过ConfigProvider修改context中的默认值。
Space组件会读取context中的size值,这样如果有多个Space组件,就不需要每个都设置,只需要添加一个ConfigProvider即可。
这就是Space组件的全部用法,简单回顾一下几个参数和用法:
Space组件的使用方法很简单,但功能非常强大。
接下来,我们来探讨一下这样的布局组件是如何实现的。
首先,我们来看一下它最终的c 家谱源码DOM结构:
每个box都包裹了一层div,并设置了ant-space-item类。
split部分包裹了一层span,并设置了ant-space-item-split类。
最外层包裹了一层div,并设置了ant-space类。
这些看起来很简单,但实现起来却有很多细节。
下面我们来写一下Space组件的实现代码:
首先,我们声明组件props的类型。
需要注意的是,style是React.CSSProperties类型,即可以设置各种CSS样式。
split是React.ReactNode类型,即可以传入jsx。
其余参数的类型根据其取值而定。
Space组件会对所有子组件包裹一层div,因此需要遍历传入的children并做出修改。
props传入的children需要转换为数组,可以使用React.Children.toArray方法。
虽然children已经是数组了,但为什么还要使用React.Children.toArray转换一下呢?
因为toArray可以对children进行扁平化处理。
更重要的是,直接调用children.sort()会报错,而toArray之后就不会了。
因此,我们会使用React.Children.forEach、React.Children.map等方法操作children,而不是直接操作。
但这里我们有一些特殊的需求,比如空节点不过滤掉,依然保留。
因此,我们使用React.Children.forEach自己实现toArray:
这部分比较容易理解,就是使用React.Children.forEach遍历jsx节点,对每个节点进行判断,如果是数组或fragment就递归处理,否则push到数组中。
保不保留空节点可以根据keepEmpty的option来控制。
这样,children就可以遍历渲染item了,这部分是这样的:
我们单独封装了一个Item组件。
然后,我们遍历childNodes并渲染这个Item组件。
最后,我们将所有的Item组件放在最外层的div中:
这样就可以分别控制整体布局和Item布局了。
具体的布局还是通过className和样式来实现的:
className通过props计算而来,使用了classnames包,这是react生态中常用的包,根据props动态生成className基本都会使用这个包。
这个前缀是动态获取的,最终就是ant-space的前缀。
这些class的样式都定义好了:
整个容器使用inline-flex,然后根据不同的参数设置align-items和flex-direction的值。
最后一个direction的css可能大家没用过,是设置文本方向的。
这样,就通过props动态给最外层div添加了相应的className,设置了对应的样式。
但还有一部分样式没有设置,也就是间距。
其实这部分可以使用gap设置,当然,也可以使用margin,但处理起来比较麻烦。
不过,antd这种组件自然要做得兼容性好一点,所以两种都支持,支持gap就使用gap,否则使用margin。
问题来了,antd是如何检测浏览器是否支持gap样式的呢?
antd创建一个div,设置样式,并添加到body下,然后查看scrollHeight的值,最后删除这个元素。
这样就可以判断是否支持gap、column等样式,因为不支持的话高度会是0。
然后antd提供了一个这样的hook:
第一次会检测并设置state的值,之后直接返回这个检测结果。
这样组件里就可以使用这个hook来判断是否支持gap,从而设置不同的样式了。
最后,这个组件还会从ConfigProvider中取值,我们之前见过:
所以,我们再处理一下这部分:
使用useContext读取context中的值,并设置为props的解构默认值,这样如果传入了props.size就使用传入的值,否则使用context中的值。
这里给Item子组件传递数据也是通过context,因为Item组件不一定会在哪一层。
使用createContext创建context对象:
把计算出的size和其他一些值通过Provider设置到spaceContext中:
这样子组件就能拿到spaceContext中的值了。
这里使用了useMemo,很多同学不会用,其实很容易理解:
props变化会触发组件重新渲染,但有时候props并不需要变化却每次都变,这样就可以通过useMemo来避免它不必要的更新。
useCallback也是同样的道理。
计算size时封装了一个getNumberSize方法,为字符串枚举值设置了一些固定的数值:
至此,这个组件我们就完成了,当然,Item组件还没展开讲。
先来欣赏一下这个Space组件的全部源码:
回顾一下要点:
思路理得差不多了,再来看一下Item的实现:
这部分比较简单,直接上全部代码了:
通过useContext从SpaceContext中取出Space组件里设置的值。
根据是否支持gap来分别使用gap或margin、padding的样式来设置间距。
每个元素都用div包裹一下,设置className。
如果不是最后一个元素并且有split部分,就渲染split部分,用span包裹。
这块还是比较清晰的。
最后,还有ConfigProvider的部分没有看:
这部分就是创建一个context,并初始化一些值:
有没有感觉antd里用context简直太多了!
确实。
为什么?
因为你不能保证组件和子组件隔着几层。
比如Form和FormItem:
比如ConfigProvider和各种组件(这里是Space):
还有刚讲过的Space和Item。
它们能用props传数据吗?
不能,因为不知道隔几层。
所以antd里基本都是用context传数据的。
你会你在antd里会见到大量的用createContext创建context,通过Provider修改context值,通过Consumer或useContext读取context值的这类逻辑。
最后,我们来测试一下自己实现的这个Space组件吧:
测试代码如下:
这部分不用解释了。就是ConfigProvider包裹了两个Space组件,这两个Space组件没有设置size值。
设置了direction、align、split、wrap等参数。
渲染结果是正确的:
就这样,我们自己实现了antd的Space组件!
完整代码在github:github.com/QuarkGluonPl...
总结:
一直写业务代码,可能很少写一些复杂的组件,而antd里就有很多复杂组件,我们挑Space组件来写了下。
这是一个布局组件,可以通过参数设置水平、垂直间距、对齐方式、分割线部分等。
实现这个组件的时候,我们用到了很多东西:
很多同学不会封装布局组件,其实就是对整体和每个item都包裹一层,分别设置不同的class,实现不同的间距等的设置。
想一下,这些东西以后写业务组件是不是也可以用上呢?