react如何使用useContext + TS 自定义hooks

为了在 TypeScript 中为 useContext 提供良好的类型提示,我们需要为 Context 定义类型,并确保在创建和使用 Context 时应用这些类型。这可以帮助我们获得更好的类型检查和智能提示。

示例:在用户认证示例中添加 TypeScript 类型

  1. 定义类型

首先,定义与 Context 相关的数据结构和类型。


// 定义用户和认证状态的类型
interface User {
  username: string;
}

interface AuthContextType {
  user: User | null;
  login: (username: string) => void;
  logout: () => void;
}
  1. 创建 Context 并提供值

在创建和使用 Context 时应用这些类型。


import React, { createContext, useContext, useState, ReactNode } from 'react';

// 创建 Context,初始值为 undefined
const AuthContext = createContext<AuthContextType | undefined>(undefined);

interface AuthProviderProps {
  children: ReactNode;
}

export function AuthProvider({ children }: AuthProviderProps) {
  const [user, setUser] = useState<User | null>(null);

  const login = (username: string) => {
    setUser({ username });
  };

  const logout = () => {
    setUser(null);
  };

  // 提供的值包含用户状态和登录、登出函数
  const value = {
    user,
    login,
    logout,
  };

  return (
    <AuthContext.Provider value={value}>
      {children}
    </AuthContext.Provider>
  );
}

export function useAuth() {
  const context = useContext(AuthContext);
  if (context === undefined) {
    throw new Error('useAuth must be used within an AuthProvider');
  }
  return context;
}
  1. 在组件中使用 Context

当我们在组件中使用 useAuth 时,TypeScript 将提供准确的类型提示。


import React from 'react';
import { useAuth, AuthProvider } from './AuthContext';

function UserProfile() {
  const { user, logout } = useAuth();

  return (
    <div>
      {user ? (
        <>
          <p>Welcome, {user.username}!</p>
          <button onClick={logout}>Logout</button>
        </>
      ) : (
        <p>Please log in.</p>
      )}
    </div>
  );
}

function LoginForm() {
  const { login } = useAuth();

  const handleLogin = () => {
    login('username');
  };

  return (
    <button onClick={handleLogin}>Login</button>
  );
}

function App() {
  return (
    <AuthProvider>
      <UserProfile />
      <LoginForm />
    </AuthProvider>
  );
}

export default App;

总结

通过在 Context 和相关函数中添加类型定义,我们可以在 TypeScript 中获得更好的类型检查和智能提示。这些类型定义有助于捕获潜在的错误,并使代码更易于维护和理解。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值