皮皮网

皮皮网

【bootstrap简单案例源码】【租车门户源码】【asp投诉举报源码】space源码

时间:2024-12-26 13:33:00 分类:休闲

1.tolua源码分析(五)lua使用C#的enum
2.最新的QQ空间物品代码
3.跪求QQ空间最新代码
4.phpwind和discuz哪个好
5.没写过复杂 React 组件?来实现下 AntD 的 Space 组件吧

space源码

tolua源码分析(五)lua使用C#的enum

       探讨了C#枚举如何在Lua中注册以及与普通类的注册区别。以官方提供的例子为例,展示了如何将C#的UnityEngine.Space类型的枚举推送到Lua层,并在Lua层面测试了诸如tostring、ToInt、Equals等接口,bootstrap简单案例源码验证了在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#的租车门户源码枚举与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。针对这一情况,asp投诉举报源码可以进行针对性优化。

       下一节将深入研究在开发中常见的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、复制其他店铺源码middle、small或任意数值。

       多个子节点可以设置对齐方式,如start、end、center或baseline。

       此外,当子节点过多时,可以设置换行。

       Space组件还可以单独设置行列的间距。

       最后,它还可以设置split分割线部分。

       此外,你也可以不直接设置size,而是通过ConfigProvider修改context中的默认值。

       Space组件会读取context中的size值,这样如果有多个Space组件,就不需要每个都设置,只需要添加一个ConfigProvider即可。

       这就是Space组件的全部用法,简单回顾一下几个参数和用法:

       Space组件的使用方法很简单,但功能非常强大。

       接下来,我们来探讨一下这样的布局组件是如何实现的。

       首先,我们来看一下它最终的仿易货网源码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,实现不同的间距等的设置。

       想一下,这些东西以后写业务组件是不是也可以用上呢?