react-hooks 更适合写逻辑简单的小组件,遇到逻辑复杂的组件相较 class component 更难维护(不要跟我说逻辑拆分什么的)。
举个例子,我维护同事写的页面,如果是 class component 我一眼就能看明白整个组件结构,一下就能瞄到 componentDidMount
这是我个人的感想
我知道hooks和class component是完全两个不同的思想,但我说真的,react本身是适合写中大型项目的框架,这非常容易造成一个问题,团队技术不齐,加上hooks没有鲜明的声明周期函数(你必须自己封装useMount或使用第三方库比如react-use),这非常容易导致每个人都是张三丰,打出来的太极拳难以维护。对我来说 可维护性大于性能。 这里我不得不夸赞一下vue3,大家都是函数式,但vue3一眼看下去就非常有层次,至少我看起来不会脑壳疼,不像我看同事写的代码滚动条上下滑动却不知道从哪里入手。
举个例子: vue3的写法:
Vue3这种写法非常优雅,简直爱了,而要达到这种写法 react 要借助 mobx+react-use 外部库才能实现:
1 whincwu142 2020-09-12 15:52:00 +08:00 via Android 可以用类似 react-use 这样的库,加上自定义 hooks 封装逻辑,也是可以很清晰的,甚至更简单,当然对开发人员的要求也更高了 |
![]() | 2 KuroNekoFan 2020-09-12 16:27:33 +08:00 什么叫关注点分离啊(战术后仰 |
![]() | 3 dartabe 2020-09-12 16:42:25 +08:00 主要是自定义 hooks 很强大 最近的感觉 |
![]() | 4 zhuangzhuang1988 2020-09-12 17:11:53 +08:00 正常, react-hook 心智负担 也很大, 很容易出错, 而且难调试 |
![]() | 5 hoyixi 2020-09-12 17:22:34 +08:00 是有道理的,class 组件比较清晰,可以写的又臭又长。 如果你的 functional 组件写的大,useEffect 里长长一坨,那你该考虑提取功能了。例如上面朋友提到的,一些小功能封装成可重用的自定义 hooks |
![]() | span class="no">6 35aZ4P8mT576683q 2020-09-12 17:46:35 +08:00 via Android ![]() 不谈逻辑拆封还写什么代码 相关的状态应该封装成对象 想要明确的生命周期自己封装 useMount 或者使用 react-use 之类的库 用 hook 整个思维方式都要改变,不要老想着生命周期,要想着 synchronization. 举了一个例子就出来怼了,你说没有明确的 API, 我还说这精简了一个 API 呢 |
![]() | 7 murmur 2020-09-12 17:48:54 +08:00 类组件和胡克斯本身是两种思维方式, 但是 react 有个特殊之处,就是生命周期命名太尼玛长了,学 ios 那一套命名,前端又没有 idea 这么牛逼的 ide 帮你自动补全,相比之下 vue 就没那么多事,别人就是按类组件封装也打不了几个字。 |
![]() | 8 murmur 2020-09-12 17:49:17 +08:00 所以说又回到老生常谈的问题了,代码长短和质量、运行效率有关么? |
![]() | 9 love 2020-09-12 18:44:55 +08:00 via Android 没觉得代码更混乱,反而能更好的抽出公共部分,不过 react hooks 有硬伤倒是真的,有些地方比较费脑子 |
![]() | 10 nidaye999 2020-09-12 19:20:50 +08:00 我发现我喜欢用 react-hooks, 代码逻辑非常清晰。我再也不用 class 。 |
11 Jirajine 2020-09-12 19:34:47 +08:00 via Android ![]() hooks 才是 react 函数式的精髓,class 组件还不如用 vue 。 |
12 impl 2020-09-12 21:05:26 +08:00 via Android 记得 svelte 作者也说他不喜欢 hook |
![]() | 13 duan602728596 2020-09-12 21:59:04 08:00 最近的项目完全使用 react-hook 开发,是真的舒服。 在 react-hook 里就不要想着声明周期那一套,原来生命周期那一堆反而写起来很乱。 拿 useEffect 和生命周期函数做对比,是为了让开发者能了解 useEffect,在 class 组件和 function 组件内如何实现相同的功能。 ```Javascript // class class ClassComponent extends React.Component { constructor() { super(); this.state = { data: this.props.data, list: [] }; } componentDidUpdate(prevProps, prevState) { if (this.props.data !== prevProps.data) { // do something } if (this.state.list !== prevState.list) { // do something } if (this.props.data !== this.state.data) { // do something } } componentWillUnmount() { // do something 1 // do something 2 } } // function hook function FunctionComponent(props) { const [list, setList] = React.useState([]); React.useEffect(function() { // do something return function() {}; }, [props.data]); React.useEffect(function() { // do something }, [list]); } ``` class 组件的声明周期是渲染 /重新渲染 /组件卸载时,你需要自己来判断是哪些值变了,哪些值没变,所以在 class 组件的生命周期内可能会充斥着一堆的 if else 的判断。 function 组件的渲染 /重新渲染 /组件卸载,是由哪个值的变化引起的,然后执行这个值被依赖的 hook,即当这个值变化时,执行什么操作,反而更一目了然。 |
![]() | 14 lemon6 2020-09-13 00:54:10 +08:00 hooks 的优点就是代码量少,我个人还是喜欢用 class 因为组件结构可以看的很清晰 也容易维护 |
![]() | 16 lihongming 2020-09-13 01:12:48 +08:00 via iPhone 坚持一下,习惯就好了。我开始也不喜欢,现在两种写法都无感了,团队需要怎么写,我就怎么写。 我从开发者的角度感觉不出明显的好坏,但传说 hooks 的运行速度快 30%,所以新项目多用 hooks |
![]() | 17 Procumbens 2020-09-13 01:19:26 +08:00 ![]() @murmur #7 什么叫没有 idea 这么牛逼的 ide 帮你自动补全 VS Code + ES 7 React/Redux/GraphQL/React-Native snippets 打个 c 就可以选择 lifecycle function 了 |
18 timicoder 2020-09-13 08:37:29 +08:00 via Android 是不是就是 class 的继承呀 |
![]() | 19 ruandao 2020-09-13 08:48:42 +08:00 要不你试试 mobx |
![]() | 20 wxsm 2020-09-13 10:29:34 +08:00 via iPhone hooks 确实是一种进步,class 继承复用是硬伤。但是 hooks 学习成本较高,如果没有透彻的理解,半路上车开发很容易掉进坑里。这一点不如 class 明朗。 |
![]() | 21 wxsm 2020-09-13 10:40:39 +08:00 via iPhone ![]() 我举一个常见的例子,你要如何在 usecallback 里面访问变化的 state ?也许初学者会觉得直接访问就可以了,但是实际上不行。你必须用 useref 再对 state 进行一次包装,不然取到的永远是 state 的初始值。特别麻烦。相比来说,class 就简洁明朗得多。有些人就是无理由地喜欢函数式组件,简直跟处女情结一样,我觉得大可不必,这事要辩证地看。 |
![]() | 22 amundsen 2020-09-13 10:43:28 +08:00 我写 hooks 写的很爽,class 组件完全被抛弃了。 |
23 vision1900 2020-09-13 11:24:21 +08:00 使用自定义 hook 时候简直像魔法 魔法是个好东西,因为神奇 魔法不是个好东西,因为神奇 |
![]() | 24 StephenHe 2020-09-13 13:33:00 +08:00 感觉是 class 跟 hooks 一起用的问题。建议项目单用 class 、单用 hooks 。 |
25 mxT52CRuqR6o5 2020-09-13 13:57:13 +08:00 ![]() 官方说是推荐新代码全部用 hooks,我个人的实际体验是用 hooks 要把 class component 的生命周期那套东西全都忘掉,就像张三丰学太极拳那样 |
26 haleyao 2020-09-13 17:49:21 +08:00 react-hooks 这么好用的东西都变成心智负担了,你们开发者真难伺候 |
![]() | 28 devwolf 2020-09-14 10:56:16 +08:00 |
![]() | 29 devwolf 2020-09-14 10:59:16 +08:00 lz 加油,共勉吧。 我自己也知道 hooks 是个好东西,加上楼上的大佬们也都分析了,早学会早升值奥 |
![]() | 30 murmur 2020-09-14 11:00:05 +08:00 @duan602728596 这里又有一个老生常谈的问题,就是 useXXX 判断变量变化的比较标准是什么,新东西肯定会有新坑的 |
31 namelosw 2020-09-14 19:34:37 +08:00 via iPhone 你不喜欢是因为你不懂函数式编程,并不是 class 的可维护性更好。实际上 class 的可维护性更差。 要完全融会贯通可以练一练 OCaml 。React 是用 SML 和 OCaml 写的原型,hooks 可以算是回归初心。 |
32 Philippa 2020-09-14 20:48:35 +08:00 via iPhone hooks 我喜欢,太多逻辑就自定义 hooks,只要排好版合理分拆其实两种写法区别不大。不过楼主贴的 vue 看起来也不错啊,可要我选还是用 hooks,一般我很排斥包含有属性之类的东西,觉得 hooks 和纯函数写起来少点心智负担。 |
![]() | 33 KuroNekoFan 2020-09-16 15:28:54 +08:00 @wxsm 可以考虑用 setState 用函数形式然后再把参数原封不动返回去,没必要用 useRef,官方文档本身也不推荐用 useRef |