【Day 29】Hook 09:自定义 Hook(Custom hook)

打造自己的 Hook

自 React 16.8 以後,
使用者就可以在 React 中
创建自定义的 Hook,
将重复使用的功能模组化、
封装常用的业务逻辑,
利用其他 Hook 打造自己的 API。


关於 Custom hook

  • 是一个 JavaScript function
  • 拥有自己的 state
  • 内部可呼叫、自行组合所有原生 Hook,甚至是另一个 Custom hook
  • 必须以「use」为开头命名
    • 如果没有这个开头,React 无法知道里面包含对 Hook 的呼叫,因此无法自动检查是否有违反 Hook 的行为

自定义的 Hook 是一个遵循 Hook 规则
可重复使用的 function。

Custom hook 不包含 UI,
不需要额外创建一个 component,
Custom hook 的内部拥有独立的 state,
且可自行决定传入的参数与回传值
(或者也可以没有回传值),
并同样能够使用其他 Hook。

如果有个常用的 function,
但不需要在 DOM 上渲染任何东西,
Custom hook 会是一个很好的选择。


使用范例

【useFriendStatus.js】

function useFriendStatus(friendID) {
  const [isOnline, setIsOnline] = useState(null);

  // ...

  return isOnline;
}

【FriendStatus.js】

function FriendStatus(props) {
  const isOnline = useFriendStatus(props.friend.id);

  if (isOnline === null) {
    return 'Loading...';
  }
  return isOnline ? 'Online' : 'Offline';
}

【FriendListItem.js】

function FriendListItem(props) {
  const isOnline = useFriendStatus(props.friend.id);

  return (
    <li style={{ color: isOnline ? 'green' : 'black' }}>
      {props.friend.name}
    </li>
  );
}

参考资料


总结:

今年的铁人赛就在此完赛了,
这 30 天日更,刚好把 React 的部分结束,
(或者说.....居然才把 React 的部分写完?)
之後就再陆续把 Redux 与其他周边套件补上吧。

接触 React 到现在刚好满一年,
也成为了资历两年多的 junior engineer,
接下来也继续努力探索前端的世界罗。


<<:  Day29【Web】网页的会员卡:Session

>>:  回顾过去四年与未来展望 (?)

[Day 29] 使用ChromeDriver来做单元测试(二)

接下来我们新增一个测试档案 php artisan dusk:make UserDriverTest...

[DAY19] 跟 Vue.js 认识的30天 - Vue 自定义指令(`directive`)

在粗浅的看过这一章时,觉得 Vue 真的有好多功能啊,目前的我似乎还是没办法很熟用 Vue 的每项语...

[Day8] Docker 介绍

在前几篇文章我们学习了Django的基本专案建置, 相信大家在安装过程当中多少都会碰到一些问题,以及...

28 - lint-staged - Lint Git Commit 的档案

做 lint 、 format 或是通过测试,对於程序码的品质维护有很大的帮助,因此在提交代码时,我...

Day 01 - 前言

yo~ 原本写好了几个字 改一下主题就全清空拉 很QQ馁 不免俗的,这也是小女子第一次参加铁人赛 ...