如果没有 hooks 编写 class 使用 state 以及其他 react 特性会是怎样呢?能否举例说明一下?
Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。
请问下,如果没有 hooks 编写 class 使用 state 以及其他 react 特性会是怎样呢?能否举例说明一下?
我指的是,使用hooks编写代码会带来哪些好处?
回复
1个回答

test
2024-07-11
你可以先复习一下初中语文,学会造长句、加逗号、起标题。
首先回答标题:如果没有 hooks,编写 class 的情况下使用 state 以及其他的 React 特性会是怎样的?
这句话的核心在于“使用 state”,但是加了两个限制条件“没有 hooks”和“编写 class”,这就是 hooks 出现之前,React 的一般玩法:
class Counter extends React.Component {
state = {
count: 0
};
render(){
const { count } = this.state;
return (
<button
onClick={() => { this.setState({ count: count+1 }) }}
>
点击次数:{count}
</button>
)
}
}
👆 class 组件实例化之后,每个实例相当于有自己的一片天地,自己在里面维持一个状态是天经地义的。
再回答问题描述里的问题:使用hooks编写代码会带来哪些好处?
事实上,单就 hooks 来看,它并没有带来任何好处,它只是弥补了函数式组件的一个固有缺陷而已,这个固有缺陷就是纯函数没有状态。像上面例子中的 count
功能,用来记录按钮的点击次数,很简单对不对?但是如果使用纯函数是做不到的,使用纯函数就像有些公司频繁换领导一样,上一届领导做到一半的事情,接任的领导可能不会继续完成。你可能会想到用全局变量或者 IIFE:
let count = 0;
function Counter(){
return (
<button
onClick={() => { count++ }}
>
点击次数:{count}
</button>
)
}
确实也可以计数,但是每次执行 Counter
指向的都是同一个 count
,导致 Counter
不能复用。
你可能会想到由父组件传递:
function Counter(state = { count:0 }){
const { count } = state;
return (
<button
onClick={() => { state.count++ }}
>
点击次数:{count}
</button>
)
}
这样确实可以,唯一的问题就是:父组件的 state
又该怎么管理呢,不管理最终还是记不住?这样推导下去,最终一定会有一个根组件需要管理 state
。
不过我其实是比较中意这种写法的,state
不一定要由父组件显式传入,而是由调度机制默认注入,剩下的问题在于注入的内容不便于扩展。
除此之外,milkdown 组件的那种“先初始化为组件、再声明渲染逻辑”的点子也很妙,对 React 稍加改造,就可以实现类似的编码方式:
function Counter({ initState }){
const [setState, getState] = initState(0);
return () => {
const count = getState();
return <button
onClick={() => { setState(count+1) }}
>
点击次数:{count}
</button>
{
}
但这种写法似乎也存在可扩展性的问题。
回到这些方案试图解决的问题——“纯函数没有状态”,而 hooks解决了纯函数没有状态的问题。React 的其他特性,不能用纯函数解决的部分,归根结底也不过是状态的问题。
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容