React.createContext точка defaultValue?

На Страница контекстной документации React 16 у них есть примеры, похожие на это:

const defaultValue = 'light';
const SomeContext = React.createContext(defaultValue);

const startingValue = 'light';
const App = () => (
  <SomeContext.Provider theme = {startingValue}>
    Content
  </SomeContext.Provider>
)

Кажется, что defaultValue бесполезен, потому что, если вы вместо этого установите startingValue на что-нибудь еще или не установите его (это undefined), он переопределит его. Это нормально, так и должно быть.

Но в чем тогда смысл defaultValue?

Если я хочу иметь статический контекст, который не меняется, было бы неплохо иметь возможность просто сделать следующее, и просто позволить Провайдеру пройти через defaultValue

const App = () => (
  <SomeContext.Provider>
    Content
  </SomeContext.Provider>
)
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
51
0
23 489
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если Provider отсутствует, для функции createContext используется аргумент defaultValue. Это полезно для изолированного тестирования компонентов без упаковки или тестирования с разными значениями от Provider.

from responsejs.org/docs/context.html#reactcreatecontext: «Аргумент defaultValue используется только в том случае, если компонент не имеет соответствующего Provider над ним в дереве. Это может быть полезно для изолированного тестирования компонентов без их упаковки. Примечание: передача undefined в качестве значения Provider не вызывает потребления компоненты для использования defaultValue. "

papiro 02.01.2019 16:30

Если вы хотите создать синглтон в своем приложении, рекомендуется ли предоставлять только поставщика контекста (он всегда будет возвращать значение по умолчанию)?

Moebius 30.09.2019 17:02

Так что это снова взлом на вершине взлома.

Ievgen Naida 04.08.2020 12:23

так зол на это ... так что есть ДВА значения по умолчанию, которые используются в зависимости от того, правильно ли настроен провайдер. скажите, что провайдер не настроен должным образом, вы получите значение по умолчанию, а не начальное значение, и скажите, почему это неправильно

Muhammad Umer 04.02.2021 18:15

Мои два цента:

Прочитав эта поучительная статья Кента К. Доддса, как обычно :), я узнал, что defaultValue полезно, когда вы деструктурируете значение, возвращаемое useContext:

Определите контекст в одном углу кодовой базы без defaultValue:

const CountStateContext = React.createContext() // <-- define the context in one corner of the codebase without defaultValue

и используйте его так в компоненте:

const { count } = React.useContext(CountStateContext)

JS явно скажет TypeError: Cannot read property 'count' of undefined

Но вы можете просто не делать этого и вообще избегать значения defaultValue.

Что касается тестов, мой учитель Кент прав, когда говорит:

The React docs suggest that providing a default value "can be helpful in testing components in isolation without wrapping them." While it's true that it allows you to do this, I disagree that it's better than wrapping your components with the necessary context. Remember that every time you do something in your test that you don't do in your application, you reduce the amount of confidence that test can give you.

Дополнительно для TypeScript; если вы не хотите использовать defaultValue, легко угодить ворсу, выполнив следующие действия:

const MyFancyContext = React.createContext<MyFancyType | undefined>(undefined)

Вам нужно только обязательно добавить дополнительные проверки позже, чтобы убедиться, что вы охватили случаи, когда MyFancyContext === undefined

  • MyFancyContext ?? 'По умолчанию'
  • MyFancyContext? .NotThatFancyProperty

так далее

Другие вопросы по теме