React Navigation 参数不会重置

IT技术 javascript reactjs react-native react-navigation
2021-05-21 10:26:50

我在 React Native 中将导航参数重置为 null 时遇到问题。

MainTab
-- Home (stack)
-- Misc (stack)
-- Tips (stack)

在“主页”选项卡上,我有一个按钮可以转到“其他”,但我想转到“其他”的“提示”选项卡。
路由应该看起来像 - (Home -> Tips -> Misc)
该按钮返回以下参数 -

this.props.navigation.navigate('Tips', {backRoute: 'Home', routeImGoingNext: 'Misc'});

传递这些参数后,我会根据从“主页”选项卡上的按钮传递的 backRoute 和 routeImGoingNext 参数,在“提示”屏幕的导航上呈现后退按钮和跳过按钮。

if(navigation.state.params && navigation.state.params.backRoute){
  return {
    headerLeft: (<HeaderBackButton onPress={()=>navigation.navigate(navigation.state.params.backRoute)}/> ),
    headerRight: (
      <TouchableOpacity onPress={()=>navigation.navigate(navigation.state.params.routeImGoingnext)}>
        <Text style={{paddingRight: 10}}> Skip </Text>
      </TouchableOpacity>
    )
  }
}

在单击“主页”选项卡上的按钮后单击“提示”选项卡时,会出现我的问题。参数仍然设置,因此呈现后退按钮和跳过按钮,但如果我单击“提示”选项卡,就不应该有这些按钮。

关于如何在手动单击选项卡时重置参数的任何想法?

4个回答

我能够通过手动创建一个函数并设置传递给 null 的参数来清除参数。当标题按钮被按下时调用 clearParams 函数。

static navigationOptions = ({navigation}) => {

  clearParams = () => {
    navigation.setParams({backRoute: null, routeImGoingNext: null})
  }

  if(navigation.state.params && navigation.state.params.backRoute){  

    const { backRoute, routeImGoingNext } = navigation.state.params;

    return {
      headerLeft: (<HeaderBackButton onPress={()=>{navigation.navigate(backRoute), clearParams()}}/> ),
      headerRight: (
        <TouchableOpacity onPress={()=>{navigation.navigate(routeImGoingNext), clearParams() }}>
          <Text style={{paddingRight: 10}}> Skip </Text>
        </TouchableOpacity>
      )
    }
  }
 return;
}

使用它来清除参数 react navigation

this.props.navigation.setParams({YOUR_PARAMS: null});

我也遇到了这个问题,我在文档中发现参数是浅合并的,所以如果你有一些来自以前导航的婴儿车,然后你用不同的参数导航到同一个屏幕,那么它们将被合并。这是文档的链接https://reactnavigation.org/docs/params 快速示例将是:

navigation.navigate('Receipt', {id: '001', eventId: 'eventIdMock');

从另一个屏幕,如果我使用此参数导航到 Receipt:

navigation.navigate('Receipt', {id: '002'});

那么导航仍然会有eventId: 'eventIdMock' 所以解决方案是将此值显式设置为nullundefined

navigation.navigate('Receipt', {id: '002', eventId: null});

在此处输入图片说明

这对我有用,直接来自文档。请注意,这会重置整个导航状态(props/路线/参数等...)。就我而言,这很好。

https://reactnavigation.org/docs/navigation-prop/

    props.navigation.reset({
        index: 0,
        routes: [{name: "Screen you need to go back to"}]
    });

我的应用程序是一个简单的 3 屏幕应用程序,使用 react 导航“底部选项卡导航器”进行本机react。我的所有组件都是功能组件,因此我没有使用文档这一部分中的任何类型的导航操作:https : //reactnavigation.org/docs/navigation-actions

请参阅下面的堆栈导航。在上面的代码片段中, index: 0 将是下面的屏幕名称“SetGame”。索引:1 是“PlayGame”,索引:2 是“历史”。在我的情况下,我导航回索引 0,即“SetGame”并在导航状态对象中重置路线/参数/历史记录。

    <Tab.Navigator
  initialRouteName="Find"
  tabBarOptions={{
    tabStyle: {
      backgroundColor: '#76B947',
      height: 90,
      paddingBottom: 30,
      margin: 0,
    },
    style: {
      height: 90,
    },
    activeTintColor: '#292929',
    inactiveTintColor: '#ededed',

  }}
>
  <Tab.Screen
    name="SetGame"
    component={SetGame}
    options={{
      tabBarIcon: ({ color }) => (
        <Feather name={'list'} size={25} color={color} />
      ),
    }}
  />
  <Tab.Screen
    name="PlayGame"
    component={PlayGame}
    options={{
      tabBarIcon: ({ color }) => (
        <Feather name={'play'} size={25} color={color} />
      ),
    }}
  />
  <Tab.Screen
    name="History"
    component={GameHistory}
    options={{
      tabBarIcon: ({ color }) => (
        <Feather name={'save'} size={25} color={color} />
      ),
    }}
  />
</Tab.Navigator>

在我的 PlayGame 组件内的应用程序中,有一个 goBackToSetGame 函数。这意味着我们要重置我们的游戏,清除数据库中的数据并重置导航状态。本质上是禁止用户玩游戏,直到它被再次设置。

    const goBackToSetGame = async () => {
    const gameInputs = {
      email: user.profile.email,
      players: [],
      holes: [],
      names: [],
      createdAt: Date.now(),
      gameStatus: "not-playing",
      scores: [{}]
    }

    await API.QuitGame(gameInputs).then((res) => {
      // reset scores state if the game is quit
      setScores(null);
      console.log("Changed gameStatus from server response: ", 
    res.data)
    })
    .catch(err => console.log(err));

    // reset props.navigation so you have to 
    // start a new game before coming back to this screen
    props.navigation.reset({
      index: 0,
      routes: [{name: "SetGame"}]
    });
 }