通过导航器传递状态

时间:2015-11-25 11:19:49

标签: javascript reactjs react-native

我正在使用React Native核心导航器组件,但在按导航栏中的按钮时无法确定如何在组件之间传递数据。这是我的设置的一些示例代码。

const NavigationBarRouteMapper = {
  Title: (route, navigator) => {
    let title;
    switch (route.component.displayName) {
      case 'FirstScreen':
        title = 'First Screen';
        break;
    }

    return (
      <Text>
        {title}
      </Text>
    )
  },
  LeftButton: (route, navigator) => {
    let onButtonPress, buttonTitle;
    switch (route.component.displayName) {
      case 'SecondScreen':
        buttonTitle = 'Close';
        onButtonPress = () => navigator.pop();
        break;
    }

    return (
      <TouchableOpacity
        onPress={onButtonPress}>
        <Text>
          {buttonTitle}
        </Text>
      </TouchableOpacity>
    )
  },
  RightButton: (route, navigator) => {
    let onButtonPress, buttonTitle;
    switch (route.component.displayName) {
      case 'SecondScreen':
        buttonTitle = 'Save';
        onButtonPress = () => {}; // @TODO Call onButtonPress in SecondScreen component
        break;
    }

    return (
      <TouchableOpacity
        onPress={onButtonPress}>
        <Text>
          {buttonTitle}
        </Text>
      </TouchableOpacity>
    );
  }
};

const App = React.createClass({
  renderScene(route, navigator) {
    return <route.component navigator={navigator} {...route.props} />;
  },
  render() {
    return (
      <Navigator
        style={styles.appContainer}
        initialRoute={{component: SplashScreen}}
        renderScene={this.renderScene}
        navigationBar={
          <Navigator.NavigationBar
            routeMapper={NavigationBarRouteMapper}
          />
        }
      />
    );
  }
});

const FirstScreen = React.createClass({
  onButtonPress() {
    this.props.navigator.push({component: SecondScreen});
  },
  render() {
    return (
      <View>
        <TouchableHighlight onPress={this.onButtonPress}>
          <Text>
            Click Me
          </Text>
        </TouchableHighlight>
      </View>
    );
  }
});

const SecondScreen = React.createClass({
  getInitialState() {
    return {
      input: ''
    }
  },
  onButtonPress() {
    if (this.state.input.length) {
      // Do something with this.state.input such as POST to remote API
      this.props.navigator.pop();
    }
  },
  render() {
    return (
      <View style={styles.container}>
        <TextInput
          onChangeText={(input) => this.setState({input})}
          value={this.state.input}
        />
      </View>
    );
  }
});

您可以从评论中看到,我有一个存储在SecondScreen状态的值,当有人点击“保存”按钮时,我想要执行某些操作。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在你的renderScene函数中,返回&#39; route.component&#39;你可以传递道具并在组件中阅读它们。