所以我要在react中获取数据,并且我想在来自父母的上下文中作为响应传递响应中的单个值,trendingData来自api调用中的响应。代码:
if (loading) return <Loading />;
return (
<VidoesContainer>
<TopBar />
<FitnessChallenge />
<MainContainer>
<Category categoryData={trendingData} />
<Trainers />
</MainContainer>
</VidoesContainer>
);
趋势数据的初始值未定义,趋势数据在反应导航中传递到屏幕堆栈。我想在这样的上下文中使用它:
const CategoryScreenStack = ({ categoryData }) => {
return (
<CategoryContext.Provider value={categoryData}>
<Stack.Navigator initialRouteName='Category'>
<Stack.Screen name='Category' component={Category} />
<Stack.Screen
name='Video'
options={{
transitionSpec: {
open: TransitionSpecs.FadeInFromBottomAndroidSpec,
close: TransitionSpecs.FadeOutToBottomAndroidSpec,
},
}}
component={Video}
/>
</Stack.Navigator>
</CategoryContext.Provider>
);
};
但是我得到一个错误:当我只想避免在每个屏幕上钻取道具时,undefined不是一个对象(评估'_useContext.name')。如何将道具从父母作为背景传递给孩子?
答案 0 :(得分:0)
[编辑] 在再次阅读您的问题后,它没有回答,而且非常愚蠢,因为您可能已经在子组件中使用了钩子。
现在,您似乎正在尝试访问未定义的属性name
,因此请确保您的数据在上下文中可用。这是我要处理的方式:
export const App = () => {
const [trendingData, setTrendingData] = useSate(undefined);
useEffect(() => {
fetch('...').then((response) => {
setTrendingData(response.someData);
});
});
const loading = trendingData === undefined;
if (loading) return <Loading />;
return (
<VidoesContainer>
<TopBar />
<FitnessChallenge />
<MainContainer>
<Category categoryData={trendingData} />
<Trainers />
</MainContainer>
</VidoesContainer>
);
};
该想法是在您的条件下添加趋势数据以呈现或不呈现组件。在这里,我只是通过一个简单的条件来表示它,您将不得不按照自己的方式进行调整。同样的效果也发挥了作用,我在内部进行了访存,但只是对其进行了调整或提供了更多的代码,以便使我更加精确。
希望它会有所帮助:)
我认为您需要在API调用后分派TrendingData。这样,您将可以将其用作常规上下文值。您可以利用useContext():
[state, dispatch] = useContext(CategoryContext);
这样,您将可以访问自己的状态。它可以在需要使用状态或向其分配新数据的每个无状态组件中完成。当然,您将需要减速器。
如果您不知道我在说什么,我强烈建议您看看The official documentation aboutHooks