我发现我不喜欢用 react-hooks

2020-09-12 15:38:05 +08:00
 cl903254852

react-hooks 更适合写逻辑简单的小组件,遇到逻辑复杂的组件相较 class component 更难维护(不要跟我说逻辑拆分什么的)。

举个例子,我维护同事写的页面,如果是 class component 我一眼就能看明白整个组件结构,一下就能瞄到 componentDidMount

这是我个人的感想

5229 次点击
所在节点    程序员
33 条回复
whincwu142
2020-09-12 15:52:00 +08:00
可以用类似 react-use 这样的库,加上自定义 hooks 封装逻辑,也是可以很清晰的,甚至更简单,当然对开发人员的要求也更高了
KuroNekoFan
2020-09-12 16:27:33 +08:00
什么叫关注点分离啊(战术后仰
dartabe
2020-09-12 16:42:25 +08:00
主要是自定义 hooks 很强大 最近的感觉
zhuangzhuang1988
2020-09-12 17:11:53 +08:00
正常, react-hook 心智负担 也很大, 很容易出错, 而且难调试
hoyixi
2020-09-12 17:22:34 +08:00
是有道理的,class 组件比较清晰,可以写的又臭又长。

如果你的 functional 组件写的大,useEffect 里长长一坨,那你该考虑提取功能了。例如上面朋友提到的,一些小功能封装成可重用的自定义 hooks
liberty1900
2020-09-12 17:46:35 +08:00
不谈逻辑拆封还写什么代码
相关的状态应该封装成对象
想要明确的生命周期自己封装 useMount 或者使用 react-use 之类的库
用 hook 整个思维方式都要改变,不要老想着生命周期,要想着 synchronization.
举了一个例子就出来怼了,你说没有明确的 API, 我还说这精简了一个 API 呢
murmur
2020-09-12 17:48:54 +08:00
类组件和胡克斯本身是两种思维方式,

但是 react 有个特殊之处,就是生命周期命名太尼玛长了,学 ios 那一套命名,前端又没有 idea 这么牛逼的 ide 帮你自动补全,相比之下 vue 就没那么多事,别人就是按类组件封装也打不了几个字。
murmur
2020-09-12 17:49:17 +08:00
所以说又回到老生常谈的问题了,代码长短和质量、运行效率有关么?
love
2020-09-12 18:44:55 +08:00
没觉得代码更混乱,反而能更好的抽出公共部分,不过 react hooks 有硬伤倒是真的,有些地方比较费脑子
nidaye999
2020-09-12 19:20:50 +08:00
我发现我喜欢用 react-hooks, 代码逻辑非常清晰。我再也不用 class 。
Jirajine
2020-09-12 19:34:47 +08:00
hooks 才是 react 函数式的精髓,class 组件还不如用 vue 。
impl
2020-09-12 21:05:26 +08:00
记得 svelte 作者也说他不喜欢 hook
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,即当这个值变化时,执行什么操作,反而更一目了然。
lemon6
2020-09-13 00:54:10 +08:00
hooks 的优点就是代码量少,我个人还是喜欢用 class 因为组件结构可以看的很清晰 也容易维护
hgjian
2020-09-13 00:59:40 +08:00
@lemon6 凌晨一点了
lihongming
2020-09-13 01:12:48 +08:00
坚持一下,习惯就好了。我开始也不喜欢,现在两种写法都无感了,团队需要怎么写,我就怎么写。

我从开发者的角度感觉不出明显的好坏,但传说 hooks 的运行速度快 30%,所以新项目多用 hooks
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 了
timicoder
2020-09-13 08:37:29 +08:00
是不是就是 class 的继承呀
ruandao
2020-09-13 08:48:42 +08:00
要不你试试 mobx
wxsm
2020-09-13 10:29:34 +08:00
hooks 确实是一种进步,class 继承复用是硬伤。但是 hooks 学习成本较高,如果没有透彻的理解,半路上车开发很容易掉进坑里。这一点不如 class 明朗。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/706395

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX