【问题标题】:Typescript Unhandled Rejection (TypeError): setAuthTokens is not a functionTypescript Unhandled Rejection (TypeError):setAuthTokens 不是函数
【发布时间】:2019-12-16 00:17:09
【问题描述】:

我在我的一个 React 项目的 Apps.jsx 文件中定义了这个:

... omitted for brevity ...
import {AuthContext, useAuth} from "./context/auth";


function Login (props: RouteComponentProps<TParams>) {
  ... omitted for brevity ...
  const {authTokens, setAuthTokens} = useAuth();

  function postLogin() {
        const url = 'http://localhost:8000/rest-auth/login/';
        const withCredentials = true;
        const method = 'post';
        const data = {"username": userName, "password": password};
        axios.request({url, withCredentials, data, method}).then(
            result => {
                // console.log('Login.postLogin.else result is :', result);
                if (result.status === 200) {
                    setAuthTokens(result.data);
                } else {
                    setIsError(true);
                }
            }); // .catch(e => {console.log('Login.postLogin.catch e is :', e); setIsError(true);});
  }

我得到一个运行时错误

Unhandled Rejection (TypeError): setAuthTokens is not a function
(anonymous function)
C:/Users/plankton/WebstormProjects/mister-neutron/src/App.tsx:93
  90 | result => {
  91 |     // console.log('Login.postLogin.else result is :', result);
  92 |     if (result.status === 200) {
> 93 |         setAuthTokens(result.data);
     | ^  94 |     } else {
  95 |         setIsError(true);
  96 |     }

useAuth 声明如下:

import { createContext, useContext } from 'react';

export const AuthContext = createContext();

export function useAuth() {
    return useContext(AuthContext);
}

【问题讨论】:

    标签: reactjs typescript


    【解决方案1】:

    authTokenssetAuthTokens 在哪里添加到AuthContext

    const AuthContext = createContext()
    
    function useAuth() {
        return useContext(AuthContext)
    }
    
    // useAuth is an empty context, so both authTokens and setAuthTokens are undefined
    const { authTokens, setAuthTokens } = useAuth()
    

    对我来说,它看起来像一个空上下文,因此为什么 authTokenssetAuthTokensundefined,而 undefined 不是一个函数,这就是你收到错误的原因。

    试试这个:

    export const AuthContext = createContext()
    
    export const AuthState = ({ children }) => {
        const [authTokens, setAuthTokens] = useState([])
    
        const value = {
            authTokens,
            setAuthTokens,
        }
    
        return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>
    }
    

    而不是调用useAuth,只需在您的组件中调用useContext

    const { authTokens, setAuthTokens } = useContext(AuthContext)
    

    【讨论】:

    • Doh 阅读您的答案提醒我,我忘记在我的 App 组件中设置上下文,如下所示:&lt;AuthContext.Provider value={{ authTokens, setAuthTokens }}&gt;
    • @Red Cricket 如果我的回答对您有帮助,您是否可以考虑接受它作为最佳答案,以便将问题标记为已解决?谢谢
    猜你喜欢
    • 2019-11-02
    • 2020-04-05
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多