【问题标题】:React Native - how can I pass a function to a stack screen in a navigator?React Native - 如何将函数传递到导航器中的堆栈屏幕?
【发布时间】:2020-06-03 23:44:32
【问题描述】:

我有这个导航器,在模态框内有不同的屏幕。要关闭模式,需要按下按钮来激活 setState 功能。现在的问题是关闭整个模式的按钮位于堆栈屏幕之一内。请我如何将功能作为道具从父级传递到屏幕。以下是我的代码的摘要。谢谢。

//Parent.js

    const [state, setState] = useState(false)
            <Stack.Navigator
                initialRouteName="Screen1"
                screenOptions={{
                    headerShown: false
                }}
             setState={setState}
            >
                <Stack.Screen name="Screen1" component={Screen1} />
                <Stack.Screen name="Screen2" component={Screen2} />
            </Stack.Navigator>

//Screen1.js

export default Screen1 = ({setState})=>{
  return (
   <View>
      <Button title={Press me} onPress={()=>{
        setState(false)}} />
   </view>
   )
}

【问题讨论】:

    标签: reactjs react-native


    【解决方案1】:

    您可以将其作为初始参数传递,如下所示

      <Stack.Screen
        name="Home"
        component={HomeScreen}
        initialParams={{ setState: setState }}
      />
    

    然后像下面这样访问它

    function HomeScreen({ navigation, route }) {
      return (
        <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
          <Button
            title="setState"
            onPress={() => route.params.setState(false)}
          />
        </View>
      );
    }
    

    但对于复杂的场景,最好考虑基于上下文的实现。

    【讨论】:

    • initialParams={{ setState: setState }} 不是 initialParams={{ setState: state}} 吗?我不知道。只是感觉有点有线。
    • 当我这样通过时没有工作,就像样式道具一样,我猜这也需要一个对象
    • 感谢@GuruparanGiritharan。它似乎有效,但我收到一个黄色标志警告“在导航状态中发现了不可序列化的值......”。有没有更好的方法来处理这个问题,或者我应该忽略警告?
    • 当您将函数作为参数传递时会发生这种情况,目前还没有解决方案github.com/react-navigation/react-navigation/issues/6827
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 2022-10-07
    • 2022-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多