Web前端最全第一个 React 项目做完了,谈谈自己对 hooks 的思考,2024年最新前端什么是面向对象

Vue 面试题

1.Vue 双向绑定原理
2.描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
3.你是如何理解 Vue 的响应式系统的?
4.虚拟 DOM 实现原理
5.既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?
6.Vue 中 key 值的作用?
7.Vue 的生命周期
8.Vue 组件间通信有哪些方式?
9.watch、methods 和 computed 的区别?
10.vue 中怎么重置 data?
11.组件中写 name 选项有什么作用?
12.vue-router 有哪些钩子函数?
13.route 和 router 的区别是什么?
14.说一下 Vue 和 React 的认识,做一个简单的对比
15.Vue 的 nextTick 的原理是什么?
16.Vuex 有哪几种属性?
17.vue 首屏加载优化
18.Vue 3.0 有没有过了解?
19.vue-cli 替我们做了哪些工作?

算法

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

  1. 冒泡排序
  2. 选择排序
  3. 快速排序
  4. 二叉树查找: 最大值、最小值、固定值
  5. 二叉树遍历
  6. 二叉树的最大深度
  7. 给予链表中的任一节点,把它删除掉
  8. 链表倒叙
  9. 如何判断一个单链表有环
  10. 给定一个有序数组,找出两个数相加为一个目标数

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+评论666

我们用类组件以及函数组件实现了同一个逻辑。这两个组件都会接收一个props.user的属性,我们点击按钮,在3秒之后,会alert一条成功关注的信息。

假如一开始传入的props的值是 { user: '帅wowo' },然后我们点击关注按钮,在3秒之内,传入的props值变化了,变成了{ user: '丑wowo' }。这两个组件将分别alert出什么内容?

有过经验的同学肯定能轻松答出来。

// 函数组件会打印

‘成功关注 帅wowo’

// 类组件会打印

‘成功关注 丑wowo’

复制代码

为什么会这样呢?(这里注明一下,这个例子跟React框架无关,只是js的基本特性,你在任何用js编写的代码中都可以复现)

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的作用域。

这两个问题虽然我们都能解决,但是本质上,都是我们通过代码实践的方式去解决类组件自身的缺陷。

但是在函数组件中,我们不会有这种问题,通过闭包的方式,在一次渲染中,组件的propsstate是保持不变的,而且传递的方法本身就是已经被约束作用域了。

3.逻辑是分散的,而且难以复用

这个痛点其实跟vue2是一模一样的,React的类组件和vue2的开发模式都是类似。

我拿一张尤大来谈论vue2vue3区别时候的一张图来举例

这里的不同颜色其实就是不同逻辑,这图可以分成数据,事件方法,生命周期,模板四块内容。

我们可以看到,一个逻辑在类组件里其实是分散的,拿React来说,数据需要定义在state里,然后需要编写相关的事件方法,再在生命周期里进行逻辑的初始化,组件更新时候的处理,最后在模板里写jsx

我们如果是去维护这个代码,会很痛苦,为了查看一个逻辑,我们要上下翻,找出各自的数据,方法,生命周期和模板。

而且这种方式的代码,很难被复用,抽离重复逻辑我们经历过mixinHOC & render-props。这两种方式都有一个最大的问题,那就是props的来源不够清晰。mixin就不说了,都是泪,只能一个个去找。HOC嵌套层级一多,也会很难确定来源,而且HOC的学习成本也相对比较高,对于新手不太友好。(这块是按我vue2开发用到的mixinHOC的经验写的,我作为React的新手,并没有经历过ReactmixinHOC抽离逻辑的时代,所以如果写的有问题,请各位大佬指出。最后感叹一句,ReactHOC可太方便了!)

但是如果我们使用hooks,我还是用一张vue3中组合式API的图来说明,跟使用hooks的结果是类似的。

每块逻辑都是一个整体,非常清晰明了。而且你可以把这些逻辑都抽离出去,只是在这个组件当中引用即可。

逻辑复用就不用说了,现在谁家React项目里没有好多自定义的hooks啊。

4.hooks更贴合React的基本理念

React的设计理念 里第一条

React的核心理念之一,相同的参数输入应该产生相同的输出。简单说,它应当是一个简单的纯函数。

我们可以拿之前说到的心智模型上的区别中的例子来说明,我们传入一个props参数{ user: '帅wowo' },我们希望关于这个参数的所有事件都强依赖于这条数据。它不应该像类组件一样,传入的参数和我们得到的输出不一致。

但是函数组件可以做到,重复引用一下上面的一句话,在一次渲染中,组件的propsstate是保持不变的

hooks的不足


谈论一个技术,我们不能太过于片面,一定要保持辩证思维,理性分析。上面说了很多hooks的优点,但是它依然存在着不足。

1.比较大的心智负担

同样是因为上面那句话,在一次渲染中,组件的propsstate是保持不变的。这个特性导致的闭包陷阱是我们现在开发中最常见的一个问题。我们需要时刻注意是否已经给hooks添加了必要的依赖项。在封装一些功能相对复杂的组件时,useEffect的重复渲染问题处理有时候会非常棘手,而且不易调试。

这个特性在对函数组件进行性能优化时也是会带来很大的麻烦,因为每次propsstate数据变化,都会导致函数组件中所有内容的重新渲染。我们需要通过memouseMemouseCallback这些方法手动去减少组件的render。当一个组件结构比较复杂,嵌套较多时,依赖项问题的处理也很让人头疼。具体性能优化的内容,可以看我之前的文章。

这些点给开发者带来的学习hooks的成本相比较类组件来说会更大。

2.需要更严格的开发规范

刚才我们说了,函数式编程能够给我们带来很大的灵活度,这个灵活度在开发当中是一个双刃剑。它能帮助我们更好的去解决一些复杂的需求,但是它在一个多人协作开发的项目中并不是一个好的事情。

一些大型的项目,最重要的一定是编程的规范,eslint可以限制语法规范,但是限制不了我们实现需求的规范,一人一个风格的代码对于一个项目来说就是个灾难,对于后续的维护,公共方法的抽离来说将带来很大的麻烦。

所以,需要开发者制定一个具体的开发规范,并在开发的时候严格遵守。

3.hooks并不能完全代替类组件

虽然我们有了很多hooks方法,用来增强函数组件的功能。比如useState可以让函数组件维护自己的数据。有useEffect可以在一定程度上弥补函数组件没有生命周期的缺点。

注意:useEffect并不是用来代替生命周期,它只是提供了一个类似生命周期的方法。两者其实本质上没有可比性。

想了解更多,可以看Dan的这篇博客,https://overreacted.io/zh-hans/a-complete-guide-to-useeffect/,它可以帮你更好的理解hooks中的useEffect

最后

技术是没有终点的,也是学不完的,最重要的是活着、不秃。零基础入门的时候看书还是看视频,我觉得成年人,何必做选择题呢,两个都要。喜欢看书就看书,喜欢看视频就看视频。最重要的是在自学的过程中,一定不要眼高手低,要实战,把学到的技术投入到项目当中,解决问题,之后进一步锤炼自己的技术。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

技术学到手后,就要开始准备面试了,找工作的时候一定要好好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。

础入门的时候看书还是看视频,我觉得成年人,何必做选择题呢,两个都要。喜欢看书就看书,喜欢看视频就看视频。最重要的是在自学的过程中,一定不要眼高手低,要实战,把学到的技术投入到项目当中,解决问题,之后进一步锤炼自己的技术。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

技术学到手后,就要开始准备面试了,找工作的时候一定要好好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。

[外链图片转存中…(img-mKg14Doy-1715895012381)]

  • 16
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值