未处理的拒绝 (TypeError):无法解构 'Object(...)(...)' 的 属性 'setUser',因为它未定义

Unhandled Rejection (TypeError): Cannot destructure property 'setUser' of 'Object(...)(...)' as it is undefined

我正在尝试在用户使用 createContext 和 useContext 登录后设置用户令牌。以下是我的代码:

import React, { useState, useContext, createContext } from 'react';
import FormErrors from '../../components/formErrors/formErrors';
import Button from '../../components/button/button'
import axios from 'axios';
import { useHistory } from 'react-router-dom'

export default function () {
    const AppContext = createContext();

    const history = useHistory();
    const {setUser} = useContext(AppContext);
    const [email, setEmail] = useState( '' );
    const [password, setPassword] = useState( '' );
    const [errors, setErrors] =  useState( [] );

    const onSubmit = async event => {
        event.preventDefault();
        setErrors( [] );
        let _errors = []

        if (!email) _errors.push('Email is required');
        if (!password) _errors.push('Password is required');

        if(_errors.length) return setErrors(_errors);

        try {
            const data = {
                email,
                password
            };

            const response = await axios.post('/api/user/login', data);
            setUser(response.data.user);
            localStorage.setItem("token", response.data.token);
            history.push('/');
        } catch (e) {
            setErrors([e.response.data.message]);
        }
        
    };

    return (
        <div className="page">
            <h1 className="page__title">
                Login
            </h1>

            <form onSubmit={onSubmit} className="form">
                {!!errors.length && <FormErrors errors={errors} />}
                <div className="form__group">
                    <label className="form__label">
                        Email 
                    </label>
                    <br></br>
                    <input type="text"
                    className="form__input form__group"
                    value={email}
                    onChange={e => setEmail(e.target.value)}
                    placeholder="johndoe@mail.com"/>
                </div>
                <div className="form__group">
                    <label className="form__label">
                        Password 
                    </label>
                    <br></br>
                    <input type="password"
                    className="form__input form__group"
                    value={password}
                    onChange={e => setPassword(e.target.value)}
                    placeholder="Password..."/>
                </div>

                <Button type="submit">Login</Button>
            </form>
        </div>
    )
}

我不确定为什么我不能在 useContex 中解构 属性 'setUser'。我收到错误消息“未处理的拒绝 (TypeError):无法解构 'Object(...)(...)' 的 属性 'setUser',因为它未定义。”请任何帮助。如果您也能给出一些详细的解释,那将非常有帮助。

问题

const AppContext = createContext(); 需要出现在 外部 组件中,并且组件需要包装在提供 that 的提供程序中上下文。

解决方案

应用上下文

export const AppContext = createContext({
  setUser: () => {},
});

应用程序

const [user, setUser] = React.useState();

...

return (
  <AppContext.Provider value={{ setUser }}> // <-- wrap app with provider can value
    <App />
  </AppContext>
);

以上组件

import React, { useState, useContext, createContext } from 'react';
...
import { AppContext } from '../path/to/AppContext'; // <-- import context

export default function () {
  ...
  const {setUser} = useContext(AppContext); // <-- destructure should work now
  ...

  return (
    <div className="page">
      ...
    </div>
  )
}