hooks.tsx 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import {menuStore} from '@stores';
  2. import {ParseMenuType} from '@utils';
  3. import {useEffect, useState} from 'react';
  4. import {useLocation, useNavigate} from 'react-router-dom';
  5. import {useStore} from 'zustand';
  6. export function useOpenKey(menus: ParseMenuType[]) {
  7. const navigate = useNavigate();
  8. const {pathname} = useLocation();
  9. const pages = useStore(menuStore, state => state.menus);
  10. const [current, setCurrent] = useState<string[]>(function() {
  11. const firstKey = menus[0]?.children ? menus[0].children[0].key : menus[0].key;
  12. return [firstKey];
  13. });
  14. const [openKeys, setOpenKey] = useState<string[]>(current);
  15. function onOpenChange(keys: string[]) {
  16. setOpenKey([keys[keys.length - 1]]);
  17. }
  18. function onClick(e: {key: string, keyPath: string[]}) {
  19. setOpenKey(e.keyPath);
  20. const data = pages.find(val => val.id === e.key);
  21. if (!data) return;
  22. navigate(data.url);
  23. }
  24. useEffect(function() {
  25. const route = pages.find(val => val.url === pathname);
  26. if (!route) return;
  27. if (route.id !== current[0]) setCurrent([route.id]);
  28. }, [current, pages, pathname]);
  29. return [{openKeys, current}, {onOpenChange, onClick}] as const;
  30. }