使用React Navigation访问Redux状态

时间:2017-02-20 00:08:15

标签: javascript reactjs react-native

我使用React-Navigation使用以下导航器:

const Navigator = StackNavigator(
  {
    Home: {
      screen: Home
    },
    User: {
      screen: User
    }
  }
)

我的User组件:

export default class User extends Component {
  static navigationOptions = {
    title: () => 'User'
  }

  render() {
    return (
      <Text>This is the user page.</Text>
    )
  }
}

我希望User场景导航栏的标题是用户名。该名称保持在Redux状态。

由于我正在访问User场景中的Home场景,因此我可以在推送场景时传递用户名称:

this.props.navigation.navigate('User', {name: user.name})

但是,如果在User上更新了用户名,则导航标题将不会更新。我能看到的唯一解决方案是从navigationOptions内访问Redux状态。有没有办法做到这一点或更好的方法来处理这个问题?感谢。

2 个答案:

答案 0 :(得分:5)

我在issue的反应导航GitHub回购中找到了2个答案。

1)每次道具更改时都更新this.props.navigation.state:

componentWillReceiveProps(nextProps) {
  if (nextProps.totalCharge) {
    this.props.navigation.setParams({ totalCharge });
  }
}

2)创建连接到Redux状态的NavigationTitle组件:

static navigationOptions = {
  title: (navigation) => <MyConnectedTitle navigation={navigation} />
}

答案 1 :(得分:1)

我假设你正在打电话

this.props.navigation.navigate('User', {name: user.name})

来自组件。因此,您应该在组件中mapStateToProps使用用户的名称,然后将其作为{name: ...变量传递。

例如:

export class Component {
  render() {
    return (
      <View>
        <Button onPress={() => this.props.navigation.navigate('User', {name: this.props.userName})}
      </View>
    )
  }
}

const mapStateToProps = (state) => ({
  userName: state.user.name
})

export default connect(mapStateToProps)(Component)