React内置的hooks函数解决了函数组件无法使用state
以及在传统写法中生命周期函数混乱和this
指向的问题。
而hooks所带来的组件复用性的提升则是由自定义hooks来体现的。
传统的组件复用多是渲染属性或者是高阶组件这两种方式,缺点除了写起来会相对复杂,还会造成组件层级过多。
先来看一个自定义hooks的例子:
function useSize(){
const [size. setSize] = useState({
height: document.documentElement.clientHeight,
width: document.documentElement.clientWidth
});
const onResize = useCallback(() => {
setSize({
height: document.documentElement.clientHeight,
width: document.documentElement.clientWidth
});
});
useEffect(() => {
window.addEventListener('resize', onResize);
return () => {
window.removeEventListener('resize, onResize')
}
}, []);
return size;
}
上面useSize
就是一个自定义的hooks函数,而在自定义的hooks一样是可以使用React内置的hooks函数的。
值得注意的是,onResize
这个回调函数是通过useCallback
返回的,这是为了保证最终移除监听事件的时候传给removeEventListener
的onResize
和刚开始监听时传给addEventListener
的onResize
句柄一致。
最后返回size
对象。
这样看起来自定义hooks函数实际上很像是一个函数组件,只是返回的内容不一样。
不过自定义hooks也是可以返回一段JSX的:
function useSizeMonitor(){
const size = useSize();
return (
<div>{size.width}x{size.height}</div>
);
}
上面这个自定义hooks函数就使用了之前定义的useSize
,然后返回了一段JSX,这就跟函数组件一样了。