ts传入的参数,要定义类型, interface

  1. ...(() => {}) 结构空函数,返回一个空对象

Event

  1. function onScrollChange(e: React.WheelEvent) {
  2. const top = (e.target as HTMLElement).scrollTop;
  3. }
  1. function useDebounce(callback: () => void, value ?: number, ms: unknow) {}
  2. // 限制键值对
  3. function cleanObject(object: {[key: string]: unknown}) {}

useDocumentTitle

  1. import { useEffect, useRef, useMemo } from 'react';
  2. function useDocumentTitle1(title: string, keepOnUnmount: boolean = true) {
  3. const oldTitle = document.title;
  4. useEffect(() => {
  5. document.title = title;
  6. }, [title]);
  7. useEffect(() => {
  8. return () => {
  9. if (keepOnUnmount) return;
  10. // 如果不指定依赖,获取到的title就是初始的title
  11. document.title = oldTitle;
  12. };
  13. }, [])
  14. }
  15. // 修改页面标题
  16. function useDocumentTitle(title: string, keepOnUnmount: boolean = true) {
  17. const oldTitle = useRef(document.title).current;
  18. useEffect(() => {
  19. document.title = title;
  20. }, [title]);
  21. useEffect(() => {
  22. return () => {
  23. if (keepOnUnmount) return;
  24. document.title = oldTitle;
  25. };
  26. }, [keepOnUnmount, oldTitle]);
  27. }

useParams

  1. import { useSearchParams, URLSearchParamsInit } from 'react-router-dom';
  2. // 获取URL的参数,指定 key的值
  3. function useUrlQueryParams2(keys: string[]) {
  4. const [state, setState] = useSearchParams();
  5. const params = keys.reduce((prev, key) => {
  6. return {...prev, [key]: state.get(key) || ''}
  7. }, {} as {[key in string]: string})
  8. return [
  9. params,
  10. setState
  11. ] as const
  12. }
  13. function useUrlQueryParams3<K extends string>(keys: K[]) {
  14. const [state, setState] = useSearchParams();
  15. const params = useMemo(() => {
  16. return keys.reduce((prev, key) => {
  17. return { ...prev, [key]: state.get(key) || "" };
  18. }, {} as { [key in K]: string });
  19. }, [state]);
  20. return [params, setState] as const;
  21. }
  22. function useUrlQueryParams<K extends string>(keys: K[]) {
  23. const [state, setState] = useSearchParams();
  24. const params = useMemo(() => {
  25. return keys.reduce((prev, key) => {
  26. return { ...prev, [key]: state.get(key) || "" };
  27. }, {} as { [key in K]: string });
  28. }, [state]);
  29. return [
  30. params,
  31. (param: Partial<{[key in K]: unknown}>) => {
  32. const values = {...Object.fromEntries(state), ...param} as URLSearchParamsInit;
  33. return setState(values)
  34. }
  35. ] as const;
  36. }
  37. // useUrlQueryParams(['user', 'tenant'])

形参Props

  1. interface SearchProps {
  2. users: User[],
  3. params: {
  4. name: string;
  5. id: number;
  6. },
  7. setParams: (params: SearchProps['params']) => void,
  8. }
  9. function Search({users, params, setParams}: SearchProps) {}

image.png

类型守卫

类型守卫.jpg

Props组件封装

ComponentProps
Omit
select.jpg

useHooks封装注意

2021-10-03_25.jpg

tuple

  1. export const useProjectModal = () => {
  2. const [{ projectCreate }, setProjectCreate] = useUrlQueryParam([
  3. "projectCreate",
  4. ]);
  5. const [{ editingProjectId }, setEditingProjectId] = useUrlQueryParam([
  6. "editingProjectId",
  7. ]);
  8. const setUrlParams = useSetUrlSearchParam();
  9. const { data: editingProject, isLoading } = useProject(
  10. Number(editingProjectId)
  11. );
  12. const open = () => setProjectCreate({ projectCreate: true });
  13. const close = () => setUrlParams({ projectCreate: "", editingProjectId: "" });
  14. const startEdit = (id: number) =>
  15. setEditingProjectId({ editingProjectId: id });
  16. return {
  17. projectModalOpen: projectCreate === "true" || Boolean(editingProjectId),
  18. open,
  19. close,
  20. startEdit,
  21. editingProject,
  22. isLoading,
  23. };
  24. };

openmodal.jpg

  1. import { URLSearchParamsInit, useSearchParams } from "react-router-dom";
  2. export const useUrlQueryParam = <K extends string>(keys: K[]) => {
  3. const [searchParams] = useSearchParams();
  4. const setSearchParams = useSetUrlSearchParam();
  5. const [stateKeys] = useState(keys);
  6. return [
  7. useMemo(
  8. () =>
  9. subset(Object.fromEntries(searchParams), stateKeys) as {
  10. [key in K]: string;
  11. },
  12. [searchParams, stateKeys]
  13. ),
  14. (params: Partial<{ [key in K]: unknown }>) => {
  15. return setSearchParams(params) // iterator
  16. },
  17. ] as const;
  18. };