Я пытаюсь выучить ContextAPI в новом примере проекта реагировать + машинопись.
Я хочу управлять локалью / аутентификацией.
Мне нужно инициализировать значения моего контекста (требуется Typescript/ eslint), специально для входа в систему / выхода из системы, или произошла ошибка в «App.tsx»: «не может вызвать объект, который возможно неопределен».
Правильно, я попытался инициализировать свой контекст следующим образом:
const AuthContext = React.createContext<ContextProps>({
...initialState,
login: () => {
throw new Error("login() not implemented yet");
},
logout: () => {
throw new Error("logout() not implemented yet");
}
});
Проблема теперь, когда я определяю функцию входа в систему / выхода из системы и передаю ее провайдеру в качестве значения, моя кнопка выдает ошибку «Логин еще не реализован».
Вот мой код:
// ./App.tsx
import React from "react";
import { NavItem, Button } from "reactstrap";
import * as Context from "./contexts";
const App = () => {
return (
<Context.Language.Consumer>
{({ locale, translation, switchLocale }) => (
<Context.Auth.Consumer>
{Auth => (
<NavItem right>
{Auth.isLoggedIn ? (
<Button onClick={() => Auth.logout()}>
{translation.logout}
</Button>
) : (
<Button onClick={() => Auth.login()}>
{translation.login}
</Button>
)}
</NavItem>
)}
</Context.Auth.Consumer>
)}
</Context.Language.Consumer>
);
};
export default App;
-
// ./contexts/AuthContext.tsx
import React, {Component} from "react";
type ContextProps = {
isLoggedIn: boolean;
login: () => void;
logout: () => void;
};
const initialState = { isLoggedIn: false };
type Props = {};
type State = {} & typeof initialState;
const AuthContext = React.createContext<ContextProps>({
...initialState,
login: () => {
throw new Error("login() not implemented yet");
},
logout: () => {
throw new Error("logout() not implemented yet");
}
});
class AuthProvider extends Component<Props, State> {
readonly state = initialState;
login = () => {
this.setState({
isLoggedIn: true
});
};
logout = () => {
this.setState({
isLoggedIn: false
});
};
render() {
return (
<AuthContext.Provider
value={{...this.state, login: this.login, logout: this.logout}}
>
{this.props.children}
</AuthContext.Provider>
);
}
}
export const Consumer = AuthContext.Consumer;
export const Provider = AuthProvider;
И наконец:
// ./contexts/index.js
import * as Auth from "./AuthContext";
import * as Language from "./LanguageContext";
export { Auth, Language };
Кажется, что новое определение входа / выхода не передается поставщику в AuthContext.Я почти уверен, что мне не хватает концепции из ContextAPI, и я не понял правильную логику.Спасибо за ваши советы.