在React
的类组件中,props
虽然是不变的,但是this
永远是可变。当有异步的事件触发,它获取到的props
或者state
永远都是最新的。当然我们也有办法去解决。
比如我们可以重新定义一个数据来保存`props
handleClick = () => {
const {user} = this.props;
setTimeout(() => this.showMessage(user), 3000);
};
复制代码
但这种方式太过繁琐,各种定义的数据非常不够优雅。
或者把事件都写到渲染函数render
中
class ProfilePage extends React.Component {
render() {
const props = this.props;
const showMessage = () => {
alert('成功关注 ’ + props.user);
};
const handleClick = () => {
setTimeout(showMessage, 3000);
};
return 关注;
}
}
复制代码
这个方法其实函数组件的原理,props
变化之后,组件虽然重新渲染了,但是老的props
通过闭包保存了下来,然后被打印出来。
写了这么多,只是为了论证那句话,函数式组件捕获了渲染所用的值。
为什么我们要使用函数组件+hooks
这一点很多人可能觉得没必要,觉得官方出的东西,跟着用就好,写着也挺顺手的,还管啥为什么呢?
关于这一点,我觉得最重要的其实就是学习大佬们的思维,为什么要做出一个hooks
来?肯定是为了解决一些原来的开发过程中的问题。React
团队的设计层面的思路,能够在一定程度上代表当前业界在框架设计领域里最佳实践。
接下来我会列出几个我认为的类组件
的几个痛点。(好和坏都是比较出来的,这些痛点只是相比于函数组件+hooks而言
,技术在不断发展,技术的迭代都是正常的趋势)
1.函数组件的写法更轻量,更加灵活
在函数组件中,我们不需要去继承一个class
对象,不需要记忆那些生命周期,不需要固定的把数据定义在state
中。函数作为js中的一等公民,函数式编程方式可以让我们可以更加灵活的去组织代码。
2.类组件存在自身的缺陷
一个其实就是上面一节写到,如果我们需要一个只跟着视图走的数据,我们不能直接使用props
或者state
。
还有一个是最常见的,在React
中,如果我们定义一个方法,我们必须使用bind
或者箭头函数去约束这个方法的this
的作用域。
这两个问题虽然我们都能解决,但是本质上,都是我们通过代码实践的方式去解决类组件
自身的缺陷。
但是在函数组件中,我们不会有这种问题,通过闭包的方式,在一次渲染中,组件的props
和state
是保持不变的,而且传递的方法本身就是已经被约束作用域了。
3.逻辑是分散的,而且难以复用
这个痛点其实跟vue2
是一模一样的,React
的类组件和vue2
的开发模式都是类似。
我拿一张尤大来谈论vue2
和vue3
区别时候的一张图来举例
这里的不同颜色其实就是不同逻辑,这图可以分成数据,事件方法,生命周期,模板四块内容。
我们可以看到,一个逻辑在类组件里其实是分散的,拿React
来说,数据需要定义在state
里,然后需要编写相关的事件方法,再在生命周期里进行逻辑的初始化,组件更新时候的处理,最后在模板里写jsx
。
我们如果是去维护这个代码,会很痛苦,为了查看一个逻辑,我们要上下翻,找出各自的数据,方法,生命周期和模板。
而且这种方式的代码,很难被复用,抽离重复逻辑我们经历过mixin
,HOC & render-props
。这两种方式都有一个最大的问题,那就是props
的来源不够清晰。mixin
就不说了,都是泪,只能一个个去找。HOC
嵌套层级一多,也会很难确定来源,而且HOC
的学习成本也相对比较高,对于新手不太友好。(这块是按我vue2
开发用到的mixin
和HOC
的经验写的,我作为React
的新手,并没有经历过React
的mixin
和HOC
抽离逻辑的时代,所以如果写的有问题,请各位大佬指出。最后感叹一句,React
用HOC
可太方便了!)
但是如果我们使用hooks
,我还是用一张vue3
中组合式API的图来说明,跟使用hooks
的结果是类似的。
每块逻辑都是一个整体,非常清晰明了。而且你可以把这些逻辑都抽离出去,只是在这个组件当中引用即可。
逻辑复用就不用说了,现在谁家React
项目里没有好多自定义的hooks
啊。
4.hooks更贴合React的基本理念
React的设计理念 里第一条
React的核心理念之一,相同的参数输入应该产生相同的输出。简单说,它应当是一个简单的纯函数。
我们可以拿之前说到的心智模型上的区别中的例子来说明,我们传入一个props
参数{ user: '帅wowo' }
,我们希望关于这个参数的所有事件都强依赖于这条数据。它不应该像类组件
一样,传入的参数和我们得到的输出不一致。
但是函数组件可以做到,重复引用一下上面的一句话,在一次渲染中,组件的props
和state
是保持不变的。
hooks的不足
谈论一个技术,我们不能太过于片面,一定要保持辩证思维,理性分析。上面说了很多hooks
的优点,但是它依然存在着不足。
1.比较大的心智负担
同样是因为上面那句话,在一次渲染中,组件的props
和state
是保持不变的。这个特性导致的闭包陷阱
是我们现在开发中最常见的一个问题。我们需要时刻注意是否已经给hooks
添加了必要的依赖项。在封装一些功能相对复杂的组件时,useEffect
的重复渲染问题处理有时候会非常棘手,而且不易调试。
这个特性在对函数组件
进行性能优化时也是会带来很大的麻烦,因为每次props
和state
数据变化,都会导致函数组件
中所有内容的重新渲染。我们需要通过memo
,useMemo
,useCallback
这些方法手动去减少组件的render
。当一个组件结构比较复杂,嵌套较多时,依赖项问题的处理也很让人头疼。具体性能优化的内容,可以看我之前的文章。
这些点给开发者带来的学习hooks
的成本相比较类组件
来说会更大。
2.需要更严格的开发规范
刚才我们说了,函数式编程能够给我们带来很大的灵活度,这个灵活度在开发当中是一个双刃剑。它能帮助我们更好的去解决一些复杂的需求,但是它在一个多人协作开发的项目中并不是一个好的事情。
一些大型的项目,最重要的一定是编程的规范,eslint
可以限制语法规范,但是限制不了我们实现需求的规范,一人一个风格的代码对于一个项目来说就是个灾难,对于后续的维护,公共方法的抽离来说将带来很大的麻烦。
所以,需要开发者制定一个具体的开发规范,并在开发的时候严格遵守。
3.hooks并不能完全代替类组件
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
专业技能
一般来说,面试官会根据你的简历内容去提问,但是技术基础还有需要自己去准备分类,形成自己的知识体系的。简单列一下我自己遇到的一些题
-
HTML+CSS
-
JavaScript
-
前端框架
-
前端性能优化
-
前端监控
-
模块化+项目构建
-
代码管理
-
信息安全
-
网络协议
-
浏览器
-
算法与数据结构
-
团队管理
最近得空把之前遇到的面试题做了一个整理,包括我本人自己去面试遇到的,还有其他人员去面试遇到的,还有网上刷到的,我都统一的整理了一下,希望对大家有用。
其中包含HTML、CSS、JavaScript、服务端与网络、Vue、浏览器等等
由于文章篇幅有限,仅展示部分内容
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
TML、CSS、JavaScript、服务端与网络、Vue、浏览器等等**
由于文章篇幅有限,仅展示部分内容
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-0UPDMyjo-1712788526795)]