我对上下文api有基本的疑问。我们可以在context.provider之外使用Context.consumer组件吗?
我有一个组件,其中两个选择标签具有相同的选项。我包裹第一与上下文提供选择和获取的数据作为例如,
<DataProvider loadRestarantsOnWillMount {...this.context}>
<select className="select_Restaurent float-right "
defaultValue=""
>
<option>All Restaurants</option>
<DataContext.Consumer>
{({ restarants }) => {
return (
restarants &&
restarants.map((r, idx) => (
<option value={r.id} key={String(idx)}>
{r.name}
</option>
))
);
}}
</DataContext.Consumer>
</select>
</DataProvider>
现在,第二个选择标记位于引导程序模式中,为了获取重新生成列表,我尝试将这个选择与context.consumer包装在一起,
<DataContext.Consumer>
{({ restarants }) =>
restarants &&
restarants.map((r, idx) => (
<option value={r.id} key={String(idx)}>
{r.name}
</option>
))
}
</DataContext.Consumer>
但不要在这里引起批评。
上下文是在单独的文件中定义的,并且restarant是从api的DataProvider组件的onComponentWillmount加载的,
如果我再次用<DataProvider>
包装第二个使用者,我认为将会再次发生不必要的api调用。
那么,我可以在提供者之外吸引消费者吗?还是我应该将整个页面都包裹在<DataProvider>
中?我想避免这种情况,只是为了两个小的选择标签。
顺便说一下,整个组件已经设置了另一个static contextType
上下文,所以我不能使用Datacontext作为组件上下文。