如何将字符串传递到屏幕上的BottomTabNavigator

时间:2019-04-21 17:23:48

标签: react-native react-navigation

我有一个带有4个sreens的BottomTabNavigator,我想将一个字符串传递给其中的一些。

我该怎么做?谢谢。

class Main extends Component {
    static navigationOptions = {
        title: 'Developpe Inclinné',
        headerTintColor: '#fff',
        headerStyle: {
            backgroundColor: '#e8142d',
        },
    };
    render() {
        const myPath='aRouteForFirebase'
        return (
            <AppContainer myPath={myPath} />
        );
    }
}
const TabNavigator = createBottomTabNavigator({
    DeveloppeInclinne,
    Chrono,
    Session, // needs the props
    Resultats // // needs the props
})

const AppContainer = createAppContainer(TabNavigator);

4 个答案:

答案 0 :(得分:1)

我在支持此功能的react-navigation文档中找不到任何内容。但是我可能是错的。我可以建议另一种方式。创建一个HOC并用它包装您的组件。他们都将有权访问公共字符串。

const SomethingCommonHOC = (Component, extraProps ) => {

  return class SomeComponent extends React.Component {
    render() {
      return <Component {...this.props} {...extraProps}/>;
    }
  };
};
// Use it something like this.
SomethingCommonHOC(Session);

谢谢

编辑:我知道实际上很难解释。这就是我不喜欢HOC的原因。 :)。我将尽力为您解释所需的修改。

Create a new file: 

Put this component definition in it:
const CommonHOC = (Component, extraProps) => {

      return class SomeComponent extends React.Component {
        render() {
          return <Component {...this.props} {...extraProps} />;
        }
      };
    };
export default CommonHOC

Then import it in your component files , in your case DeveloppeInclinne, Chrono, Session, Resultats.

在需要传递通用字符串的组件中:假设您正在会话组件文件中进行编辑

 import CommonHOC from the "path to CommonHOC"

    export default CommonHOC(Session, {
 myString: "myString"
})

注意:您可以通过将对象的第二个参数转换并传播到公共组件内来像常量动态字符串一样

答案 1 :(得分:1)

仅作说明:

class Main extends Component {
  static navigationOptions = {
    title: 'Developpe Inclinné',
    headerTintColor: '#fff',
    headerStyle: {
        backgroundColor: '#e8142d',
    },
  };
  render() {
    const myPath='aRouteForFirebase'
    const TabNavigator = createBottomTabNavigator({
      DeveloppeInclinne,
      Chrono,
      Session: { screen: () => <Session myPath={myPath} />},
      Resultats { screen: () => < Resultats myPath={myPath} />}
    }
    const AppContainer = createAppContainer(TabNavigator);
    return (
        <AppContainer />
    );
  }
}

但是我认为这不是好看的代码,也许您应该考虑集成Redux

答案 2 :(得分:1)

这是一个更好的实现方式:

class Main extends Component {
  constructor(props) {
    super(props)
    this.state = {
      myPath: 'aRouteForFirebase',
    }
    this.AppContainer = createAppContainer(this.TabNavigator)
  }

  TabNavigator = createBottomTabNavigator({
    DeveloppeInclinne,
    Chrono,
    Session: { screen: () => <Session myPath={this.state.myPath} />},
    Resultats { screen: () => < Resultats myPath={this.state.myPath} />}
  })

  render() {
    const { AppContainer } = this
    return (
      <AppContainer />
    )
  }
}

答案 3 :(得分:0)

您可以这样做:

const TabNavigator = createBottomTabNavigator({
   DeveloppeInclinne,
   Chrono,
   Session: { screen: props => <Session {...props} />},
   Resultats { screen: props => < Resultats {...props} />}
}

// in class Session ...
console.log(this.props.myPath)
=> aRouteForFirebase