sfsoul / personalBlog

思考与总结
MIT License
1 stars 0 forks source link

React Hook #12

Open sfsoul opened 4 years ago

sfsoul commented 4 years ago

Hook 简介

Hook 可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。

Hook 产生的动机

使用 Effect Hook

可以把 useEffect Hook 看做 componentDidMountcomponentDidUpdatecomponentWillUnmount 这三个函数的组合。

需要清除的 effect

如果 effect 返回一个函数,React 将会在执行 清除操作时调用它。

按时间列出一个可能会产生的订阅和取消订阅操作调用序列:

// Mount with { friend: { id: 100 } } props
ChatAPI.subscribeToFriendStatus(100, handleStatusChange);     // 运行第一个 effect

// Update with { friend: { id: 200 } } props
ChatAPI.unsubscribeFromFriendStatus(100, handleStatusChange); // 清除上一个 effect
ChatAPI.subscribeToFriendStatus(200, handleStatusChange);     // 运行下一个 effect

// Update with { friend: { id: 300 } } props
ChatAPI.unsubscribeFromFriendStatus(200, handleStatusChange); // 清除上一个 effect
ChatAPI.subscribeToFriendStatus(300, handleStatusChange);     // 运行下一个 effect

// Unmount
ChatAPI.unsubscribeFromFriendStatus(300, handleStatusChange); // 清除最后一个 effect
sfsoul commented 4 years ago

Hook 使用规则

只在最顶层使用 Hook

不要在循环,条件或嵌套函数中调用 Hook,确保总是在 React 函数的最顶层调用它们。

 // error:在条件语句中使用 Hook 违反第一条规则
  if (name !== '') {
    useEffect(function persistForm() {
      localStorage.setItem('formData', name);
    });
  }
// correct
useEffect(function persistForm() {
    // 👍 将条件判断放置在 effect 中
    if (name !== '') {
      localStorage.setItem('formData', name);
    }
  });

只在 React 函数中调用 Hook

不要在普通的 JavaScript 函数中调用 Hook,可以:

sfsoul commented 4 years ago

自定义 Hook

通过自定义 Hook,可以将组件逻辑提取到可重用的函数中。

sfsoul commented 4 years ago

Hooks FAQ

Hooks FAQ