当前位置: 首页 > Web前端 > JavaScript

我2022年的年终总结

时间:2023-03-27 12:03:46 JavaScript

这篇文章参与了SegmentFault年度随笔《技术达人的2022》,正在看的欢迎加入。前言光阴似箭,岁月如梭,转眼2022年已经走到了尽头。今年的环境异常艰难,但想想这一年我付出的一切,还是值得做一个回顾和总结,俗话说我已经失去了,这一年我失去了太多,但也让我成长了很多.当然,这些都是题外话。主要是想复习一下这一年学的东西。文章总结今年一共写了11篇,加上这个年终总结,一共12篇,数量不多,具体如下:使用React写一个手风琴组件,写一个有趣的电梯小程序。手写一个有趣的电梯一个小程序(React版)实现《羊了个羊》的小游戏50天用vue3完成了50个web项目。我学到了什么?手写React状态管理工具迷你版实现《羊了个羊-美女版》小游戏(低配版)有趣交互效果的实现Vue3实现一个四福猫连连看小游戏原生javascript手写丝滑轮播图三分钟学会变量go语言的定义其中50天用Vue3完成了50个web项目,我学到了什么?我最满意的是实现《羊了个羊》的小游戏。毕竟这两篇文章是我对每一个知识点的总结,让自己掌握所学的知识点,同时帮助别人学习知识点。足够的。其实今年我主要关注的是React技术栈,所以也用React写了很多东西。对于vue框架,尤其是vue3,主要产出是50天用vue3完成50个web项目。发生了什么?这50个项目,虽然表面上写着是50天,但实际上我花了50多天。当然,这并不重要。最重要的是,我深入了解了这50个项目,我看了看less和sass这两种css预处理语言的语法。比如混入mixins、函数、循环、条件判断等。两种预处理语言有很多相似之处,当然也有不同之处。比如在循环中,我们在sass中有@for关键字,而在less中,我们需要写选择器+when(这更像是自己写递归调用)。同时对vue3的核心语法也有了一定的了解。至少在vue3的实际项目中,我觉得自己没有什么大问题。这些都是做这50个web项目学到的。是的,为了方便,我也用vue3写了一个关于这50个web项目的网站,地址在这里。PS:如果您无法访问上述地址,您可以访问这里。本网站由本人设计并实施。虽然布局看起来有点简单,但是我觉得逻辑功能和样式代码有点难。这里我总结一下有哪些值得学习的知识点:实现一个clickOutside命令实现一个下拉框组件实现一个图片预加载组件实现classnames工具功能(不是复制的classnames源码,是参考实现)实现判断textexceedingandomitting实现功能卡片组件和icon组件返回顶部实现less核心语法以上是我对这一年文章所做的总结。另外,我在github上添加了新的贡献,逐步完善了3个仓库。让我们来看看。3项目算法关于剑指offer算法,基本上把剑指offer官方的算法题做完了,写下了解题的思路,建了一个项目,地址在这里。虽然我在工作中貌似没有用到太多算法,但其实做一些算法题确实让我大开眼界。更何况,我的项目中已经加入了算法,比如那个用vue3实现连连看的小游戏里就有这么一个算法。constfindRepeatItem=function(arr:GlobalModule.MaterialData[]){constunique=newSet();for(constitemofarr){if(unique.has(item.src)){返回真;}unique.add(item.src);}返回假;};顾名思义,这个函数就是从数组中找出重复项。思路是用set数据结构来存储每一个数组项,然后当数据中有一项要查找时,就代表重复。是的,直接返回即可。这个函数的思想来源于算法。即算法数组中重复数的第二种思路——哈希表解法。这只是其中的一个小应用程序。如果我在实际项目中遇到了相应的需求,我可能会回去再看一遍这些笔记。达到了归纳、举一反三的目的。本项目是3个项目之一。js和css代码段css代码段这可能是我今年投入最多精力的项目了。几乎每天都要贡献一段代码。不信你看下图:每天学一个javascript或者css代码段不会让自己忘记css和js的基础,而且很多代码段在实际业务中都会用到,比如用css实现自定义单选框和复选框。下面就以单选框为例谈谈实现思路。单选按钮的css实现有以下几点,我们可以创建一个带有状态变化动画的样式单选按钮。创建一个.radio-container并使用flexbox为单选按钮创建一个合适的布局。重置的样式并使用它来创建单选按钮的轮廓和背景。使用::before元素创建单选按钮的内圈。使用transform:scale(1)和CSStransitions来动画状态变化。代码量也不算多,我们来看html和css代码分别如下:

