@Boris007

Почему useContext выдает ошибку при попытке получить его значения?

Создал отдельный файл для контекста
import { createContext } from 'react'
export const AuthContext = createContext({})


Добавил его в родительский компонент
import { useState } from 'react'
import { Form } from './app.tsx'
import { AuthContext } from './store/context'

export function App() {
    const [currentUser, setCurrentUser] = useState(null)
    return <>
    <AuthContext.Provider value={[currentUser, setCurrentUser]}>
        <Form />
    </AuthContext.Provider>
    </>
}


Но при попытке использовать его в дочернем компоненте
export function Form() {
  const [currentUser, setCurrentUser] = useContext(AuthContext)
  ....
}


Выдает ошибку
Type '{}' must have a '[Symbol.iterator]()' method that returns an iterator.
  • Вопрос задан
  • 172 просмотра
Решения вопроса 1
@HealSpirit
typescript используете?
Если создаете контекст как объект, то и передавать и использовать нужно как объект:
export const AuthContext = createContext({})

<AuthContext.Provider value={{currentUser, setCurrentUser}}>  // тут нельзя использовать квадратные скобки при передаче значения

const {currentUser, setCurrentUser} = useContext(AuthContext) // тут нельзя использовать квадратные скобки при деструктуризации


А если как массив
export const AuthContext = createContext([])

<AuthContext.Provider value={[currentUser, setCurrentUser]}>  // тут нельзя использовать фигурные скобки при передаче значения

const [currentUser, setCurrentUser] = useContext(AuthContext) // тут нельзя использовать фигурные скобки при деструктуризации


Например, для массива фиксированной длинный это выглядело бы так
import {
  createContext,
  useContext,
  useState,
  type FC,
  type Dispatch,
  type SetStateAction,
} from "react";

type TAuthContext = [string | null, Dispatch<SetStateAction<string>> | null];

export const AuthContext = createContext<TAuthContext>([null, null]);

export const Form: FC = () => {
  const [currentUser, setCurrentUser] = useContext(AuthContext);

  return <>1</>;
};

export const App: FC = () => {
  const [currentUser, setCurrentUser] = useState<string | null>(null);

  return (
    <>
      <AuthContext.Provider value={[currentUser, setCurrentUser]}>
        <Form />
      </AuthContext.Provider>
    </>
  );
};


Думаю, как сделать в виде объекта, сами разберетесь
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
deleo99
@deleo99
import { useState } from 'react'
import { Form } from './app.tsx'
import { AuthContext } from './store/context'

export function App() {
    const [currentUser, setCurrentUser] = useState(null)
    return <>
    <AuthContext.Provider value={currentUser, setCurrentUser}> // тут объект толкай, а не массив
        <Form />
    </AuthContext.Provider>
    </>
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы