如何将道具从父母作为背景传递给孩子?

时间:2020-04-27 01:12:43

标签: javascript reactjs react-context

所以我要在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')。如何将道具从父母作为背景传递给孩子?

1 个答案:

答案 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