.radio-container{box-sizing:border-box;背景色:#fff;颜色:#545355;高度:64px;显示:弹性;证明内容:居中;对齐项目:居中;flex-flow:rowwrap;}.radio-container*{box-sizing:border-box;}.??radio-input{appearance:none;背景色:#fff;宽度:16px;高度:16px;边框:1px实心#cccfdb;保证金:0;边界半径:50%;显示:网格;对齐项目:居中;证明内容:居中;过境ion:all.3sease-in;}.radio-input::before{content:"";宽度:6px;高度:6px;边界半径:50%;变换:比例(0);缓入缓出;box-shadow:inset6px6px#fff;}.radio-input:checked{背景色:#2396ef;border-color:#2396ef;}.radio-input:checked::before{transform:scale(1);}.radio{cursor:pointer;padding:6px8px;}.radio:not(:last-child){margin-right:6px;}都是常规布局,其中我们主要使用label的for属性和input的id属性绑定在一起,以及然后通过样式隐藏输入框,修改标签的样式,模拟一个单选按钮,从而实现如下效果:同理,复选框也是同样的思路实现的,其实,还有很多小技巧,比如隐藏一个元素,我们通常使用display和visibility或者opacity属性来隐藏,但实际上这三个属性隐藏元素或多或少都有一定的问题,比如display不能添加过渡效果,而visibility占用元素本身的空间,opacity简单设置透明度,元素仍然可以点击等等,而这里我们可以使用clip和定位来达到隐藏元素的目的,从而解决由前三个属性代码如下:.offscreen{border:0;剪辑:矩形(0,0,0,0);高度:1px;保证金:-1px;溢出:隐藏;填充:0;位置:绝对;width:1px;}then我们可以通过为要隐藏的元素添加一个屏幕外类名来隐藏元素。这是一种隐藏元素的方法。当然还有很多值得学习的css代码段,比如border实现轮廓布局,css实现loading效果,switch组件,高度过渡效果等等例子。js代码段除了css代码段,js代码段还有很多值得学习的知识点,比如冒泡排序算法。冒泡排序算法我们看一下这个算法的实现如下:声明一个变量,swapped,表示在当前迭代过程中是否有值被交换。使用扩展运算符(...)克隆原始数组arr。使用for循环遍历克隆数组的元素,在最后一个元素之前终止。使用嵌套for循环遍历0和i之间的数组段,交换任何相邻的无序元素并将交换设置为true。如果迭代后swapped为false,则不再需要更改,因此返回一个克隆数组。代码如下:constbubbleSort=arr=>{letswapped=false;让a=[...arr];for(leti=0;iArray.from({length:Math.ceil(arr.length/size)},(v,i)=>arr.slice(i*size,i*大小+大小));当然,还有更多的css和js代码片段,我就不一一举例了,我只是想说明,每天学习一段代码片段,让我学到了很多东西。更多代码片段,请参考网站。如果不能,请访问此网站。react代码段今年也新开了一个项目,记录react的学习代码段,包括基本组件和hook函数两部分。此外,还有在使用antddesign组件库的组件基础上额外封装的组件。比如实现一个弹出框组件,一个倒计时组件,一个手风琴组件等。像hooks的函数比较多,比如useTimeout函数,useInterval等,useBodyScrollLock函数等。我举两个例子来说明.受控输入组件主要是对输入组件进行样式美化,同时暴露输入组件的值和onchange事件。这里我在js中使用css来美化输入框。代码如下:importstyledfrom'@emotion/styled';importReactfrom'react';importtype{SyntheticEvent}from'react';constStyleInput=styled.input`box-sizing:border-box;保证金:0;字体变体:表格数字;列表样式:无;字体功能设置:“tnum”;位置:相对;显示:内联块;宽度:100%;最小宽度:0;填充:4px11px;颜色:#000000d9;字体大小:14px;行高:1.5715;背景色:#fff;背景图像:无;边框:1px实心#d9d9d9;边界半径:2px;过渡:全部0.3s;&:focus{边框颜色:#40a9ff;框阴影:0002pxrgba(24、144、255、0.2);右边框宽度:1px;大纲:0;}`;typeLiteralUnion=T&(U&{});interfaceControlledInputProps{type:LiteralUnion<|'按钮'|'复选框'|'颜色'|'日期'|'日期时间-本地'|'电子邮件'|'文件'|'隐藏'|'图像'|'月'|'数字'|'密码'|'收音机'|'范围'|'重置'|'搜索'|'提交'|'电话'|'文本'|'时间'|'网址'|'周',字符串>;值:字符串;onChange(v:字符串):无效;占位符:字符串;}constControlledInput=(props:Partial)=>{const{value,onChange,...rest}=props;constonChangeHandler=(e:SyntheticEvent)=>{if(onChange){onChange((e.targetasHTMLInputElement).value);}};返回();};并且每个组件都有对应的tsx和jsx版本,以及对应的接口,也方便学习如何实现封装组件,组件的实现个人认为封装最复杂的就是弹框component,因为我需要考虑两种使用方式,第一种是通过组件使用,第二种是调用方法使用。然后就是我们的hooks函数,比如我们看useBodyScrollLock的实现功能。useBodyScrollLock函数的实现在这个函数中,我们在useLayoutEffect生命周期钩子函数中获取body元素,然后为body元素设置一个overflow为hidden的样式,实现滚动锁定。顾名思义,这个函数就是用来禁止页面滚动的。我们来看完整的代码如下:.overflow;container!.style.overflow='hidden';return()=>{container!.style.overflow=originOverflowStyle;};},[]);};exportdefaultuseBodyScrollLock;当然这只是一个简单的钩子函数,很容易理解,还有更复杂的钩子函数,比如useCopyToClipboard函数的实现,这里就不用一一描述了。如果你想看到更多的实现思路,请看这个网站。如果您无法访问它,请查看此网站。以上是我今年的产出。当然,除此之外,我还在坚持写小说,但我不需要公开,哈哈哈,因为我不觉得我写的怎么样。最后,总而言之,我今年的学习成绩不好也不坏,只是去年立的flag还没有完成,只能期待2023年了。感谢各位阅读到这里。本文到此结束,给大家鼓励一下。