children
здесь означает рендеринг всего, что передается между тегами <ProviderWrapper>
, что в вашем случае является <SomeComponent2 />
Насколько вы думаете о том, что someObj
доступен в качестве реквизита для SomeComponent2, обеспокоен, вы не должны передавать {someObj}
в значение prop <SomeContext.Provider>
, которое вы должны рассматривать как компонент, содержащий данные, и когда вы используете useContext
, он будет передавать эти данные компоненту, использующему его
Думайте об этом как о компоненте Provider
в react-redux, если бы вы использовали redux. В redux для доступа к любому значению redux в компоненте, который вы используете connect
с mapStateToProps
, useContext
здесь играет аналогичную роль
Реализация вышеуказанного logi c может быть выполнена без контекста, но использование реквизита рендеринга, так что SomeComponent2
передается someObj
как реквизит, как показано ниже
function ProviderWrapper ({children}) {
const someObj = { 'something': 'someValue' }
return children({someObj});
}
const SomeComponent2 = (props) => {
console.log('props', props)
return null
}
function App() {
return (
<ProviderWrapper>
{(props) => <SomeComponent2 {...props}/>}
</ProviderWrapper>
);
}
Однако ограничение вышеупомянутого logi c заключается в том, что он может передавать реквизиты напрямую детям . Чтобы получить доступ к реквизитам на вложенном уровне, вам нужно пройти их полностью вниз.