Jenis '{}' tidak mempunyai atribut ''
P粉615829742
P粉615829742 2024-03-26 12:53:22
0
1
366

Saya cuba menyediakan cangkuk konteks untuk halaman log masuk saya. Saya menggunakan skrip taip. Saya memulakan cangkuk konteks tetapi saya menghadapi masalah dengan pengisytiharan jenis. Apabila saya cuba menggunakan setUser ralat berikut muncul: Property 'setUser' tidak wujud pada jenis '{}'.

Ini adalah cangkuk konteks saya setakat ini.

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>
    )
}

Ini kod log masuk saya.

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粉615829742
P粉615829742

membalas semua(1)
P粉998100648

Anda memerlukan UserContext 变量指定类型。因为您在 createContext 中为其指定了 {} 参数,所以 Typescript 假定上下文的类型为 React.Context<{}>。因此,当您尝试使用上下文对象时,您会得到一个 {} untuk

, objek kosong, yang tidak mempunyai sifat yang ditentukan pengguna.

Mula-mula saya akan mentakrifkan antara muka baharu, tetapi anda boleh menaipnya jika anda mahu.

interface IUserContext {
  user: any;
  setUser: any; //set your definitions here (please don't use `any`)
}
UserContextUntuk mengisytiharkan jenis anda boleh:
  1. Sediakan nilai lalai yang sepadan dengan jenis
  2. export const UserContext = createContext("");
    
  3. Tetapkan nilai konteks lalai kepada objek kosong/null
  4. export const UserContext = createContext({});
    export const UserContext = createContext(null);
    
  5. Penukaran jenis objek kosong (keselamatan jenis lemah)
  6. export const UserContext = createContext({} as IUserContext);
    
  7. Penegasan bukan nol (keselamatan jenis buruk)
  8. export const UserContext = createContext(null!);
    

Perhatikan bahawa untuk sesetengah daripada ini, anda perlu menulis semakan nol kemudian. Lihat di sini

untuk maklumat lanjut. 🎜
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan