【问题标题】:Is there anyway to re-render navation bar without calling setParams (react-navigation)?无论如何都可以在不调用 setParams (react-navigation) 的情况下重新渲染导航栏?
【发布时间】:2017-10-10 08:30:32
【问题描述】:

我正在为我的应用程序实现多语言功能,但在更改反应导航标题标题时遇到了困难(使用反应导航)。我不想在每个屏幕中调用 setParams 来根据所选语言更改标题。

这是我的堆栈:

Home -> Settings -> App Settings -> Language Settings.

我在Language Setting 屏幕上选择语言。按导航栏上的默认返回按钮返回后,App Settings 屏幕中的static navigationOptions 被调用(这是我根据当前语言设置标题的地方)即使我不调用 setParams(),我不知道为什么它没有重新渲染 => 标题没有改变。

有没有办法解决这个问题?


嗨@JavaEvgan 这是我的代码:

    <AppNavigator navigation={addNavigationHelpers({
      dispatch: this.props.dispatch,
      state: this.props.navigationState
    })}/>

连接到 redux 商店

export default connect(state => ({
  navigationState: state.navigationState,
}), dispatch => ({
  dispatch: dispatch
}))(MainLayoutContainer)

【问题讨论】:

  • 你不使用 Redux 和 react 吗?您可以在 reducer 中创建 initialState 并根据选择的语言选项进行更改。
  • 是的,我正在使用 react-redux。我可以根据语言更改屏幕的内容,但反应导航不会改变。即使 redux 存储发生变化,React-navigation 标头也不会重新渲染
  • 您能否提供您的导航组件的代码我相信您可能正在使用带有道具的构造函数而不是来自 Redux 的道具。
  • 我刚刚添加了有问题的代码。我可以向navigationState 减速器发送操作以执行pushpop 进行导航。
  • 那么你的 AppNavigator 组件呢,它看起来怎么样?

标签: javascript reactjs react-native react-redux react-navigation


【解决方案1】:

我找到了解决方案,使用 screenProps 将额外的信息传递给孩子 https://reactnavigation.org/docs/navigators/stack#Navigator-Props

    <AppNavigator
      screenProps={this.props.settings}
      navigation={addNavigationHelpers({
      dispatch: this.props.dispatch,
      state: this.props.navigationState
    })}/>

并将其连接到 redux 商店

export default connect(state => ({
  settings: state.settings,
  navigationState: state.navigationState,
}), dispatch => ({
  dispatch: dispatch
}))(MainLayoutContainer)

像这样,static navigationOptions 每次更改商店设置时都会被调用并重新渲染

【讨论】:

    【解决方案2】:

    刚刚从原始文档中为您找到了一个解决方案,而且非常简单。您只需为不同的语言版本和一个父组件创建两个(或更多)导航组件。在父组件中,您将需要使用“条件渲染”(if 语句)并根据您的状态返回正确的导航。查看条件渲染的原始文档:

    ReactJS docs - Conditional rendering

    来自文档:

    考虑这两个组件:

    function UserGreeting(props) {
      return <h1>Welcome back!</h1>;
    }
    
    function GuestGreeting(props) {
      return <h1>Please sign up.</h1>;
    }
    

    我们将创建一个 Greeting 组件,根据用户是否登录来显示这些组件中的任何一个:

    function Greeting(props) {
      const isLoggedIn = props.isLoggedIn;
    if (isLoggedIn) {
      return <UserGreeting />;
    }
      return <GuestGreeting />;
    }
    
    ReactDOM.render(
      // Try changing to isLoggedIn={true}:
      <Greeting isLoggedIn={false} />,
      document.getElementById('root')
    );
    

    Try it on CodePen.

    此示例根据 prop 中 isLoggedIn 的值呈现不同的问候语

    【讨论】:

    • 所以如果我需要支持 10 种语言,我已经创建了 10 个导航器?我不认为这是一个很好的理想
    • 我认为你必须这样做。或者您必须在 AppNavigator 组件中添加 if 语句,该语句将检查当前语言版本的状态并粘贴相同但更“不舒服”的正确文本。
    • 您能否提供您的 AppNavigator 组件的代码。我还建议您使用 之类的道具将您的状态传递给它,然后在 AppNavigator 控制器中使用它,就像普通道具 this.props.navstate
    • 您还可以使用 props 将需要翻译的值传递给 Nav 组件。在您的导航中,只需使用它们来显示文本。因此,您将根据语言设置传递不同的值,而无需创建多个导航组件。
    • 看起来很复杂。为什么不function Greeting(props) { const isLoggedIn = props.isLoggedIn; if (isLoggedIn) { return &lt;h1&gt;Welcome back!&lt;/h1&gt;; } return &lt;h1&gt;Please sign in.&lt;/h1&gt;; }。大大减少了代码行数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 2018-03-27
    • 2014-04-02
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多