Day28 客制化Hook

昨天了解了Hook的概观之後,今天要利用Hook的规则打造一个客制化的Hook。
以下用React官网的范例,模拟一个判断是有订阅的人否在线的Component,如果他有上线且取消订阅时,一并清除他的上线状态。

//引用Hook中的useState、useEffect
import React, { useState, useEffect } from 'react';

//客制化Hook useFriendStatus,根据接收到的friendID回传订阅者上线状态
function useFriendStatus(friendID) {
//useState:回传值更新isOnline和setIsOnline
  const [isOnline, setIsOnline] = useState(null);

  function handleStatusChange(status) {
    setIsOnline(status.isOnline);
  }
//根据friendID、handleStatusChange的值执行API
  useEffect(() => {
    ChatAPI.subscribeToFriendStatus(friendID, handleStatusChange);
    return () => {
      ChatAPI.unsubscribeFromFriendStatus(friendID, handleStatusChange);
    };
  });

  return isOnline;
}

将上线状态当作变数,分别使用在有需要的Component上面。

//订阅者状态
function FriendStatus(props) {
  const isOnline = useFriendStatus(props.friend.id);

  if (isOnline === null) {
    return 'Loading...';
  }
  return isOnline ? 'Online' : 'Offline';
}
//根据订阅状态显示订阅者姓名
function FriendListItem(props) {
  const isOnline = useFriendStatus(props.friend.id);

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

每一次呼叫一个 Hook 都可以取得一个完全独立的state,可以根据不同的Component去重复使用。
客制化Component在命名上会以use作为开头,不仅可以方便其他专案合作人员理解它是一个客制化Hook,日後在管理维护时也比较方便。


<<:  day28_ARM 也想来挖矿(上)

>>:  Day 29:Playbook 的模组化

[Day20] Tableau 轻松学 - Calculated Field

前言 Tableau Desktop 让我们不用写到一行程序就能进行资料探索,但不代表我们不能撰写程...

新手应该要学什麽程序语言?

Photo by Victoriano Izquierdo on Unsplash 文章同步发布於...

【Docker】03 使用Wordpress官方Image

摘要 建立一个 container 集合体,包含两个 container, db 跟 wordpre...

【D2】工具介绍

前言 在真正开始前,不免俗的需要介绍一下工作环境,让大家可以顺利地前进。因此在这边会稍微介绍一下使用...

Day 7 - 文字使用方式

字体大小 相信大家以往在写 CSS 时,也有写过像这种 text-12、font-12 看起来很聪明...