Maison > Questions et réponses > le corps du texte
J'essaie de mettre en place un hook contextuel pour ma page de connexion. J'utilise du tapuscrit. J'ai démarré le hook contextuel mais j'ai des problèmes avec les déclarations de type. Lorsque j'essaie d'utiliser setUser, l'erreur suivante apparaît : La propriété 'setUser' n'existe pas sur le type '{}'.
C'est mon crochet contextuel jusqu'à présent.
import { createContext, ReactNode, useEffect, useState } from "react" interface Props { children?: ReactNode } export const UserContext = createContext({}) export function UserContextProvider({children}: Props) { const [user, setUser] = useState(null) return ( <UserContext.Provider value={{user, setUser}}> {children} </UserContext.Provider> ) }
Voici mon code de connexion.
import { Link, Navigate } from "react-router-dom" import axios from 'axios' import { UserContext } from "../UserContext" const Login = () => { const [email, setEmail] = useState('') const [password, setPassword] = useState('') const [redirect, setRedirect] = useState(false) **const {setUser} = useContext(UserContext)** async function handleLogin(e: any) { e.preventDefault() try { const userInfo = await axios.post('/auth/login', {email, password}) setUser(userInfo) alert('Login') setRedirect(true) } catch (e) { alert('Login failed') } } if(redirect){ return <Navigate to={'/'} /> } return ( <div> <div> <h1>Login</h1> <form onSubmit={handleLogin}> <input type="email" placeholder="your@email.com" value={email} onChange={e => setEmail(e.target.value)}/> <input type="password" placeholder="password" value={password} onChange={e => setPassword(e.target.value)}/> <button>Login</button> <div> Don't have an account? <Link to={"/auth/register"}> Sign Up</Link> </div> </form> </div> </div> ) } export default Login
P粉9981006482024-03-27 00:40:12
Vous avez besoin de UserContext
变量指定类型。因为您在 createContext
中为其指定了 {}
参数,所以 Typescript 假定上下文的类型为 React.Context<{}>
。因此,当您尝试使用上下文对象时,您会得到一个 {}
pour
Je vais d'abord définir une nouvelle interface, mais vous pouvez la saisir si vous le souhaitez.
interface IUserContext { user: any; setUser: any; //set your definitions here (please don't use `any`) }
UserContext
Pour déclarer le type de vous pouvez : export const UserContext = createContext(" ");
export const UserContext = createContext({}); export const UserContext = createContext (null);
export const UserContext = createContext({} as IUserContext);
export const UserContext = createContext(null!);
Notez que pour certains d’entre eux, vous devrez rédiger des chèques nuls plus tard. Voir ici
pour plus d'informations. 🎜