函数式组件依然是【外部数据=>view】的映射,依然是pure function的心智模型。只不过现在外部数据不仅仅包括props和context,还包括state。
事实上,未来的并发模式就要求你使用pure function的心智模型来编写函数式组件,否则很容易出bug。
state是一种外部数据
有同学可能会问:“你在逗我吧?都useState了你还pure呢???”
但是你发现没有,react对hooks的种种限制,不就是为了让你把useState等hooks声明在函数组件的开头?useState状态声明在概念上相当于静态声明,不会因为【props这种运行时因素】的变化而改变。你完全能写个代码分析工具,无需运行代码就能收集所有状态声明。
静态声明一个state,不就相当于用一个Wrapper组件来持有这个状态,然后传给它?那这个state不就可以理解为一种外部输入?举个例子:
function Comp1() {
const [count, setCount] = useState(0);
return <h1>{count}</h1>;
}
相当于是
import React, { useState } from "react";
function MyComp(props) {
return <h1>{props.count}</h1>;
}
class MyCompWrapper extends React.Component {
state = {
count: 1,
};
add = () => {
this.setState({
count: this.state.count + 1,
});
};
render() {
return (
<>
<button onClick={this.add}>add 1</button>
<MyComp count={this.state.count} />
</>
);
}
}
export default MyCompWrapper;
后者看起来更像是在写纯函数了吧,但是两者其实是等价的啊!那么useState是不是就可以看作是一种语法糖,用来声明它的Wrapper应该持有哪些状态!只不过React内核会自动帮你生成这些MyCompWrapper,管理状态并将它注入给MyComp。
这里只是讲心智模型,内部实现肯定会更加高效。内部实现实际将组件状态放在组件实例对应的Fiber节点里面。
作者:csr632
链接:https://www.zhihu.com/question/343314784/answer/937174224
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。