#javascript #reactjs #gatsby #react-context
#javascript #reactjs #gatsby #реагировать-контекст
Вопрос:
В настоящее время работает над проектом Gatsby и пытается внедрить i18n / internationalization. Я хочу обслуживать английскую и французскую версии моего сайта.
Я следую вместе с этим руководством по реализации этого. Я сталкиваюсь с проблемой, когда дело доходит до использования Context API для создания контекста и передачи его моим компонентам. В руководстве, которому я следую, есть странный синтаксис, в котором я не уверен:
const PageContext = React.createContext<PageContextValue>({})
Вот полный компонент, в котором контекст создается с помощью createContext
:
import React from 'react'
import { useTranslation } from 'react-i18next'
const PageContext = React.createContext<PageContextValue>({})
export const PageContextProvider = ({ pageContext, children }) => {
const { i18n } = useTranslation()
i18n.changeLanguage(pageContext.lang)
return <PageContext.Provider pageContext={pageContext}>{children}</PageContext.Provider>;
}
export const usePageContext = () => React.useContext(PageContext)
Это приводит к следующей ошибке:
Что вызывает эту ошибку? Я мало что знаю о Context API, но React.createContext<PageContextValue>({})
синтаксис выглядит странно и выдает ошибку.
Комментарии:
1. Синтаксис typescript / flow, предполагающий, что вы его не используете, поэтому вам следует просто удалить его
2. Я не использую Typescript. Как я могу переписать эту строку, чтобы она работала без использования Typescript?
Ответ №1:
createContext
Это универсальный метод, поэтому PageContextValue
это тип значения вашего контекста. Похоже, что в руководстве не определено это значение (что, на мой взгляд, является проблемой), но вы могли бы сделать это с помощью:
type PageContextValue = {
// Your type definition here
}
Однако typescript достаточно умен, чтобы определить сам тип, поэтому вы можете просто создать контекст:
const PageContext = React.createContext({})
Обратите внимание, что тип является статическим после его определения, поэтому, если вы действительно передадите {}
, это будет тип set, и вы не сможете фактически добавлять значения в свой контекст, иначе вы получите ошибки typescript. Поэтому убедитесь, что:
- Либо определите тип, как показано выше
- Или добавьте значения по умолчанию при создании контекста, чтобы убедиться, что typescript выводит его правильно, например:
const PageContext = React.createContext({counter: 0})
это позволило бы вам получить доступcounter
к вашему контексту позже без ошибок.
Редактировать: Только что выяснил, что вы не используете typescript. Опубликованный вами учебник написан на typescript! Вы наткнетесь на еще больше ошибок, если продолжите использовать его синтаксис, поэтому я предлагаю вам просто использовать typescript для вашего проекта. Но только для этой ошибки ее можно исправить, удалив универсальный тип ( <PageContextValue>
)
Комментарии:
1. Спасибо за предупреждение. Просматривая код руководства, я не вижу большого количества TS в других файлах. Будет ли практичной адаптация обучающего кода?
2. После быстрого просмотра руководства я нашел только еще одну аннотацию типа typescript:
SEO: React.FC<SEOProps>
. Если вы удалите,: React.FC<SEOProps>
вы должны быть готовы к работе, но, возможно, я что-то пропустил. Я не хочу критиковать то, что я не полностью прочитал, но на первый взгляд это не кажется очень странным и неполным руководством по смешиванию JS и TS, даже не упоминая об этом.3. Я поработал с ним и заставил его работать. Спасибо за помощь, я ценю ее.