My Little World

一些其他小问题

1.
在 useEffect 中如果使用了某些变量,却没有在依赖项中指定,会发生什么呢?

依赖那里没有传任何参数的话,会每次render都执行。
依赖项有传值但是,有部分依赖没有传,那么没有传的那部分,数据即使变化也不会执行副作用。

对于这节课中显示的 Blog 文章的例子,我们在 useEffect 中使用了 setBlogContent 这样一个函数,本质上它也是一个局部变量,那么这个函数需要被作为依赖项吗?为什么?

函数应该是不会变化的,所以不需要监听。

2.
useState 其实也是能够在组件的多次渲染之间共享数据的,那么在 useRef 的计时器例子中,能否用 state 去保存 window.setInterval() 返回的 timer 呢?

可以,只是没有 useRef 更优,因为在更新 state 值后会导致重新渲染,而 ref 值发生变化时,是不会触发组件的重新渲染的,这也是 useRef 区别于 useState 的地方。

3.
componentWillUnmount 近似的实现:组件销毁和文章 id 变化时执行。那么在函数组件中如果要实现严格的 componentWillUnmount,也就是只在组件销毁时执行,应该如何实现?\

1
2
3
4
5
useEffect(() => {
return () => {
// 这里只会在组件销毁前(componentWillUnmount)执行一次
}
}, [])

4.
每次调用 useArticle 这个 Hook 的时候都会触发副作用去获取数据。
但是有时候,我们希望在有些组件自动获取,但有的组件中需要点击某个按钮才去获取数据,那么你会如何设计这个 Hook?(可能这道题有一点难度。)

useArticle Hook 可以提供一个参数,用来标记本地调用是否默认触发副作用去获取数据;对于点击按钮才触发请求的功能,可以在 Hook 中将获取数据的方法 retrn 出去,供外部自由调用。

  1. Hook 一般都是使用的 useState 保存了状态数据,也就意味着状态的范围限定在组件内部,组件销毁后,数据就没了。那么如果希望数据直接缓存到全局状态,应该如何做呢?

可以借助 redux,配合 useContext 等 api ,将状态数据存储至全局中。