2022 第32週 學習筆記:在 react app 中實作 event driven pattern

總結

最近在開發的功能規模不大,適合用 event driven pattern 來實作,此篇筆記記錄一下開發時收到的建議與心得

筆記

建立事件

interface TokenLoginEvent {
  token: string;
}
enum AUTH_EVENT {
  TOKEN_LOGIN = 'TOKEN_LOGIN',
  LOGOUT = 'LOGOUT',
}
function dispatchTokenLoginEvent(): void {
  const event = new CustomEvent<TokenLoginEvent>(AUTH_EVENT.TOKEN_LOGIN, {
    detail: { token: 'a very long token' },
  });
  document.dispatchEvent(event);
}

function dispatchLogoutEvent(): void {
  const event = new Event(AUTH_EVENT.LOGOUT);
  document.dispatchEvent(event);
}

監聽事件

function handleLogout(): void {
  // run the logout logic
  console.info('receive logout event.');
}
function handleLoginByToken(e: Event): void {
  // run the logic of login by token
  const event = e as CustomEvent<TokenLoginEvent>;
  console.info(`receive login by token event, token: ${event.detail.token}.`);
}

useEffect(() => {
  document.addEventListener(AUTH_EVENT.LOGOUT, handleLogout);
  document.addEventListener(AUTH_EVENT.TOKEN_LOGIN, handleLoginByToken);
  return () => {
    document.removeEventListener(AUTH_EVENT.LOGOUT, handleLogout);
    document.removeEventListener(AUTH_EVENT.TOKEN_LOGIN, handleLoginByToken);
  };
}, []);

在需要取出 CustomEvent 夾帶的 detail 資料時,透過 TypeScript as operator 讓 TS 將 event 認定為 CustomEvent<TokenLoginEvent> 型別,再從 detail 中取出對應的內容

小結

參考文件