【问题标题】:React stack navigation , how to pass state without routes反应堆栈导航,如何在没有路由的情况下传递状态
【发布时间】:2020-11-30 18:00:27
【问题描述】:

我有四个组件 A、B、C、D。这些组件中的每一个都有其本地状态。

这些是使用反应堆栈导航堆叠的

现在我喜欢将 A、B 和 C 中的每个局部状态传递给最后一个组件 D。

我不需要给出路线。我已经有使用 prop.navigation.navigate 的路线 onPress,它将我从 A 带到 B 再到 C 到 D。

我只需要将A的状态直接传递给D,将B的状态传递给D,将C的状态传递给D?

谢谢 萨尔

【问题讨论】:

  • 你能把本地状态放在一个共享的祖先中吗?
  • 我是新手,不知道那是什么:)。刚刚google了一下,这将是一个复杂的解决方案。这些组件是独立编写的,需要进行大量更改。
  • 显示到目前为止你尝试过的代码

标签: javascript jquery reactjs react-native react-redux


【解决方案1】:

最终输出:

以下是如何将状态从 A、B、C 传递到 D。 您只需在导航到下一个屏幕路由时将父级的状态作为参数传递给它,然后您可以在route 的帮助下访问这些参数。

import React, { useState } from 'react';
import { Button, View, Text } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';

function A({ navigation }) {
  const [fromA, setFromA] = useState('From A');
  return (
    <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
      <Text>A Screen</Text>
      <Button
        title="Go to B"
        onPress={() => navigation.navigate('B', { fromA: fromA })}
      />
    </View>
  );
}

function B({ navigation, route }) {
  const [fromB, setFromB] = useState('From B');
  const { fromA } = route.params;
  return (
    <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
      <Text>A Screen</Text>
      <Button
        title="Go to C"
        onPress={() => navigation.navigate('C', { fromA: fromA, fromB: fromB })}
      />
    </View>
  );
}

function C({ navigation, route }) {
  const [fromC, setFromC] = useState('From C');
  const { fromA, fromB } = route.params;
  return (
    <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
      <Text>A Screen</Text>
      <Button
        title="Go to D"
        onPress={() =>
          navigation.navigate('D', { fromA: fromA, fromB: fromB, fromC: fromC })
        }
      />
    </View>
  );
}

function D({ navigation, route }) {
  const { fromA, fromB, fromC } = route.params;
  return (
    <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
      <Text>D Screen</Text>
      <Text>From Screen A: {fromA}</Text>
      <Text>From Screen B: {fromB}</Text>
      <Text>From Screen C: {fromC}</Text>
    </View>
  );
}
const Stack = createStackNavigator();

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator initialRouteName="A">
        <Stack.Screen name="A" component={A} />
        <Stack.Screen name="B" component={B} />
        <Stack.Screen name="C" component={C} />
        <Stack.Screen name="D" component={D} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

export default App;

Expo Snack 上的实时应用示例

您可以在此处阅读完整文档:Passing parameters to routes

【讨论】:

  • 感谢科坦。很抱歉没有提供代码,因为它们太长了。是的,它应该工作。一些更概念性的问题。所有三个组件 A、B、C 都有很多状态变量。这使得代码臃肿。如果我将所有状态从一个组件复制到另一个组件?但它应该可以工作。其次,您的意见是,我喜欢从组件 D 应用 redux,因为 A、B、C 是我不希望在那里使用 redux 的用户界面。这似乎是正确的策略吗?比
  • 如果你有很多数据需要在许多组件之间共享,那么使用状态管理,无论是 redux,上下文都是可取的。 PS:我不太喜欢使用 redux :P。我发现大部分时间都绕着头走很复杂。
  • 在所有四个组件中,数据不共享。在组件D,也就是提交组件,数据只需要发送到数据库。所以 A、B、C 不共享数据。我正在将数据从 A、B、C 带到 D 以在 D 级别实现 redux,但数据不共享
  • 所以当前的解决方案应该可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
相关资源
最近更新 更多