从 Vue 转到 React 快要一年了,虽然写页面用哪个不是搬砖?但实际经历过用两种框架搬砖,还是有所感触的。本文不是什么源码解析,也不是要分个高低,甚至会刻意避开一些技术上的细节,单纯谈谈我个人从 Vue 转 React 后的一些感受上的变化,更偏向感性的认知,并没有什么技术干货。
设计理念
“我写 Vue 的时候,从来都不会考虑这些。”
这是我刚接触一两个月时,最直接的感受。在写 Vue 代码时,不会去想这是什么副作用,有请求就调用方法,有渲染没生效就 nextTick ,也没有受控组件的概念, UI = f(State) 这个公式,仿佛离我很远。
关于受控这块,有经历过困惑的时候,也知道 Vue 内部对原生 input 标签做了处理,但还是没有写受控组件的意识。之前在写树组件时,用 v-model
去控制了 selected
属性跟 checked
属性,但是 v-model
只能控制一个属性的 value
跟 onChange
,多出来的属性,用 v-sync
总不是很舒服,而且当时本着需要传的 Props 能少就少的想法,提供了许多组件方法,让外部通过 this.$refs.xxx()
来控制子组件内部的状态。这个版本发布不久,我就后悔了,提供了这么多方法给外部来控制内部的状态,虽然当时也没有什么状态的概念,维护起来总有种莫名的难受,也可能是响应式带来的麻烦,我即想响应 value
属性,又想响应 data
属性,来决定选中的内容。
种种结合起来,虽然在 Vue 组件里最终都能解决,但总感觉不优雅,刚发布了 2.0 版本就想再重构,却无从下手。
Vue 对各种概念、场景都尽可能封装起来,帮你做了很多事情,所以你可以不用知道许多概念,就能直接上手。而且 Vue 的限制不多,以前开发表单这种有深层对象的东西,子组件直接修改传入的 Props 更是家常便饭,虽然我们都知道这是不好的。
或许是老外不用 996 ,又或许是自己真的菜, React 能有这么一套理念,这么多的概念可以推广。
刚上手 React 的那段时间,最经常遇到的疑惑就是:
- 怎么又无限循环了?
style
跟 className
为什么不能直接传进去?
- re-render 了好多次耶,不过好像没啥影响,不管了吧?
- 状态提升太难受了吧,业务稍微变一下,内部的状态要提升到天上去了
- 每次 re-render 都创建了新的函数、新的对象,真的没事吗?
- 又要把状态提出来,父组件直接调用子组件的方法不香吗?
- 在请求返回后的
then
函数里调用两次 setState
, effect 执行了两次?