React 与 TS 结合使用 Hook 总结

在学习 React 时,我们总会遇到在 TS 和 JS 之间切换来开发多个项目,而有时会忘记 TS 的语法,所以编写一下 React 结合 TS 开发时的一些总结知识点,以便后续回顾用。

**说明:**这只是总结 React 与 TS 结合使用时的写法回顾,并不是介绍钩子函数的使用。

使用 userState

这节主要是回顾 useState 钩子函数的 TS 的写法。实例如下:

type AuthUserProp = {
  name: string;
  email: string;
};

const UseStartProps: React.FC = () => {
  const [authUser, setAuthUser] = useState<AuthUserProp | null>(null);
  const [isLogin, setIsLogin] = useState<boolean>(false);

  return (
    <div>
      <h2>useStart 使用实例</h2>
      <button
        onClick={() => {
          setIsLogin(true);
          setAuthUser({ name: "Tom", email: "tom@example.com" });
        }}
      >
        登录
      </button>
      <button
        onClick={() => {
          setIsLogin(false);
          setAuthUser(null);
        }}
      >
        登出
      </button>
      {isLogin ? (
        <div>
          <p>{authUser?.name}</p>
          <p>{authUser?.email}</p>
        </div>
      ) : (
        <div>还未登录</div>
      )}
    </div>
  );
};

export default UseStartProps;

使用 useReducer

这节主要是回顾 useReducer 钩子函数的 TS 写法,以及 TS 联合类型 使用方式。实例如下:

type CounterState = {
  count: number;
};

type UpdateAction = {
  type: "increment" | "decrement";
  payload: number;
};

type ResetAction = {
  type: "reset";
};

type CounterAction = UpdateAction | ResetAction; // 因为重置操作并不需要type这个参数,所以通过TS的类型推导来做判断

const UseReducerProps: React.FC = () => {
  const initialState = { count: 0 };

  function reducer(state: CounterState, action: CounterAction) {
    switch (action.type) {
      case "increment":
        return { count: state.count + action.payload };
      case "decrement":
        return { count: state.count - action.payload };
      case "reset":
        return initialState;
      default:
        return state;
    }
  }

  const [state, dispatch] = useReducer(reducer, initialState);

  return (
    <div>
      <h2>useReducer 使用实例</h2>
      Count: {state.count}
      <button onClick={() => dispatch({ type: "increment", payload: 10 })}>
        添加 10
      </button>
      <button onClick={() => dispatch({ type: "decrement", payload: 10 })}>
        减去 10
      </button>
      <button onClick={() => dispatch({ type: "reset" })}>重置</button>
    </div>
  );
};

export default UseReducerProps;

使用 useContext

这节主要是回顾 useContext 钩子函数的 TS 写法,以及 useContext 于 useStart 钩子函数使用时的写法。实例如下:

  • userContext 钩子函数使用
// ThemeContext.tsx
type ThemeContextProviderProps = {
  children: React.ReactNode;
};

export const ThemeContext = createContext(theme);

export const ThemeContextProvider = ({
  children,
}: ThemeContextProviderProps) => {
  return (
    <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>
  );
};

// Box.tsx
const Box: React.FC = () => {
  const theme = useContext(ThemeContext);

  return (
    <div
      style={{
        backgroundColor: theme.secondary.main,
        color: theme.secondary.text,
      }}
    >
      Theme context
    </div>
  );
};

export default Box;
  • useContext 和 useStart 钩子函数使用
// UserContext.tsx
type AuthUser = {
  name: string;
  email: string;
};

type UserContextType = {
  user: AuthUser | null;
  setUser: React.Dispatch<React.SetStateAction<AuthUser | null>>;
};

type UserContextProviderProps = {
  children: React.ReactNode;
};

// 这里可以写成 export const UserContext = createContext({} as UserContextType),但是不建议这这样,这样做不好判断context的值是否为空
export const UserContext = createContext<UserContextType | null>(null);

export const UserContextProvider = ({ children }: UserContextProviderProps) => {
  const [user, setUser] = useState<AuthUser | null>(null);

  return (
    <UserContext.Provider value={{ user: user, setUser: setUser }}>
      {children}
    </UserContext.Provider>
  );
};

// User.tsx
export const User = () => {
  const userContext = useContext(UserContext);

  const handleLogin = () => {
    userContext?.setUser({
      name: "Vishwas",
      email: "asd@asd.com",
    });
  };

  const handleLogout = () => {
    userContext?.setUser(null);
  };
  return (
    <div>
      <button onClick={handleLogin}>Login</button>
      <button onClick={handleLogout}>Logout</button>
      <div>用户名: {userContext?.user?.name}</div>
      <div>用户邮箱: {userContext?.user?.email}</div>
    </div>
  );
};

使用 useRef

这节主要是回顾 useRef 钩子函数的 TS 写法。实例如下:

  • DOM 元素
export const DomRef = () => {
  const inputRef = useRef<HTMLInputElement>(null!);
  useEffect(() => {
    inputRef.current.focus();
  }, []);
  return (
    <div>
      <input type="text" ref={inputRef} />
    </div>
  );
};
  • 可变 ref(setTimeout 为例)
export const MutableRef = () => {
  const [timer, setTimer] = useState(0);
  const interValRef = useRef<number | null>(null);

  const stopTimer = () => {
    if (interValRef.current) {
      window.clearInterval(interValRef.current);
    }
  };
  useEffect(() => {
    interValRef.current = window.setInterval(() => {
      setTimer((timer) => timer + 1);
    }, 1000);
    return () => {
      stopTimer();
    };
  }, []);

  return (
    <div>
      HookTimer - {timer} -
      <button onClick={() => stopTimer()}>Stop Timer</button>
    </div>
  );
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Hooks是React 16.8引入的一种新的特性,可以让我们在函数组件中使用状态(state)和其他React特性。引用中的代码示例展示了如何在函数组件中使用React Hooks。在这个示例中,我们使用了useState来定义和管理组件的状态,使用了useEffect来处理副作用。useState接收一个初始值,并返回一个状态值和一个更新状态的函数。useEffect接收一个副作用函数和一个依赖数组,当依赖数组中的值发生变化时,副作用函数会被执行。这个示例还展示了如何使用React.FC类型来定义函数组件的props类型。在函数组件中,我们可以直接使用props来获取传入的属性值。 另外,引用中的命令 npx create-react-app ts-with-react --typescript 是用于创建一个React项目,并且使用TypeScript作为开发语言的。这个命令会自动创建一个基础的React项目结构,包括配置文件和示例代码。 如果你想在React项目中使用TypeScript,你需要确保已经安装了TypeScript和相关的开发工具。另外还可以使用yarn add cross-env命令安装cross-env包,用于在不同的环境中设置环境变量。修改package.json文件的scripts字段,可以设置启动、构建和测试等命令。通过运行yarn start命令,你可以启动React项目并在本地主机上运行。 总而言之,React Hooks是一种方便在函数组件中使用状态和其他React特性的方式。可以通过在函数组件中使用useState和useEffect来定义和管理状态以及处理副作用。同时,使用React.FC类型可以方便地定义函数组件的属性类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值